Test the realtime GC, via long running process in a shared object, without linking nimrtl.dll/so.

This commit is contained in:
Joseph Poirier
2015-01-06 12:42:36 -06:00
parent 10ba9c4dc1
commit e940e7d37b
7 changed files with 214 additions and 0 deletions

71
tests/realtimeGC/main.c Normal file
View File

@@ -0,0 +1,71 @@
#ifdef WIN
#include <windows.h>
#else
#include <dlfcn.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#define RUNTIME (35*60)
typedef void (*pFunc)(void);
int main(int argc, char* argv[])
{
int i;
void* hndl;
pFunc status;
pFunc count;
pFunc occupiedMem;
#ifdef WIN
hndl = (void*) LoadLibrary((char const*)"./shared.dll");
status = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"status");
count = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"count");
occupiedMem = (pFunc)GetProcessAddress((HMODULE) hndl, (char const*)"occupiedMem");
#else /* OSX || NIX */
hndl = (void*) dlopen((char const*)"./libshared.so", RTLD_LAZY);
status = (void*) dlsym(hndl, (char const*)"status");
count = (void*) dlsym(hndl, (char const*)"count");
occupiedMem = (void*) dlsym(hndl, (char const*)"occupiedMem");
#endif
assert(hndl);
assert(status);
assert(count);
assert(occupiedMem);
time_t startTime = time((time_t*)0);
time_t runTime = (time_t)(RUNTIME);
time_t accumTime = 0;
while (accumTime < runTime) {
for (i = 0; i < 10; i++)
count();
printf("1. sleeping...\n");
sleep(1);
for (i = 0; i < 10; i++)
status();
printf("2. sleeping...\n");
sleep(1);
occupiedMem();
accumTime = time((time_t*)0) - startTime;
printf("--- Minutes left to run: %d\n", (int)(runTime-accumTime)/60);
}
printf("Cleaning up the shared object pointer...\n");
#ifdef WIN
FreeLibrary((HMODULE)hndl);
#else /* OSX || NIX */
dlclose(hndl);
#endif
printf("Done\n");
return 0;
}

40
tests/realtimeGC/main.nim Normal file
View File

@@ -0,0 +1,40 @@
discard """
cmd: " nim c main.nim"
final output: "Done!"
"""
import times
import os
const RUNTIME = 35 * 60 # 35 minutes
when defined(windows):
const dllname = "./server.dll"
elif defined(macosx):
const dllname = "./libserver.dylib"
else:
const dllname = "./libserver.so"
proc status() {.importc: "status", dynlib: dllname.}
proc count() {.importc: "count", dynlib: dllname.}
proc occupiedMem() {.importc: "occupiedMem", dynlib: dllname.}
proc main() =
let startTime = getTime()
let runTime = cast[Time](RUNTIME) #
var accumTime: Time
while accumTime < runTime:
for i in 0..10:
count()
echo("1. sleeping... ")
sleep(500)
for i in 0..10:
status()
echo("2. sleeping... ")
sleep(500)
occupiedMem()
accumTime = cast[Time]((getTime() - startTime))
echo("--- Minutes left to run: ", int(int(runTime-accumTime)/60))
echo("Done")
main()

View File

@@ -0,0 +1,6 @@
--app:console
--threads:on
-d:release
-d:useRealtimeGC

10
tests/realtimeGC/make.bat Executable file
View File

@@ -0,0 +1,10 @@
set CXX=gcc
set LIBS=-ldl
set LNFLAGS=
set CFLAGS=-DWIN
set INC=
nim c shared.nim
nim c -o:nmain main.nim
%CXX% %INC) %DEFS% %CFLAGS% -o cmain main.c %LNFLAGS% %LIBS%

View File

@@ -0,0 +1,21 @@
Test the realtime GC without linking nimrtl.dll/so.
Note, this is a long running test, default is 35 minutes. To change the
the run time see RUNTIME in main.nim and main.c.
You can build shared.nim, main.nim, and main.c by running make (nix systems)
or maike.bat (Windows systems). They both assume GCC and that it's in your
path. Output: shared.(dll/so), camin(.exe), nmain(.exe).
To run the test: execute either nmain or cmain in a shell window.
To build buy hand:
- build the shared object (shared.nim):
$ nim c shared.nim
- build the client executables:
$ nim c -o:nmain main.nim
$ gcc -o cmain main.c -ldl

View File

@@ -0,0 +1,60 @@
discard """
cmd: " nim c shared.nim"
"""
import strutils
var gCounter: uint64
var gTxStatus: bool
var gRxStatus: bool
var gConnectStatus: bool
var gPttStatus: bool
var gComm1Status: bool
var gComm2Status: bool
proc getTxStatus(): string =
result = if gTxStatus: "On" else: "Off"
gTxStatus = not gTxStatus
proc getRxStatus(): string =
result = if gRxStatus: "On" else: "Off"
gRxStatus = not gRxStatus
proc getConnectStatus(): string =
result = if gConnectStatus: "Yes" else: "No"
gConnectStatus = not gConnectStatus
proc getPttStatus(): string =
result = if gPttStatus: "PTT: On" else: "PTT: Off"
gPttStatus = not gPttStatus
proc getComm1Status(): string =
result = if gComm1Status: "On" else: "Off"
gComm1Status = not gComm1Status
proc getComm2Status(): string =
result = if gComm2Status: "On" else: "Off"
gComm2Status = not gComm2Status
proc status() {.exportc: "status", dynlib.} =
var tx_status = getTxStatus()
var rx_status = getRxStatus()
var connected = getConnectStatus()
var ptt_status = getPttStatus()
var str1: string = "[PilotEdge] Connected: $1 TX: $2 RX: $3" % [connected, tx_status, rx_status]
var a = getComm1Status()
var b = getComm2Status()
var str2: string = "$1 COM1: $2 COM2: $3" % [ptt_status, a, b]
echo(str1)
echo(str2)
proc count() {.exportc: "count", dynlib.} =
var temp: uint64
for i in 0..100_000:
temp += 1
gCounter += 1
echo("gCounter: ", gCounter)
proc occupiedMem() {.exportc: "occupiedMem", dynlib.} =
echo("Occupied Memmory: ", getOccupiedMem())

View File

@@ -0,0 +1,6 @@
--app:lib
--threads:on
-d:release
-d:useRealtimeGC