[Vm-dev] [commit][3681] Use correct types for constants initializing the tides in sqExternalSemaphores .c

commits at squeakvm.org commits at squeakvm.org
Sat Apr 23 00:59:27 UTC 2016


Revision: 3681
Author:   eliot
Date:     2016-04-22 17:59:25 -0700 (Fri, 22 Apr 2016)
Log Message:
-----------
Use correct types for constants initializing the tides in sqExternalSemaphores.c

Modified Paths:
--------------
    branches/Cog/platforms/Cross/vm/sqExternalSemaphores.c

Property Changed:
----------------
    branches/Cog/platforms/Cross/vm/sqSCCSVersion.h

Modified: branches/Cog/platforms/Cross/vm/sqExternalSemaphores.c
===================================================================
--- branches/Cog/platforms/Cross/vm/sqExternalSemaphores.c	2016-04-22 23:26:26 UTC (rev 3680)
+++ branches/Cog/platforms/Cross/vm/sqExternalSemaphores.c	2016-04-23 00:59:25 UTC (rev 3681)
@@ -49,9 +49,9 @@
  *
  * Lock freedom is achieved by having an array of request counters, and an array
  * of response counters, one per external semaphore index.  To request a signal
- * the requests are locked and the relevant request is incremented.  To respond
- * to a request the VM increments the corresponding response until it matches
- * the request, signalling the associated semaphore on each increment.
+ * the relevant request is incremented via a lock-free (test-and-set) increment.
+ * To respond to a request the VM increments the corresponding response until it
+ * matches the request, signalling the associated semaphore on each increment.
  */
 
 #if !COGMTVM
@@ -71,17 +71,28 @@
 # endif
 	} SignalRequest;
 
+/* We would like to use something like the following for the tides
+	typedef int semidx_t;
+ * but apparently
+	#define MaxTide ((unsigned semidx_t)-1 >> 1)
+ * is not legal; at least clang complains of mismatched parentheses.
+ */
 static SignalRequest *signalRequests = 0;
 static int numSignalRequests = 0;
 static volatile sqInt checkSignalRequests;
 
-/* The tides define the minimum range of indices into signalRequests that the
- * VM needs to scan.  With potentially thousands of indices to scan this can
- * save significant lengths of time.
+/* The tide marks define the minimum range of indices into signalRequests that
+ * the VM needs to scan.  With potentially thousands of indices to scan this can
+ * save significant lengths of time.  Every time the VM responds to requests in
+ * doSignalExternalSemaphores it switches tides by resetting the tides not in
+ * use to an empty interval, toggling useTideA, and reading the tides in use
+ * prior to the toggle.  Hence initialize the tides to an empty interval.
  */
-static volatile int useTideA = 1;
-static volatile int lowTideA = (usqInt)-1 >> 1, highTideA = -1;
-static volatile int lowTideB = (usqInt)-1 >> 1, highTideB = -1;
+#define MaxTide ((unsigned int)-1 >> 1)
+#define MinTide -1
+static volatile char useTideA = 1;
+static volatile int lowTideA = MaxTide, highTideA = MinTide;
+static volatile int lowTideB = MaxTide, highTideB = MinTide;
 
 int
 ioGetMaxExtSemTableSize(void) { return numSignalRequests; }
@@ -193,7 +204,7 @@
 sqInt
 doSignalExternalSemaphores(sqInt externalSemaphoreTableSize)
 {
-	long i, lowTide, highTide;
+	int i, lowTide, highTide;
 	char switched, signalled = 0;
 
 	sqLowLevelMFence();
@@ -205,16 +216,16 @@
 
 	sqLowLevelMFence();
 	if (useTideA) {
-		lowTideB = (unsigned long)-1 >> 1;
-		highTideB = -1;
+		lowTideB = MaxTide;
+		highTideB = MinTide;
 		useTideA = 0;
 		sqLowLevelMFence();
 		lowTide = lowTideA;
 		highTide = highTideA;
 	}
 	else {
-		lowTideA = (unsigned long)-1 >> 1;
-		highTideA = -1;
+		lowTideA = MaxTide;
+		highTideA = MinTide;
 		useTideA = 1;
 		sqLowLevelMFence();
 		lowTide = lowTideB;
@@ -254,7 +265,7 @@
 int
 allRequestsAreAnswered(int externalSemaphoreTableSize)
 {
-	long i;
+	int i;
 	for (i = 1; i < externalSemaphoreTableSize; i++)
 		if (signalRequests[i].responses != signalRequests[i].requests) {
 			printf("signalRequests[%ld] requests %d responses %d\n",


Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
___________________________________________________________________
Modified: checkindate
   - Fri Apr 22 16:25:13 PDT 2016
   + Fri Apr 22 17:58:08 PDT 2016



More information about the Vm-dev mailing list