Tcl Source Code

Artifact [e316b11a4d]
Login

Artifact e316b11a4d96d69a996674817f6d1b09bd9a114a:

Attachment "threadPoolCmd.c.patch" to ticket [1512225fff] added by nyademo 2006-06-26 01:38:22.
--- threadPoolCmd.c.old	Wed Jan 12 00:58:40 2005
+++ threadPoolCmd.c	Mon Jun 26 02:00:23 2006
@@ -506,10 +506,14 @@
                 return TCL_ERROR;
             }
             hPtr = Tcl_FindHashEntry(&tpoolPtr->jobsDone, (char*)jobId);
-            if (hPtr == NULL) {
-                continue; /* Bogus job id; ignore */
+            if (hPtr) {
+                rPtr = (TpoolResult*)Tcl_GetHashValue(hPtr);
+            } else {
+                for (rPtr = tpoolPtr->workHead; rPtr; rPtr = rPtr->nextPtr) {
+                    if (rPtr->jobId == jobId) break;
+                }
+                if (!rPtr) continue; /* Bogus job id; ignore */
             }
-            rPtr = (TpoolResult*)Tcl_GetHashValue(hPtr);
             if (rPtr->detached) {
                 continue; /* A detached job */
             }
@@ -627,10 +631,11 @@
                 Tcl_Free((char*)rPtr);
                 Tcl_ListObjAppendElement(interp, doneList, wObjv[ii]);
                 break;
-            } else if (listVar) {
-                Tcl_ListObjAppendElement(interp, waitList, wObjv[ii]);
             }
         }
+        if (!rPtr && listVar) {
+            Tcl_ListObjAppendElement(interp, waitList, wObjv[ii]);
+        }
     }
     Tcl_MutexUnlock(&tpoolPtr->mutex);
 
@@ -1074,17 +1079,18 @@
                 continue; /* Leave this woker alive */
             }
         }
+        if (!rPtr->detached) {
+            int new;
+            Tcl_SetHashValue(Tcl_CreateHashEntry(&tpoolPtr->jobsDone, 
+                                                 (char*)rPtr->jobId, &new), 
+                             (ClientData)rPtr);
+        }
         Tcl_MutexUnlock(&tpoolPtr->mutex);
         TpoolEval(interp, rPtr->script, rPtr->scriptLen, rPtr);
         Tcl_Free(rPtr->script);
         Tcl_MutexLock(&tpoolPtr->mutex);
         if (rPtr->detached) {
             Tcl_Free((char*)rPtr);
-        } else {
-            int new;
-            Tcl_SetHashValue(Tcl_CreateHashEntry(&tpoolPtr->jobsDone, 
-                                                 (char*)rPtr->jobId, &new), 
-                             (ClientData)rPtr);
         }
     }