diff options
author | 2017-10-30 12:28:58 -0400 | |
---|---|---|
committer | 2017-10-30 12:28:58 -0400 | |
commit | 62e6b1c444916da1c1e725bb5e5952488b1692ca (patch) | |
tree | 6cf9b148e5e495f388f1fb0f431a23bffb0edcf2 /src | |
parent | c58952649f27b064ceabedafc84096b5d137d361 (diff) |
Use pthreads on posix
Use pthreads on posix instead of relying on thread local support
Diffstat (limited to 'src')
-rw-r--r-- | src/core/lib/support/cpu_posix.cc | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/src/core/lib/support/cpu_posix.cc b/src/core/lib/support/cpu_posix.cc index 503a96b4c8..c32ca4659c 100644 --- a/src/core/lib/support/cpu_posix.cc +++ b/src/core/lib/support/cpu_posix.cc @@ -18,19 +18,20 @@ #include <grpc/support/port_platform.h> -#ifdef GPR_CPU_POSIX +#if defined(GPR_CPU_POSIX) #include <errno.h> +#include <pthread.h> #include <string.h> #include <unistd.h> +#include <atomic> + #include <grpc/support/cpu.h> #include <grpc/support/log.h> #include <grpc/support/sync.h> #include <grpc/support/useful.h> -static __thread char magic_thread_local; - static long ncpus = 0; static void init_ncpus() { @@ -52,7 +53,27 @@ unsigned gpr_cpu_current_cpu(void) { most code that's using this is using it to shard across work queues though, so here we use thread identity instead to achieve a similar though not identical effect */ - return (unsigned)GPR_HASH_POINTER(&magic_thread_local, gpr_cpu_num_cores()); + static auto DeleteValue = [](void *value_ptr) { + unsigned int *value = static_cast<unsigned int *>(value_ptr); + if (value) { + delete value; + } + }; + static pthread_key_t thread_id_key; + static int thread_id_key_create_result __attribute__((unused)) = + pthread_key_create(&thread_id_key, DeleteValue); + // pthread_t isn't portably defined to map to an integral type. So keep track + // of thread identity explicitly so hashing works reliably. + static std::atomic<unsigned int> thread_counter(0); + + unsigned int *thread_id = + static_cast<unsigned int *>(pthread_getspecific(thread_id_key)); + if (thread_id == nullptr) { + thread_id = new unsigned int(thread_counter++); + pthread_setspecific(thread_id_key, thread_id); + } + + return (unsigned)GPR_HASH_POINTER(*thread_id, gpr_cpu_num_cores()); } #endif /* GPR_CPU_POSIX */ |