The python set() is not thread safe and we use it on the ThreadedPool.
With this LockedSet python class we can call the 'add' and 'remove'
safely inside the ThreadedPool.

This piece of code is taken from the stackoverflow
https://stackoverflow.com/questions/13610654/how-to-make-built-in-containers-sets-dicts-lists-thread-safe

May be related with [YOCTO #14775] -- 
https://bugzilla.yoctoproject.org/show_bug.cgi?id=14775

Signed-off-by: Jose Quaresma <quaresma.j...@gmail.com>
---
 meta/classes/sstate.bbclass | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index 1c0cae4893..ebc336b497 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -1008,6 +1008,21 @@ def sstate_checkhashes(sq_data, d, siginfo=False, 
currentcount=0, summary=True,
             if progress:
                 bb.event.fire(bb.event.ProcessProgress(msg, len(tasklist) - 
thread_worker.tasks.qsize()), d)
 
+        import threading
+        class LockedSet(set):
+            """A set where add() and remove() operator are thread-safe"""
+            def __init__(self, *args, **kwargs):
+                self._lock = threading.Lock()
+                super(LockedSet, self).__init__(*args, **kwargs)
+
+            def add(self, elem):
+                with self._lock:
+                    super(LockedSet, self).add(elem)
+
+            def remove(self, elem):
+                with self._lock:
+                    super(LockedSet, self).remove(elem)
+
         tasklist = []
         for tid in missed:
             sstatefile = d.expand(getsstatefile(tid, siginfo, d))
@@ -1016,6 +1031,10 @@ def sstate_checkhashes(sq_data, d, siginfo=False, 
currentcount=0, summary=True,
         if tasklist:
             nproc = min(int(d.getVar("BB_NUMBER_THREADS")), len(tasklist))
 
+            # this collections will be used on the thread pool so let's do it 
safely
+            found = LockedSet(found)
+            missed = LockedSet(missed)
+
             progress = len(tasklist) >= 100
             if progress:
                 msg = "Checking sstate mirror object availability"
-- 
2.35.3

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#164618): 
https://lists.openembedded.org/g/openembedded-core/message/164618
Mute This Topic: https://lists.openembedded.org/mt/90558156/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to