diff options
author | 2018-02-08 15:18:13 -0800 | |
---|---|---|
committer | 2018-02-08 15:18:13 -0800 | |
commit | 0693b72b7fdf7927ad120319ce53b4cf78cc11c9 (patch) | |
tree | 9af4eeefbf4e7c98ccd5264eb7280a26f637e18c /src/core/lib/gpr | |
parent | 5122487fad891fdf5560122285c1690a06df73d2 (diff) | |
parent | bf19c3332161b26f3942ed7b3a711bdc4dd923bc (diff) |
Merge branch 'master' into gpr_review
Diffstat (limited to 'src/core/lib/gpr')
-rw-r--r-- | src/core/lib/gpr/tls.h | 68 | ||||
-rw-r--r-- | src/core/lib/gpr/tls_gcc.h | 50 | ||||
-rw-r--r-- | src/core/lib/gpr/tls_msvc.h | 50 | ||||
-rw-r--r-- | src/core/lib/gpr/tls_pthread.cc | 2 | ||||
-rw-r--r-- | src/core/lib/gpr/tls_pthread.h | 54 |
5 files changed, 223 insertions, 1 deletions
diff --git a/src/core/lib/gpr/tls.h b/src/core/lib/gpr/tls.h new file mode 100644 index 0000000000..aee8f4d941 --- /dev/null +++ b/src/core/lib/gpr/tls.h @@ -0,0 +1,68 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_TLS_H +#define GRPC_CORE_LIB_GPR_TLS_H + +#include <grpc/support/port_platform.h> + +/** Thread local storage. + + A minimal wrapper that should be implementable across many compilers, + and implementable efficiently across most modern compilers. + + Thread locals have type intptr_t. + + Declaring a thread local variable 'foo': + GPR_TLS_DECL(foo); + Thread locals always have static scope. + + Declaring a thread local class variable 'foo': + GPR_TLS_CLASS_DECL(foo); + + Defining the thread local class variable: + GPR_TLS_CLASS_DEF(foo); + + Initializing a thread local (must be done at library initialization + time): + gpr_tls_init(&foo); + + Destroying a thread local: + gpr_tls_destroy(&foo); + + Setting a thread local (returns new_value): + gpr_tls_set(&foo, new_value); + + Accessing a thread local: + current_value = gpr_tls_get(&foo); + + ALL functions here may be implemented as macros. */ + +#ifdef GPR_GCC_TLS +#include "src/core/lib/gpr/tls_gcc.h" +#endif + +#ifdef GPR_MSVC_TLS +#include "src/core/lib/gpr/tls_msvc.h" +#endif + +#ifdef GPR_PTHREAD_TLS +#include "src/core/lib/gpr/tls_pthread.h" +#endif + +#endif /* GRPC_CORE_LIB_GPR_TLS_H */ diff --git a/src/core/lib/gpr/tls_gcc.h b/src/core/lib/gpr/tls_gcc.h new file mode 100644 index 0000000000..14c59eca55 --- /dev/null +++ b/src/core/lib/gpr/tls_gcc.h @@ -0,0 +1,50 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_TLS_GCC_H +#define GRPC_CORE_LIB_GPR_TLS_GCC_H + +#include <stdbool.h> + +#include <grpc/support/log.h> + +/** Thread local storage based on gcc compiler primitives. + #include tls.h to use this - and see that file for documentation */ + +struct gpr_gcc_thread_local { + intptr_t value; +}; + +#define GPR_TLS_DECL(name) \ + static __thread struct gpr_gcc_thread_local name = {0} + +#define GPR_TLS_CLASS_DECL(name) \ + static __thread struct gpr_gcc_thread_local name + +#define GPR_TLS_CLASS_DEF(name) __thread struct gpr_gcc_thread_local name = {0} + +#define gpr_tls_init(tls) \ + do { \ + } while (0) +#define gpr_tls_destroy(tls) \ + do { \ + } while (0) +#define gpr_tls_set(tls, new_value) (((tls)->value) = (new_value)) +#define gpr_tls_get(tls) ((tls)->value) + +#endif /* GRPC_CORE_LIB_GPR_TLS_GCC_H */ diff --git a/src/core/lib/gpr/tls_msvc.h b/src/core/lib/gpr/tls_msvc.h new file mode 100644 index 0000000000..a6cc4174be --- /dev/null +++ b/src/core/lib/gpr/tls_msvc.h @@ -0,0 +1,50 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_TLS_MSVC_H +#define GRPC_CORE_LIB_GPR_TLS_MSVC_H + +/** Thread local storage based on ms visual c compiler primitives. + #include tls.h to use this - and see that file for documentation */ + +struct gpr_msvc_thread_local { + intptr_t value; +}; + +/** Use GPR_TLS_DECL to declare tls static variables outside a class */ +#define GPR_TLS_DECL(name) \ + static __declspec(thread) struct gpr_msvc_thread_local name = {0} + +/** Use GPR_TLS_CLASS_DECL to declare tls static variable members of a class. + * GPR_TLS_CLASS_DEF needs to be called to define this member. */ +#define GPR_TLS_CLASS_DECL(name) \ + static __declspec(thread) struct gpr_msvc_thread_local name + +#define GPR_TLS_CLASS_DEF(name) \ + __declspec(thread) struct gpr_msvc_thread_local name = {0} + +#define gpr_tls_init(tls) \ + do { \ + } while (0) +#define gpr_tls_destroy(tls) \ + do { \ + } while (0) +#define gpr_tls_set(tls, new_value) (((tls)->value) = (new_value)) +#define gpr_tls_get(tls) ((tls)->value) + +#endif /* GRPC_CORE_LIB_GPR_TLS_MSVC_H */ diff --git a/src/core/lib/gpr/tls_pthread.cc b/src/core/lib/gpr/tls_pthread.cc index ebeef2a8c2..2e5b306909 100644 --- a/src/core/lib/gpr/tls_pthread.cc +++ b/src/core/lib/gpr/tls_pthread.cc @@ -20,7 +20,7 @@ #ifdef GPR_PTHREAD_TLS -#include <grpc/support/tls.h> +#include "src/core/lib/gpr/tls.h" intptr_t gpr_tls_set(struct gpr_pthread_thread_local* tls, intptr_t value) { GPR_ASSERT(0 == pthread_setspecific(tls->key, (void*)value)); diff --git a/src/core/lib/gpr/tls_pthread.h b/src/core/lib/gpr/tls_pthread.h new file mode 100644 index 0000000000..9202653dcb --- /dev/null +++ b/src/core/lib/gpr/tls_pthread.h @@ -0,0 +1,54 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_TLS_PTHREAD_H +#define GRPC_CORE_LIB_GPR_TLS_PTHREAD_H + +#include <grpc/support/log.h> /* for GPR_ASSERT */ +#include <pthread.h> + +/** Thread local storage based on pthread library calls. + #include tls.h to use this - and see that file for documentation */ + +struct gpr_pthread_thread_local { + pthread_key_t key; +}; + +/** Use GPR_TLS_DECL to declare tls static variables outside a class */ +#define GPR_TLS_DECL(name) static struct gpr_pthread_thread_local name = {0} + +/** Use GPR_TLS_CLASS_DECL to declare tls static variable members of a class. + * GPR_TLS_CLASS_DEF needs to be called to define this member. */ +#define GPR_TLS_CLASS_DECL(name) static struct gpr_pthread_thread_local name + +/** Use GPR_TLS_CLASS_DEF to declare tls static variable members of a class. + * GPR_TLS_CLASS_DEF needs to be called to define this member. */ +#define GPR_TLS_CLASS_DEF(name) struct gpr_pthread_thread_local name = {0} + +#define gpr_tls_init(tls) GPR_ASSERT(0 == pthread_key_create(&(tls)->key, NULL)) +#define gpr_tls_destroy(tls) pthread_key_delete((tls)->key) +#define gpr_tls_get(tls) ((intptr_t)pthread_getspecific((tls)->key)) +#ifdef __cplusplus +extern "C" { +#endif +intptr_t gpr_tls_set(struct gpr_pthread_thread_local* tls, intptr_t value); +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_CORE_LIB_GPR_TLS_PTHREAD_H */ |