@@ -172,10 +172,11 @@ - (id)main { void *pool; + of_memory_read_barrier(); if (_terminate) return nil; pool = objc_autoreleasePoolPush(); @@ -184,10 +185,11 @@ [_queueCondition lock]; @try { of_list_object_t *listObject; + of_memory_read_barrier(); if (_terminate) { objc_autoreleasePoolPop(pool); return nil; } @@ -194,10 +196,11 @@ listObject = [_queue firstListObject]; while (listObject == NULL) { [_queueCondition wait]; + of_memory_read_barrier(); if (_terminate) { objc_autoreleasePoolPop(pool); return nil; } @@ -208,17 +211,19 @@ [_queue removeListObject: listObject]; } @finally { [_queueCondition unlock]; } + of_memory_read_barrier(); if (_terminate) { objc_autoreleasePoolPop(pool); return nil; } [job perform]; + of_memory_read_barrier(); if (_terminate) { objc_autoreleasePoolPop(pool); return nil; } @@ -225,10 +230,11 @@ objc_autoreleasePoolPop(pool); pool = objc_autoreleasePoolPush(); [_countCondition lock]; @try { + of_memory_read_barrier(); if (_terminate) { objc_autoreleasePoolPop(pool); return nil; } @@ -306,10 +312,12 @@ OFEnumerator *enumerator = [_threads objectEnumerator]; OFThreadPoolThread *thread; while ((thread = [enumerator nextObject]) != nil) thread->_terminate = true; + + of_memory_write_barrier(); } @finally { [_countCondition unlock]; } [_queueCondition broadcast];