diff options
author | Joseph Poirier <jdpoirier@gmail.com> | 2015-01-06 12:42:36 -0600 |
---|---|---|
committer | Joseph Poirier <jdpoirier@gmail.com> | 2015-01-06 12:42:36 -0600 |
commit | e940e7d37b2ffcc24595e99868c40e46c57f74b9 (patch) | |
tree | 14b416954fa546e25e20884af99b12b2ff5a2834 /tests/realtimeGC | |
parent | 10ba9c4dc152a83b8db8a2987c7a481885be25b0 (diff) | |
download | Nim-e940e7d37b2ffcc24595e99868c40e46c57f74b9.tar.gz |
Test the realtime GC, via long running process in a shared object, without linking nimrtl.dll/so.
Diffstat (limited to 'tests/realtimeGC')
-rw-r--r-- | tests/realtimeGC/main.c | 71 | ||||
-rw-r--r-- | tests/realtimeGC/main.nim | 40 | ||||
-rw-r--r-- | tests/realtimeGC/main.nim.cfg | 6 | ||||
-rwxr-xr-x | tests/realtimeGC/make.bat | 10 | ||||
-rw-r--r-- | tests/realtimeGC/readme.txt | 21 | ||||
-rw-r--r-- | tests/realtimeGC/shared.nim | 60 | ||||
-rw-r--r-- | tests/realtimeGC/shared.nim.cfg | 6 |
7 files changed, 214 insertions, 0 deletions
diff --git a/tests/realtimeGC/main.c b/tests/realtimeGC/main.c new file mode 100644 index 000000000..0a0ea95b2 --- /dev/null +++ b/tests/realtimeGC/main.c @@ -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; +} + + + + diff --git a/tests/realtimeGC/main.nim b/tests/realtimeGC/main.nim new file mode 100644 index 000000000..21e90d545 --- /dev/null +++ b/tests/realtimeGC/main.nim @@ -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() diff --git a/tests/realtimeGC/main.nim.cfg b/tests/realtimeGC/main.nim.cfg new file mode 100644 index 000000000..fed4fa471 --- /dev/null +++ b/tests/realtimeGC/main.nim.cfg @@ -0,0 +1,6 @@ + +--app:console +--threads:on + +-d:release +-d:useRealtimeGC diff --git a/tests/realtimeGC/make.bat b/tests/realtimeGC/make.bat new file mode 100755 index 000000000..182595270 --- /dev/null +++ b/tests/realtimeGC/make.bat @@ -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% diff --git a/tests/realtimeGC/readme.txt b/tests/realtimeGC/readme.txt new file mode 100644 index 000000000..035a00001 --- /dev/null +++ b/tests/realtimeGC/readme.txt @@ -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 diff --git a/tests/realtimeGC/shared.nim b/tests/realtimeGC/shared.nim new file mode 100644 index 000000000..5da1f1fc2 --- /dev/null +++ b/tests/realtimeGC/shared.nim @@ -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()) + diff --git a/tests/realtimeGC/shared.nim.cfg b/tests/realtimeGC/shared.nim.cfg new file mode 100644 index 000000000..5d498029d --- /dev/null +++ b/tests/realtimeGC/shared.nim.cfg @@ -0,0 +1,6 @@ + +--app:lib +--threads:on + +-d:release +-d:useRealtimeGC |