From fde10adac58e79c7d10ab82fa5a4c7ec2b38bf57 Mon Sep 17 00:00:00 2001 From: Jaremy Creechley Date: Wed, 21 Feb 2024 22:56:17 -0700 Subject: [PATCH] more examples --- tests/exampleGcFailures/config.nims | 2 ++ tests/exampleGcFailures/exFailure.nim | 8 ++++++++ tests/exampleGcFailures/exFailureSeq.nim | 14 ++++++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 tests/exampleGcFailures/config.nims diff --git a/tests/exampleGcFailures/config.nims b/tests/exampleGcFailures/config.nims new file mode 100644 index 0000000..1e8aee5 --- /dev/null +++ b/tests/exampleGcFailures/config.nims @@ -0,0 +1,2 @@ +--threads:on +--mm:refc diff --git a/tests/exampleGcFailures/exFailure.nim b/tests/exampleGcFailures/exFailure.nim index 4f45c7a..6f07597 100644 --- a/tests/exampleGcFailures/exFailure.nim +++ b/tests/exampleGcFailures/exFailure.nim @@ -4,6 +4,14 @@ import chronos/threadsync import chronos/unittest2/asynctests import taskpools +## This example mocks up a sequence and uses +## a finalizer and GC_fullCollect to more +## deterministically create a memory error. +## +## see `exFailureSeq.nim` for a probablisitc based +## example using a real seq object. +## + type Seq*[T] = object data*: ptr UncheckedArray[T] diff --git a/tests/exampleGcFailures/exFailureSeq.nim b/tests/exampleGcFailures/exFailureSeq.nim index eadc91a..4afb79e 100644 --- a/tests/exampleGcFailures/exFailureSeq.nim +++ b/tests/exampleGcFailures/exFailureSeq.nim @@ -5,12 +5,22 @@ import chronos/threadsync import chronos/unittest2/asynctests import taskpools +## create a probablistically likely failure of +## using sequence memory from another thread +## with refc. +## +## However, unlike `exFailure.nim`, this can take +## a while to run. +## +## It may not always produce an error either, but +## generally does so in a few seconds of running. +## + type Seq*[T] = object data*: ptr UncheckedArray[T] size*: int - template toOpenArray*[T](arr: Seq[T]): auto = system.toOpenArray(arr.data, 0, arr.size) @@ -20,7 +30,7 @@ proc toArrayHolder*[T](data: seq[T]): Seq[T] = ) proc worker(data: Seq[char], sig: ThreadSignalPtr) = - os.sleep(100) + os.sleep(300) echo "running worker: " echo "worker: ", data.toOpenArray() for i, c in data.toOpenArray():