lock shared vars operations to avoid race condition
authorZhang Qiang <qiang.z.zhang@intel.com>
Sun, 18 Nov 2012 12:46:09 +0000 (20:46 +0800)
committerZhang Qiang <qiang.z.zhang@intel.com>
Tue, 20 Nov 2012 04:38:01 +0000 (12:38 +0800)
Basic workflow:

Main thread:
%to_build: all packages need to be built
%order: ready packages queue
<*> scheduler to resolve ready packages in time

shared data:
@done:
@building:

threads:
* Push packages from @building to @done
* Trigger local repo update

Change-Id: Ib48b1c5225a045a8bd3017ff8e0ea656ccc72c97

depanneur

index 51b30184cf4ea0d7d8162c3faf823523f463f12a..35d46bcd34672851a2f14e7187043aa9ee637bbe 100755 (executable)
--- a/depanneur
+++ b/depanneur
@@ -1445,20 +1445,20 @@ while (! $TERM) {
                 }
             }
         }
+        # No candidate packges and all thread works are idle, and pkgdeps
+        # is updated, in this case, set packages in %tmp_expansion_errors
+        # as real expansion_errors, and all packages depend on these packages
+        # can not be blocked.
+        if (@order == 0 && threads->list() == 0 && $dirty == 0) {
+            @expansion_errors{keys %tmp_expansion_errors} = values %tmp_expansion_errors;
+        }
+        if (scalar(keys %to_build) == @done + @skipped +
+            scalar(keys %expansion_errors) && !$dirty) {
+            $TERM = 1;
+        }
     }
 
-    if (scalar(keys %to_build) == @done + @skipped +
-        scalar(keys %expansion_errors) && !$dirty) {
-        last;
-    }
-
-    # No candidate packges and all thread works are idle, and pkgdeps
-    # is updated, in this case, set packages in %tmp_expansion_errors
-    # as real expansion_errors, and all packages depend on these packages
-    # can not be blocked.
-    if (@order == 0 && threads->list() == 0 && $dirty == 0) {
-        @expansion_errors{keys %tmp_expansion_errors} = values %tmp_expansion_errors;
-    }
+    last if ($TERM);
 
     if (@order == 0) {
         # Waiting thread workers done, then re-calculate ready packages