ovs-thread: Add wrappers for "destroy" functions too.
[cascardo/ovs.git] / lib / ovs-thread.h
1 /*
2  * Copyright (c) 2013 Nicira, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef OVS_THREAD_H
18 #define OVS_THREAD_H 1
19
20 #include <pthread.h>
21 #include <stddef.h>
22 #include <sys/types.h>
23 #include "ovs-atomic.h"
24 #include "util.h"
25
26 /* glibc has some non-portable mutex types and initializers:
27  *
28  *    - PTHREAD_MUTEX_ADAPTIVE_NP is a mutex type that works as a spinlock that
29  *      falls back to a mutex after spinning for some number of iterations.
30  *
31  *    - PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP is a non-portable initializer
32  *      for an error-checking mutex.
33  *
34  * We use these definitions to fall back to PTHREAD_MUTEX_NORMAL instead in
35  * these cases.
36  *
37  * (glibc has other non-portable initializers, but we can't reasonably
38  * substitute for them here.) */
39 #ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
40 #define PTHREAD_MUTEX_ADAPTIVE PTHREAD_MUTEX_ADAPTIVE_NP
41 #define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER \
42     PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
43 #else
44 #define PTHREAD_MUTEX_ADAPTIVE PTHREAD_MUTEX_NORMAL
45 #define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
46 #endif
47
48 #ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
49 #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER \
50     PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
51 #else
52 #define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
53 #endif
54 \f
55 /* Simple wrappers for pthreads functions.  Most of these functions abort the
56  * process with an error message on any error.  The *_trylock() functions are
57  * exceptions: they pass through a 0 or EBUSY return value to the caller and
58  * abort on any other error. */
59
60 void xpthread_mutex_init(pthread_mutex_t *, pthread_mutexattr_t *);
61 void xpthread_mutex_destroy(pthread_mutex_t *);
62 void xpthread_mutex_lock(pthread_mutex_t *mutex) OVS_ACQUIRES(mutex);
63 void xpthread_mutex_unlock(pthread_mutex_t *mutex) OVS_RELEASES(mutex);
64 int xpthread_mutex_trylock(pthread_mutex_t *);
65
66 void xpthread_mutexattr_init(pthread_mutexattr_t *);
67 void xpthread_mutexattr_destroy(pthread_mutexattr_t *);
68 void xpthread_mutexattr_settype(pthread_mutexattr_t *, int type);
69 void xpthread_mutexattr_gettype(pthread_mutexattr_t *, int *typep);
70
71 void xpthread_rwlock_init(pthread_rwlock_t *, pthread_rwlockattr_t *);
72 void xpthread_rwlock_destroy(pthread_rwlock_t *);
73 void xpthread_rwlock_rdlock(pthread_rwlock_t *rwlock) OVS_ACQUIRES(rwlock);
74 void xpthread_rwlock_wrlock(pthread_rwlock_t *rwlock) OVS_ACQUIRES(rwlock);
75 void xpthread_rwlock_unlock(pthread_rwlock_t *rwlock) OVS_RELEASES(rwlock);
76 int xpthread_rwlock_tryrdlock(pthread_rwlock_t *);
77 int xpthread_rwlock_trywrlock(pthread_rwlock_t *);
78
79 void xpthread_cond_init(pthread_cond_t *, pthread_condattr_t *);
80 void xpthread_cond_destroy(pthread_cond_t *);
81 void xpthread_cond_signal(pthread_cond_t *);
82 void xpthread_cond_broadcast(pthread_cond_t *);
83 void xpthread_cond_wait(pthread_cond_t *, pthread_mutex_t *mutex)
84     OVS_MUST_HOLD(mutex);
85
86 #ifdef __CHECKER__
87 /* Replace these functions by the macros already defined in the <pthread.h>
88  * annotations, because the macro definitions have correct semantics for the
89  * conditional acquisition that can't be captured in a function annotation.
90  * The difference in semantics from pthread_*() to xpthread_*() does not matter
91  * because sparse is not a compiler. */
92 #define xpthread_mutex_trylock pthread_mutex_trylock
93 #define xpthread_rwlock_tryrdlock pthread_rwlock_tryrdlock
94 #define xpthread_rwlock_trywrlock pthread_rwlock_trywrlock
95 #endif
96
97 void xpthread_key_create(pthread_key_t *, void (*destructor)(void *));
98
99 void xpthread_create(pthread_t *, pthread_attr_t *, void *(*)(void *), void *);
100 \f
101 /* Per-thread data.
102  *
103  * Multiple forms of per-thread data exist, each with its own pluses and
104  * minuses:
105  *
106  *     - POSIX per-thread data via pthread_key_t is portable to any pthreads
107  *       implementation, and allows a destructor function to be defined.  It
108  *       only (directly) supports per-thread pointers, which are always
109  *       initialized to NULL.  It requires once-only allocation of a
110  *       pthread_key_t value.  It is relatively slow.
111  *
112  *     - The thread_local feature newly defined in C11 <threads.h> works with
113  *       any data type and initializer, and it is fast.  thread_local does not
114  *       require once-only initialization like pthread_key_t.  C11 does not
115  *       define what happens if one attempts to access a thread_local object
116  *       from a thread other than the one to which that object belongs.  There
117  *       is no provision to call a user-specified destructor when a thread
118  *       ends.
119  *
120  *     - The __thread keyword is a GCC extension similar to thread_local but
121  *       with a longer history.  __thread is not portable to every GCC version
122  *       or environment.  __thread does not restrict the use of a thread-local
123  *       object outside its own thread.
124  *
125  * Here's a handy summary:
126  *
127  *                     pthread_key_t     thread_local       __thread
128  *                     -------------     ------------     -------------
129  * portability             high               low             medium
130  * speed                    low              high               high
131  * supports destructors?    yes                no                 no
132  * needs key allocation?    yes                no                 no
133  * arbitrary initializer?    no               yes                yes
134  * cross-thread access?     yes                no                yes
135  */
136
137 /* DEFINE_PER_THREAD_DATA(TYPE, NAME, INITIALIZER).
138  *
139  * One should prefer to use POSIX per-thread data, via pthread_key_t, when its
140  * performance is acceptable, because of its portability (see the table above).
141  * This macro is an alternatives that takes advantage of thread_local (and
142  * __thread), for its performance, when it is available, and falls back to
143  * POSIX per-thread data otherwise.
144  *
145  * Defines per-thread variable NAME with the given TYPE, initialized to
146  * INITIALIZER (which must be valid as an initializer for a variable with
147  * static lifetime).
148  *
149  * The public interface to the variable is:
150  *
151  *    TYPE *NAME_get(void)
152  *    TYPE *NAME_get_unsafe(void)
153  *
154  *       Returns the address of this thread's instance of NAME.
155  *
156  *       Use NAME_get() in a context where this might be the first use of the
157  *       per-thread variable in the program.  Use NAME_get_unsafe(), which
158  *       avoids a conditional test and is thus slightly faster, in a context
159  *       where one knows that NAME_get() has already been called previously.
160  *
161  * There is no "NAME_set()" (or "NAME_set_unsafe()") function.  To set the
162  * value of the per-thread variable, dereference the pointer returned by
163  * TYPE_get() or TYPE_get_unsafe(), e.g. *TYPE_get() = 0.
164  */
165 #if HAVE_THREAD_LOCAL || HAVE___THREAD
166
167 #if HAVE_THREAD_LOCAL
168 #include <threads.h>
169 #elif HAVE___THREAD
170 #define thread_local __thread
171 #else
172 #error
173 #endif
174
175 #define DEFINE_PER_THREAD_DATA(TYPE, NAME, ...)                 \
176     typedef TYPE NAME##_type;                                   \
177     static thread_local NAME##_type NAME##_var = __VA_ARGS__;   \
178                                                                 \
179     static NAME##_type *                                        \
180     NAME##_get_unsafe(void)                                     \
181     {                                                           \
182         return &NAME##_var;                                     \
183     }                                                           \
184                                                                 \
185     static NAME##_type *                                        \
186     NAME##_get(void)                                            \
187     {                                                           \
188         return NAME##_get_unsafe();                             \
189     }
190 #else  /* no C implementation support for thread-local storage  */
191 #define DEFINE_PER_THREAD_DATA(TYPE, NAME, ...)                         \
192     typedef TYPE NAME##_type;                                           \
193     static pthread_key_t NAME##_key;                                    \
194                                                                         \
195     static NAME##_type *                                                \
196     NAME##_get_unsafe(void)                                             \
197     {                                                                   \
198         return pthread_getspecific(NAME##_key);                         \
199     }                                                                   \
200                                                                         \
201     static void                                                         \
202     NAME##_once_init(void)                                              \
203     {                                                                   \
204         if (pthread_key_create(&NAME##_key, free)) {                    \
205             abort();                                                    \
206         }                                                               \
207     }                                                                   \
208                                                                         \
209     static NAME##_type *                                                \
210     NAME##_get(void)                                                    \
211     {                                                                   \
212         static pthread_once_t once = PTHREAD_ONCE_INIT;                 \
213         NAME##_type *value;                                             \
214                                                                         \
215         pthread_once(&once, NAME##_once_init);                          \
216         value = NAME##_get_unsafe();                                    \
217         if (!value) {                                                   \
218             static const NAME##_type initial_value = __VA_ARGS__;       \
219                                                                         \
220             value = xmalloc(sizeof *value);                             \
221             *value = initial_value;                                     \
222             pthread_setspecific(NAME##_key, value);                     \
223         }                                                               \
224         return value;                                                   \
225     }
226 #endif
227
228 /* DEFINE_PER_THREAD_MALLOCED_DATA(TYPE, NAME).
229  *
230  * This is a simple wrapper around POSIX per-thread data primitives.  It
231  * defines per-thread variable NAME with the given TYPE, which must be a
232  * pointer type.  In each thread, the per-thread variable is initialized to
233  * NULL.  When a thread terminates, the variable is freed with free().
234  *
235  * The public interface to the variable is:
236  *
237  *    TYPE NAME_get(void)
238  *    TYPE NAME_get_unsafe(void)
239  *
240  *       Returns the value of per-thread variable NAME in this thread.
241  *
242  *       Use NAME_get() in a context where this might be the first use of the
243  *       per-thread variable in the program.  Use NAME_get_unsafe(), which
244  *       avoids a conditional test and is thus slightly faster, in a context
245  *       where one knows that NAME_get() has already been called previously.
246  *
247  *    TYPE NAME_set(TYPE new_value)
248  *    TYPE NAME_set_unsafe(TYPE new_value)
249  *
250  *       Sets the value of per-thread variable NAME to 'new_value' in this
251  *       thread, and returns its previous value.
252  *
253  *       Use NAME_set() in a context where this might be the first use of the
254  *       per-thread variable in the program.  Use NAME_set_unsafe(), which
255  *       avoids a conditional test and is thus slightly faster, in a context
256  *       where one knows that NAME_set() has already been called previously.
257  */
258 #define DEFINE_PER_THREAD_MALLOCED_DATA(TYPE, NAME)     \
259     static pthread_key_t NAME##_key;                    \
260                                                         \
261     static void                                         \
262     NAME##_once_init(void)                              \
263     {                                                   \
264         if (pthread_key_create(&NAME##_key, free)) {    \
265             abort();                                    \
266         }                                               \
267     }                                                   \
268                                                         \
269     static void                                         \
270     NAME##_init(void)                                   \
271     {                                                   \
272         static pthread_once_t once = PTHREAD_ONCE_INIT; \
273         pthread_once(&once, NAME##_once_init);          \
274     }                                                   \
275                                                         \
276     static TYPE                                         \
277     NAME##_get_unsafe(void)                             \
278     {                                                   \
279         return pthread_getspecific(NAME##_key);         \
280     }                                                   \
281                                                         \
282     static OVS_UNUSED TYPE                              \
283     NAME##_get(void)                                    \
284     {                                                   \
285         NAME##_init();                                  \
286         return NAME##_get_unsafe();                     \
287     }                                                   \
288                                                         \
289     static TYPE                                         \
290     NAME##_set_unsafe(TYPE value)                       \
291     {                                                   \
292         TYPE old_value = NAME##_get_unsafe();           \
293         pthread_setspecific(NAME##_key, value);         \
294         return old_value;                               \
295     }                                                   \
296                                                         \
297     static OVS_UNUSED TYPE                              \
298     NAME##_set(TYPE value)                              \
299     {                                                   \
300         NAME##_init();                                  \
301         return NAME##_set_unsafe(value);                \
302     }
303 \f
304 /* Convenient once-only execution.
305  *
306  *
307  * Problem
308  * =======
309  *
310  * POSIX provides pthread_once_t and pthread_once() as primitives for running a
311  * set of code only once per process execution.  They are used like this:
312  *
313  *     static void run_once(void) { ...initialization... }
314  *     static pthread_once_t once = PTHREAD_ONCE_INIT;
315  * ...
316  *     pthread_once(&once, run_once);
317  *
318  * pthread_once() does not allow passing any parameters to the initialization
319  * function, which is often inconvenient, because it means that the function
320  * can only access data declared at file scope.
321  *
322  *
323  * Solution
324  * ========
325  *
326  * Use ovsthread_once, like this, instead:
327  *
328  *     static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
329  *
330  *     if (ovsthread_once_start(&once)) {
331  *         ...initialization...
332  *         ovsthread_once_done(&once);
333  *     }
334  */
335
336 struct ovsthread_once {
337     atomic_bool done;
338     pthread_mutex_t mutex;
339 };
340
341 #define OVSTHREAD_ONCE_INITIALIZER              \
342     {                                           \
343         ATOMIC_VAR_INIT(false),                 \
344         PTHREAD_ADAPTIVE_MUTEX_INITIALIZER,     \
345     }
346
347 static inline bool ovsthread_once_start(struct ovsthread_once *);
348 void ovsthread_once_done(struct ovsthread_once *once) OVS_RELEASES(once);
349
350 bool ovsthread_once_start__(struct ovsthread_once *);
351
352 static inline bool
353 ovsthread_once_is_done__(const struct ovsthread_once *once)
354 {
355     bool done;
356
357     atomic_read_explicit(&once->done, &done, memory_order_relaxed);
358     return done;
359 }
360
361 /* Returns true if this is the first call to ovsthread_once_start() for
362  * 'once'.  In this case, the caller should perform whatever initialization
363  * actions it needs to do, then call ovsthread_once_done() for 'once'.
364  *
365  * Returns false if this is not the first call to ovsthread_once_start() for
366  * 'once'.  In this case, the call will not return until after
367  * ovsthread_once_done() has been called. */
368 static inline bool
369 ovsthread_once_start(struct ovsthread_once *once)
370 {
371     return OVS_UNLIKELY(!ovsthread_once_is_done__(once)
372                         && !ovsthread_once_start__(once));
373 }
374
375 #ifdef __CHECKER__
376 #define ovsthread_once_start(ONCE) \
377     ((ONCE)->done ? false : ({ OVS_ACQUIRE(ONCE); true; }))
378 #endif
379 \f
380 void assert_single_threaded(const char *where);
381 #define assert_single_threaded() assert_single_threaded(SOURCE_LOCATOR)
382
383 pid_t xfork(const char *where);
384 #define xfork() xfork(SOURCE_LOCATOR)
385
386 void forbid_forking(const char *reason);
387 bool may_fork(void);
388
389 #endif /* ovs-thread.h */