Index: native_client_sdk/src/examples/demo/voronoi/threadpool.cc |
=================================================================== |
--- native_client_sdk/src/examples/demo/voronoi/threadpool.cc (revision 203001) |
+++ native_client_sdk/src/examples/demo/voronoi/threadpool.cc (working copy) |
@@ -9,7 +9,7 @@ |
#include <stdio.h> |
#include <stdlib.h> |
-// TODO(nfullagar): Switch DecCounter to use atomic decrement. |
+#include "utils/auto_lock.h" |
// Initializes mutex, semaphores and a pool of threads. If 0 is passed for |
// num_threads, all work will be performed on the dispatch thread. |
@@ -18,11 +18,6 @@ |
user_data_(NULL), user_work_function_(NULL) { |
if (num_threads_ > 0) { |
int status; |
- status = pthread_mutex_init(&mutex_, NULL); |
- if (0 != status) { |
- fprintf(stderr, "Failed to initialize mutex!\n"); |
- exit(-1); |
- } |
status = sem_init(&work_sem_, 0, 0); |
if (-1 == status) { |
fprintf(stderr, "Failed to initialize semaphore!\n"); |
@@ -46,12 +41,11 @@ |
// Post exit request, wait for all threads to join, and cleanup. |
ThreadPool::~ThreadPool() { |
- if (num_threads_ > 1) { |
+ if (num_threads_ > 0) { |
PostExitAndJoinAll(); |
delete[] threads_; |
sem_destroy(&done_sem_); |
sem_destroy(&work_sem_); |
- pthread_mutex_destroy(&mutex_); |
} |
} |
@@ -63,16 +57,18 @@ |
user_data_ = data; |
} |
-// Decrement and get the value of the mutex protected counter. This function |
+// Return decremented task counter. This function |
// can be called from multiple threads at any given time. |
int ThreadPool::DecCounter() { |
- int v; |
- pthread_mutex_lock(&mutex_); |
- { |
- v = --counter_; |
- } |
- pthread_mutex_unlock(&mutex_); |
- return v; |
+#if defined(__native_client__) |
+ // Use fast atomic sub & fetch. |
+ return __sync_sub_and_fetch(&counter_, 1); |
+#else |
+ // Fallback to a more platform independent pthread mutex via AutoLock. |
+ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; |
+ AutoLock lock(&mutex); |
+ return --counter_; |
+#endif |
} |
// Set exit flag, post and join all the threads in the pool. This function is |