@@ -183,15 +183,16 @@ def remove_work_source(self, worksource):
183
183
def check_job (self , job ):
184
184
if self .currentprevhash == job .prevhash : return True
185
185
cancel = []
186
- with self .blocklock :
187
- now = time .time ()
188
- timeout_expired = now > self .timeoutend
189
- self .timeoutend = now + 10
190
- if job .prevhash in self .knownprevhashes : return False
191
- if timeout_expired : self .knownprevhashes = [self .currentprevhash ]
192
- else : self .knownprevhashes .append (self .currentprevhash )
193
- self .currentprevhash = job .prevhash
194
- with self .core .workqueue .lock :
186
+ # Needs to be locked outside of blocklock to prevent race condition
187
+ with self .core .workqueue .lock :
188
+ with self .blocklock :
189
+ now = time .time ()
190
+ timeout_expired = now > self .timeoutend
191
+ self .timeoutend = now + 10
192
+ if job .prevhash in self .knownprevhashes : return False
193
+ if timeout_expired : self .knownprevhashes = [self .currentprevhash ]
194
+ else : self .knownprevhashes .append (self .currentprevhash )
195
+ self .currentprevhash = job .prevhash
195
196
while self .jobs :
196
197
job = self .jobs .pop (0 )
197
198
if job .worker : cancel .append (job )
@@ -200,3 +201,4 @@ def check_job(self, job):
200
201
self .core .log (self , "New block detected\n " , 300 , "B" )
201
202
self .core .workqueue .cancel_jobs (cancel )
202
203
return True
204
+
0 commit comments