summary refs log tree commit diff stats
path: root/tests/realtimeGC
diff options
context:
space:
mode:
authorJoseph Poirier <jdpoirier@gmail.com>2015-01-06 12:42:36 -0600
committerJoseph Poirier <jdpoirier@gmail.com>2015-01-06 12:42:36 -0600
commite940e7d37b2ffcc24595e99868c40e46c57f74b9 (patch)
tree14b416954fa546e25e20884af99b12b2ff5a2834 /tests/realtimeGC
parent10ba9c4dc152a83b8db8a2987c7a481885be25b0 (diff)
downloadNim-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.c71
-rw-r--r--tests/realtimeGC/main.nim40
-rw-r--r--tests/realtimeGC/main.nim.cfg6
-rwxr-xr-xtests/realtimeGC/make.bat10
-rw-r--r--tests/realtimeGC/readme.txt21
-rw-r--r--tests/realtimeGC/shared.nim60
-rw-r--r--tests/realtimeGC/shared.nim.cfg6
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