Added benchmarks for `Semaphore >> #critical:` and `RecursionLock >> #critical:`
authorJan Vrany <jan.vrany@fit.cvut.cz>
Mon, 28 Aug 2017 21:41:34 +0100
changeset 316 44346cc94ec4
parent 315 e08b96365d76
child 317 a462cd3ed353
Added benchmarks for `Semaphore >> #critical:` and `RecursionLock >> #critical:`
s/benchmarks/micro/BenchmarkLocking.st
s/benchmarks/micro/BenchmarkMicro.st
s/benchmarks/micro/BenchmarkRecursionLock.st
s/benchmarks/micro/BenchmarkSemaphore.st
s/benchmarks/micro/Make.proto
s/benchmarks/micro/Make.spec
s/benchmarks/micro/abbrev.stc
s/benchmarks/micro/bc.mak
s/benchmarks/micro/bmake.bat
s/benchmarks/micro/jv_calipel_s_benchmarks_micro.st
s/benchmarks/micro/jv_calipel_s_benchmarks_microWINrc.rc
s/benchmarks/micro/libInit.cc
s/benchmarks/micro/mingwmake.bat
s/benchmarks/micro/vcmake.bat
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/benchmarks/micro/BenchmarkLocking.st	Mon Aug 28 21:41:34 2017 +0100
@@ -0,0 +1,170 @@
+"{ Package: 'jv:calipel/s/benchmarks/micro' }"
+
+"{ NameSpace: Smalltalk }"
+
+Benchmark subclass:#BenchmarkLocking
+	instanceVariableNames:'nesting threads lock'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'CalipeL-S-Benchmarks-Micro'
+!
+
+!BenchmarkLocking class methodsFor:'queries'!
+
+isAbstract
+    "Return if this class is an abstract class.
+     True is returned here for myself only; false for subclasses.
+     Abstract subclasses must redefine this again."
+
+    ^ self == BenchmarkLocking.
+! !
+
+!BenchmarkLocking methodsFor:'benchmarks'!
+
+benchmarkCritical
+    <benchmark: '#critical:'>
+
+    | blocker iterations body |
+
+    nesting isNil ifTrue:[ nesting := 1 ].
+    iterations := 10000000.
+    blocker := Semaphore new: (threads - 1) negated.
+    body := [
+                iterations timesRepeat:[ self workloadCritical: nesting ].
+                blocker signal.
+            ].
+    1 to: threads do:[:i |
+        | t |
+
+        t := body newProcess.
+        t name: 'Benchmark ''', self class name, ' >> #critical:'', thread ', i printString.
+        t resume.
+    ].
+    blocker wait.
+
+    "
+    BenchmarkRecursionLock run: #benchmarkCritical.
+    BenchmarkSemaphore run: #benchmarkCritical
+    "
+
+    "Created: / 25-08-2017 / 08:46:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-08-2017 / 21:32:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+
+!
+
+benchmarkCriticalN
+    <benchmark: '#critical: (no work)'>
+
+    | blocker iterations body |
+
+    nesting isNil ifTrue:[ nesting := 1 ].
+    iterations := 10000000.
+    blocker := Semaphore new: (threads - 1) negated.
+    body := [
+                iterations timesRepeat:[ self justpureCritical: nesting ].
+                blocker signal.
+            ].
+    1 to: threads do:[:i |
+        | t |
+
+        t := body newProcess.
+        t name: 'Benchmark ''', self class name, ' >> #critical:'', thread ', i printString.
+        t resume.
+    ].
+    blocker wait.
+
+    "
+    BenchmarkRecursionLock run: #benchmarkCritical.
+    BenchmarkSemaphore run: #benchmarkCritical
+    "
+
+    "Created: / 25-08-2017 / 08:46:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-08-2017 / 21:32:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+
+!
+
+
+benchmarkBase
+    <benchmark: 'workload (no locks)'>
+
+    | blocker iterations body |
+
+    nesting isNil ifTrue:[ nesting := 1 ].
+    iterations := 10000000.
+    blocker := Semaphore new: (threads - 1) negated.
+    body := [
+                iterations timesRepeat:[ self workloadBase: nesting ].
+                blocker signal.
+            ].
+    1 to: threads do:[:i |
+        | t |
+
+        t := body newProcess.
+        t name: 'Benchmark ''', self class name, ' >> benchmarkBase, thread ', i printString.
+        t resume.
+    ].
+    blocker wait.
+
+    "
+    BenchmarkRecursionLock run: #benchmarkCritical.
+    BenchmarkSemaphore run: #benchmarkCritical
+    "
+
+    "Created: / 25-08-2017 / 08:46:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-08-2017 / 21:32:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+
+! !
+
+!BenchmarkLocking methodsFor:'parameters'!
+
+threads: anInteger
+    <parameter: #threads type: #Integer values: #(1 2 5)>
+    threads := anInteger.
+
+    "Created: / 25-08-2017 / 08:52:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkLocking methodsFor:'private'!
+
+justpureCritical: n
+    lock critical:[
+        n > 1 ifTrue:[
+            self justpureCritical: n - 1.
+        ].
+    ].
+
+    "Created: / 25-08-2017 / 08:55:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-08-2017 / 21:29:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+
+workloadCritical: n
+    lock critical:[
+        self doSomeWork.
+        n > 1 ifTrue:[
+            self workloadCritical: n - 1.
+        ].
+    ].
+
+    "Created: / 25-08-2017 / 08:55:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-08-2017 / 21:29:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+workloadBase: n
+    self doSomeWork.
+    n > 1 ifTrue:[
+        self workloadBase: n - 1.
+    ].
+
+    "Created: / 25-08-2017 / 08:55:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-08-2017 / 21:29:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+
+!
+
+doSomeWork
+    1 perform: #+ with: 1
+
+    "Created: / 25-08-2017 / 09:04:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-08-2017 / 21:11:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/s/benchmarks/micro/BenchmarkMicro.st	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/BenchmarkMicro.st	Mon Aug 28 21:41:34 2017 +0100
@@ -1,5 +1,7 @@
 "{ Package: 'jv:calipel/s/benchmarks/micro' }"
 
+"{ NameSpace: Smalltalk }"
+
 Object subclass:#BenchmarkMicro
 	instanceVariableNames:'iterations stream hello table ary1 ary2'
 	classVariableNames:''
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/benchmarks/micro/BenchmarkRecursionLock.st	Mon Aug 28 21:41:34 2017 +0100
@@ -0,0 +1,42 @@
+"{ Package: 'jv:calipel/s/benchmarks/micro' }"
+
+"{ NameSpace: Smalltalk }"
+
+BenchmarkLocking subclass:#BenchmarkRecursionLock
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'CalipeL-S-Benchmarks-Micro'
+!
+
+
+!BenchmarkRecursionLock methodsFor:'parameters'!
+
+nesting: anInteger
+    <parameter: #nesting type: #Integer values: #(1 2 5 10)>
+    nesting := anInteger.
+
+    "Modified (format): / 28-08-2017 / 21:11:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkRecursionLock methodsFor:'running'!
+
+setUp
+    <setup>
+    (Smalltalk includesKey: #RecursionLock) ifTrue:[
+        lock := RecursionLock new.
+    ] ifFalse:[
+        lock := Monitor new
+    ].
+
+    "Created: / 25-08-2017 / 08:54:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-08-2017 / 21:24:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!BenchmarkRecursionLock class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/benchmarks/micro/BenchmarkSemaphore.st	Mon Aug 28 21:41:34 2017 +0100
@@ -0,0 +1,21 @@
+"{ Package: 'jv:calipel/s/benchmarks/micro' }"
+
+"{ NameSpace: Smalltalk }"
+
+BenchmarkLocking subclass:#BenchmarkSemaphore
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'CalipeL-S-Benchmarks-Micro'
+!
+
+!BenchmarkSemaphore methodsFor:'running'!
+
+setUp
+    <setup>
+    lock := Semaphore forMutualExclusion.
+
+    "Created: / 25-08-2017 / 08:54:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-08-2017 / 21:27:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
--- a/s/benchmarks/micro/Make.proto	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/Make.proto	Mon Aug 28 21:41:34 2017 +0100
@@ -101,12 +101,13 @@
 
 # build all mandatory prerequisite packages (containing superclasses) for this package
 prereq:
-	cd $(TOP)/libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd $(TOP)/libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	cd ../../ && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
 
 
 # build all packages containing referenced classes for this package
-# they are nor needed to compile the package
+# they are not needed to compile the package (but later, to load it)
 references:
 
 
@@ -121,10 +122,13 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
-$(OUTDIR)BenchmarkMicroStringConcat.$(O) BenchmarkMicroStringConcat.$(H): BenchmarkMicroStringConcat.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)BenchmarkMicroStringConcatN.$(O) BenchmarkMicroStringConcatN.$(H): BenchmarkMicroStringConcatN.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)BenchmarkPerform.$(O) BenchmarkPerform.$(H): BenchmarkPerform.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)jv_calipel_s_benchmarks_micro.$(O) jv_calipel_s_benchmarks_micro.$(H): jv_calipel_s_benchmarks_micro.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkLocking.$(O) BenchmarkLocking.$(C) BenchmarkLocking.$(H): BenchmarkLocking.st $(INCLUDE_TOP)/jv/calipel/s/Benchmark.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMicroStringConcat.$(O) BenchmarkMicroStringConcat.$(C) BenchmarkMicroStringConcat.$(H): BenchmarkMicroStringConcat.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMicroStringConcatN.$(O) BenchmarkMicroStringConcatN.$(C) BenchmarkMicroStringConcatN.$(H): BenchmarkMicroStringConcatN.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkPerform.$(O) BenchmarkPerform.$(C) BenchmarkPerform.$(H): BenchmarkPerform.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)jv_calipel_s_benchmarks_micro.$(O) jv_calipel_s_benchmarks_micro.$(C) jv_calipel_s_benchmarks_micro.$(H): jv_calipel_s_benchmarks_micro.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkRecursionLock.$(O) BenchmarkRecursionLock.$(C) BenchmarkRecursionLock.$(H): BenchmarkRecursionLock.st $(INCLUDE_TOP)/jv/calipel/s/Benchmark.$(H) $(INCLUDE_TOP)/jv/calipel/s/benchmarks/micro/BenchmarkLocking.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkSemaphore.$(O) BenchmarkSemaphore.$(C) BenchmarkSemaphore.$(H): BenchmarkSemaphore.st $(INCLUDE_TOP)/jv/calipel/s/Benchmark.$(H) $(INCLUDE_TOP)/jv/calipel/s/benchmarks/micro/BenchmarkLocking.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
 
--- a/s/benchmarks/micro/Make.spec	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/Make.spec	Mon Aug 28 21:41:34 2017 +0100
@@ -22,7 +22,7 @@
 #                (if removed, they will be created as common
 #  -Pxxx       : defines the package
 #  -Zxxx       : a prefix for variables within the classLib
-#  -Dxxx       : defines passed to to CC for inline C-code
+#  -Dxxx       : defines passed to CC for inline C-code
 #  -Ixxx       : include path passed to CC for inline C-code
 #  +optspace   : optimized for space
 #  +optspace2  : optimized more for space
@@ -51,19 +51,25 @@
 STCWARNINGS=-warnNonStandard
 
 COMMON_CLASSES= \
+	BenchmarkLocking \
 	BenchmarkMicroStringConcat \
 	BenchmarkMicroStringConcatN \
 	BenchmarkPerform \
 	jv_calipel_s_benchmarks_micro \
+	BenchmarkRecursionLock \
+	BenchmarkSemaphore \
 
 
 
 
 COMMON_OBJS= \
-    $(OUTDIR_SLASH)BenchmarkMicroStringConcat.$(O) \
-    $(OUTDIR_SLASH)BenchmarkMicroStringConcatN.$(O) \
-    $(OUTDIR_SLASH)BenchmarkPerform.$(O) \
-    $(OUTDIR_SLASH)jv_calipel_s_benchmarks_micro.$(O) \
+    $(OUTDIR)BenchmarkLocking.$(O) \
+    $(OUTDIR)BenchmarkMicroStringConcat.$(O) \
+    $(OUTDIR)BenchmarkMicroStringConcatN.$(O) \
+    $(OUTDIR)BenchmarkPerform.$(O) \
+    $(OUTDIR)jv_calipel_s_benchmarks_micro.$(O) \
+    $(OUTDIR)BenchmarkRecursionLock.$(O) \
+    $(OUTDIR)BenchmarkSemaphore.$(O) \
 
 
 
--- a/s/benchmarks/micro/abbrev.stc	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/abbrev.stc	Mon Aug 28 21:41:34 2017 +0100
@@ -1,8 +1,11 @@
 # automagically generated by the project definition
 # this file is needed for stc to be able to compile modules independently.
 # it provides information about a classes filename, category and especially namespace.
-BenchmarkMicro BenchmarkMicro jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
+BenchmarkLocking BenchmarkLocking jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
 BenchmarkMicroStringConcat BenchmarkMicroStringConcat jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
 BenchmarkMicroStringConcatN BenchmarkMicroStringConcatN jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
 BenchmarkPerform BenchmarkPerform jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
 jv_calipel_s_benchmarks_micro jv_calipel_s_benchmarks_micro jv:calipel/s/benchmarks/micro '* Projects & Packages *' 3
+BenchmarkRecursionLock BenchmarkRecursionLock jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
+BenchmarkSemaphore BenchmarkSemaphore jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
+BenchmarkMicro BenchmarkMicro jv:calipel/s/benchmarks/micro 'CalipeL-S-Benchmarks-Micro' 0
--- a/s/benchmarks/micro/bc.mak	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/bc.mak	Mon Aug 28 21:41:34 2017 +0100
@@ -31,7 +31,7 @@
 
 LIBNAME=libjv_calipel_s_benchmarks_micro
 MODULE_PATH=calipel\s\benchmarks\micro
-RESFILES=micro.$(RES)
+RESFILES=jv_calipel_s_benchmarks_microWINrc.$(RES)
 
 
 
@@ -52,6 +52,7 @@
 # build all mandatory prerequisite packages (containing superclasses) for this package
 prereq:
 	pushd ..\..\..\..\..\stx\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\.. & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
 
 
 
@@ -64,14 +65,17 @@
 	$(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
         
 clean::
-	del *.$(CSUFFIX)
+	-del *.$(CSUFFIX)
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
-$(OUTDIR)BenchmarkMicroStringConcat.$(O) BenchmarkMicroStringConcat.$(H): BenchmarkMicroStringConcat.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)BenchmarkMicroStringConcatN.$(O) BenchmarkMicroStringConcatN.$(H): BenchmarkMicroStringConcatN.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)BenchmarkPerform.$(O) BenchmarkPerform.$(H): BenchmarkPerform.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)jv_calipel_s_benchmarks_micro.$(O) jv_calipel_s_benchmarks_micro.$(H): jv_calipel_s_benchmarks_micro.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkLocking.$(O) BenchmarkLocking.$(C) BenchmarkLocking.$(H): BenchmarkLocking.st $(INCLUDE_TOP)\jv\calipel\s\Benchmark.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMicroStringConcat.$(O) BenchmarkMicroStringConcat.$(C) BenchmarkMicroStringConcat.$(H): BenchmarkMicroStringConcat.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkMicroStringConcatN.$(O) BenchmarkMicroStringConcatN.$(C) BenchmarkMicroStringConcatN.$(H): BenchmarkMicroStringConcatN.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkPerform.$(O) BenchmarkPerform.$(C) BenchmarkPerform.$(H): BenchmarkPerform.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)jv_calipel_s_benchmarks_micro.$(O) jv_calipel_s_benchmarks_micro.$(C) jv_calipel_s_benchmarks_micro.$(H): jv_calipel_s_benchmarks_micro.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkRecursionLock.$(O) BenchmarkRecursionLock.$(C) BenchmarkRecursionLock.$(H): BenchmarkRecursionLock.st $(INCLUDE_TOP)\jv\calipel\s\Benchmark.$(H) $(INCLUDE_TOP)\jv\calipel\s\benchmarks\micro\BenchmarkLocking.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)BenchmarkSemaphore.$(O) BenchmarkSemaphore.$(C) BenchmarkSemaphore.$(H): BenchmarkSemaphore.st $(INCLUDE_TOP)\jv\calipel\s\Benchmark.$(H) $(INCLUDE_TOP)\jv\calipel\s\benchmarks\micro\BenchmarkLocking.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
 
--- a/s/benchmarks/micro/bmake.bat	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/bmake.bat	Mon Aug 28 21:41:34 2017 +0100
@@ -7,6 +7,9 @@
 @REM Kludge got Mercurial, cannot be implemented in Borland make
 @FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
 @IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
 make.exe -N -f bc.mak  %DEFINES% %*
 
 
+
+
--- a/s/benchmarks/micro/jv_calipel_s_benchmarks_micro.st	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/jv_calipel_s_benchmarks_micro.st	Mon Aug 28 21:41:34 2017 +0100
@@ -1,5 +1,7 @@
 "{ Package: 'jv:calipel/s/benchmarks/micro' }"
 
+"{ NameSpace: Smalltalk }"
+
 LibraryDefinition subclass:#jv_calipel_s_benchmarks_micro
 	instanceVariableNames:''
 	classVariableNames:''
@@ -24,9 +26,11 @@
      are extended by myself.
      They are mandatory, because we need these packages as a prerequisite for loading and compiling.
      This method is generated automatically,
-     by searching along the inheritance chain of all of my classes."
+     by searching along the inheritance chain of all of my classes.
+     Please take a look at the #referencedPreRequisites method as well."
 
     ^ #(
+        #'jv:calipel/s'    "Benchmark - superclass of BenchmarkLocking"
         #'stx:libbasic'    "LibraryDefinition - superclass of jv_calipel_s_benchmarks_micro"
     )
 !
@@ -34,12 +38,15 @@
 referencedPreRequisites
     "list packages which are a prerequisite, because they contain
      classes which are referenced by my classes.
-     We do not need these packages as a prerequisite for loading or compiling.
+     These packages are NOT needed as a prerequisite for compiling or loading,
+     however, a class from it may be referenced during execution and having it
+     unloaded then may lead to a runtime doesNotUnderstand error, unless the caller
+     includes explicit checks for the package being present.
      This method is generated automatically,
-     by searching all classes (and their packages) which are referenced by my classes."
+     by searching all classes (and their packages) which are referenced by my classes.
+     Please also take a look at the #mandatoryPreRequisites method"
 
     ^ #(
-        #'jv:calipel/s'    "BenchmarkInstance - referenced by BenchmarkMicro class>>run:"
         #'stx:libbasic2'    "Random - referenced by BenchmarkPerform class>>initialize"
     )
 !
@@ -76,17 +83,22 @@
 
     ^ #(
         "<className> or (<className> attributes...) in load order"
-        (BenchmarkMicro autoload)
+        BenchmarkLocking
         BenchmarkMicroStringConcat
         BenchmarkMicroStringConcatN
         BenchmarkPerform
         #'jv_calipel_s_benchmarks_micro'
+        BenchmarkRecursionLock
+        BenchmarkSemaphore
+        (BenchmarkMicro autoload)
     )
 !
 
 extensionMethodNames
-    "list class/selector pairs of extensions.
-     A correponding method with real names must be present in my concrete subclasses"
+    "lists the extension methods which are to be included in the project.
+     Entries are 2-element array literals, consisting of class-name and selector.
+     A correponding method with real names must be present in my concrete subclasses
+     if it has extensions."
 
     ^ #(
     )
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/s/benchmarks/micro/jv_calipel_s_benchmarks_microWINrc.rc	Mon Aug 28 21:41:34 2017 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: jv_calipel_s_benchmarks_micro.
+//
+VS_VERSION_INFO VERSIONINFO
+  FILEVERSION     6,2,32767,32767
+  PRODUCTVERSION  6,2,6,0
+#if (__BORLANDC__)
+  FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
+  FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+  FILEOS          VOS_NT_WINDOWS32
+  FILETYPE        VFT_DLL
+  FILESUBTYPE     VS_USER_DEFINED
+#endif
+
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "040904E4"
+    BEGIN
+      VALUE "CompanyName", "My Company\0"
+      VALUE "FileDescription", "Class Library (LIB)\0"
+      VALUE "FileVersion", "6.2.32767.32767\0"
+      VALUE "InternalName", "jv:calipel/s/benchmarks/micro\0"
+      VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
+      VALUE "ProductName", "LibraryName\0"
+      VALUE "ProductVersion", "6.2.6.0\0"
+      VALUE "ProductDate", "Mon, 28 Aug 2017 20:40:35 GMT\0"
+    END
+
+  END
+
+  BLOCK "VarFileInfo"
+  BEGIN                               //  Language   |    Translation
+    VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+  END
+END
--- a/s/benchmarks/micro/libInit.cc	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/libInit.cc	Mon Aug 28 21:41:34 2017 +0100
@@ -16,22 +16,35 @@
 DLL_EXPORT void _libjv_calipel_s_benchmarks_micro_InitDefinition() INIT_TEXT_SECTION;
 #endif
 
-void _libjv_calipel_s_benchmarks_micro_InitDefinition(pass, __pRT__, snd)
-OBJ snd; struct __vmData__ *__pRT__; {
-__BEGIN_PACKAGE2__("libjv_calipel_s_benchmarks_micro__DFN", _libjv_calipel_s_benchmarks_micro_InitDefinition, "jv:calipel/s/benchmarks/micro");
-_jv_137calipel_137s_137benchmarks_137micro_Init(pass,__pRT__,snd);
+extern void _BenchmarkLocking_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _BenchmarkMicroStringConcat_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _BenchmarkMicroStringConcatN_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _BenchmarkPerform_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _jv_137calipel_137s_137benchmarks_137micro_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _BenchmarkRecursionLock_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _BenchmarkSemaphore_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 
-__END_PACKAGE__();
+
+
+void _libjv_calipel_s_benchmarks_micro_InitDefinition(int pass, struct __vmData__ *__pRT__, OBJ snd)
+{
+  __BEGIN_PACKAGE2__("libjv_calipel_s_benchmarks_micro__DFN", _libjv_calipel_s_benchmarks_micro_InitDefinition, "jv:calipel/s/benchmarks/micro");
+    _jv_137calipel_137s_137benchmarks_137micro_Init(pass,__pRT__,snd);
+
+  __END_PACKAGE__();
 }
 
-void _libjv_calipel_s_benchmarks_micro_Init(pass, __pRT__, snd)
-OBJ snd; struct __vmData__ *__pRT__; {
-__BEGIN_PACKAGE2__("libjv_calipel_s_benchmarks_micro", _libjv_calipel_s_benchmarks_micro_Init, "jv:calipel/s/benchmarks/micro");
-_BenchmarkMicroStringConcat_Init(pass,__pRT__,snd);
-_BenchmarkMicroStringConcatN_Init(pass,__pRT__,snd);
-_BenchmarkPerform_Init(pass,__pRT__,snd);
-_jv_137calipel_137s_137benchmarks_137micro_Init(pass,__pRT__,snd);
+void _libjv_calipel_s_benchmarks_micro_Init(int pass, struct __vmData__ *__pRT__, OBJ snd)
+{
+  __BEGIN_PACKAGE2__("libjv_calipel_s_benchmarks_micro", _libjv_calipel_s_benchmarks_micro_Init, "jv:calipel/s/benchmarks/micro");
+    _BenchmarkLocking_Init(pass,__pRT__,snd);
+    _BenchmarkMicroStringConcat_Init(pass,__pRT__,snd);
+    _BenchmarkMicroStringConcatN_Init(pass,__pRT__,snd);
+    _BenchmarkPerform_Init(pass,__pRT__,snd);
+    _jv_137calipel_137s_137benchmarks_137micro_Init(pass,__pRT__,snd);
+    _BenchmarkRecursionLock_Init(pass,__pRT__,snd);
+    _BenchmarkSemaphore_Init(pass,__pRT__,snd);
 
 
-__END_PACKAGE__();
+  __END_PACKAGE__();
 }
--- a/s/benchmarks/micro/mingwmake.bat	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/mingwmake.bat	Mon Aug 28 21:41:34 2017 +0100
@@ -14,3 +14,5 @@
 make.exe -N -f bc.mak %DEFINES% %USEMINGW_ARG% %*
 
 
+
+
--- a/s/benchmarks/micro/vcmake.bat	Mon Mar 21 23:47:50 2016 +0100
+++ b/s/benchmarks/micro/vcmake.bat	Mon Aug 28 21:41:34 2017 +0100
@@ -13,6 +13,8 @@
 @REM Kludge got Mercurial, cannot be implemented in Borland make
 @FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
 @IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
+
 make.exe -N -f bc.mak -DUSEVC=1 %DEFINES% %*