| --- pbzip2.cpp 2011-07-16 09:52:35.000000000 -0700 |
| +++ pbzip2-fixed.cpp 2011-10-17 10:23:02.626471000 -0700 |
| @@ -340,7 +340,6 @@ |
| inline int syncGetTerminateFlag(); |
| inline void syncSetTerminateFlag(int newValue); |
| inline void syncSetFinishedFlag(int newValue); |
| -inline void setLastGoodBlock(int newValue); |
| inline void syncSetLastGoodBlock(int newValue); |
| inline int syncGetLastGoodBlock(); |
| void cleanupUnfinishedWork(); |
| @@ -668,17 +667,24 @@ |
| { |
| // wake up terminator thread |
| pthread_cond_signal(&TerminateCond); |
| + safe_mutex_unlock(&TerminateFlagMutex); |
| |
| // wake up all other possibly blocked on cond threads |
| + safe_mutex_lock(OutMutex); |
| pthread_cond_broadcast(notTooMuchNumBuffered); |
| + safe_mutex_unlock(OutMutex); |
| if (FifoQueue != NULL) |
| { |
| + safe_mutex_lock(FifoQueue->mut); |
| pthread_cond_broadcast(FifoQueue->notFull); |
| pthread_cond_broadcast(FifoQueue->notEmpty); |
| + safe_mutex_unlock(FifoQueue->mut); |
| } |
| } |
| - |
| - safe_mutex_unlock(&TerminateFlagMutex); |
| + else |
| + { |
| + safe_mutex_unlock(&TerminateFlagMutex); |
| + } |
| } |
| |
| /* |
| @@ -697,11 +703,12 @@ |
| safe_mutex_unlock(&TerminateFlagMutex); |
| } |
| |
| -inline void setLastGoodBlock(int newValue) |
| +inline void syncSetLastGoodBlock(int newValue) |
| { |
| + safe_mutex_lock(OutMutex); |
| #ifdef PBZIP_DEBUG |
| unsigned long long thid = (unsigned long long) pthread_self(); |
| - fprintf(stderr, "(%"PRIu64") setLastGoodBlock: %d -> %d\n", thid, LastGoodBlock, newValue ); |
| + fprintf(stderr, "(%"PRIu64") syncSetLastGoodBlock: %d -> %d\n", thid, LastGoodBlock, newValue ); |
| #endif |
| |
| if ( (LastGoodBlock == -1) || (newValue < LastGoodBlock) ) |
| @@ -713,19 +720,20 @@ |
| |
| // wake up all other possibly blocked on cond threads |
| pthread_cond_broadcast(notTooMuchNumBuffered); |
| + safe_mutex_unlock(OutMutex); |
| + |
| if (FifoQueue != NULL) |
| { |
| + safe_mutex_lock(FifoQueue->mut); |
| pthread_cond_broadcast(FifoQueue->notFull); |
| pthread_cond_broadcast(FifoQueue->notEmpty); |
| + safe_mutex_unlock(FifoQueue->mut); |
| } |
| } |
| -} |
| - |
| -inline void syncSetLastGoodBlock(int newValue) |
| -{ |
| - safe_mutex_lock(OutMutex); |
| - setLastGoodBlock(newValue); |
| - safe_mutex_unlock(OutMutex); |
| + else |
| + { |
| + safe_mutex_unlock(OutMutex); |
| + } |
| } |
| |
| inline int syncGetLastGoodBlock() |
| @@ -1299,7 +1307,9 @@ |
| |
| if (producerDecompressCheckInterrupt(hInfile, fileData, NumBlocks) != 0) |
| { |
| + safe_mutex_lock(fifo->mut); |
| safe_cond_broadcast(fifo->notEmpty); // just in case |
| + safe_mutex_unlock(fifo->mut); |
| syncSetProducerDone(1); |
| return 0; |
| } |
| @@ -1368,7 +1378,9 @@ |
| } |
| |
| syncSetProducerDone(1); |
| + safe_mutex_lock(fifo->mut); |
| safe_cond_broadcast(fifo->notEmpty); // just in case |
| + safe_mutex_unlock(fifo->mut); |
| |
| #ifdef PBZIP_DEBUG |
| fprintf(stderr, "producer: Done - exiting. Last Block: %d\n", NumBlocks); |
| @@ -1918,10 +1930,14 @@ |
| // wake up all other possibly blocked on cond threads |
| if (FifoQueue != NULL) |
| { |
| + safe_mutex_lock(FifoQueue->mut); |
| safe_cond_broadcast(FifoQueue->notEmpty); // important |
| safe_cond_broadcast(FifoQueue->notFull); // not really needed |
| + safe_mutex_unlock(FifoQueue->mut); |
| } |
| + safe_mutex_lock(OutMutex); |
| safe_cond_broadcast(notTooMuchNumBuffered); // not really needed |
| + safe_mutex_unlock(OutMutex); |
| |
| if (QuietMode != 1) |
| { |
| @@ -2559,7 +2575,9 @@ |
| close(hInfile); |
| |
| syncSetProducerDone(1); |
| + safe_mutex_lock(fifo->mut); |
| safe_cond_broadcast(fifo->notEmpty); // just in case |
| + safe_mutex_unlock(fifo->mut); |
| |
| #ifdef PBZIP_DEBUG |
| fprintf(stderr, "producer: Done - exiting. Num Blocks: %d\n", NumBlocks); |