| |
| /* |
| * Copyright (C) Igor Sysoev |
| */ |
| |
| |
| #ifndef _NGX_THREAD_H_INCLUDED_ |
| #define _NGX_THREAD_H_INCLUDED_ |
| |
| |
| #include <ngx_config.h> |
| #include <ngx_core.h> |
| |
| #if (NGX_THREADS) |
| |
| #define NGX_MAX_THREADS 128 |
| |
| #if (NGX_USE_RFORK) |
| #include <ngx_freebsd_rfork_thread.h> |
| |
| |
| #else /* use pthreads */ |
| |
| #include <pthread.h> |
| |
| typedef pthread_t ngx_tid_t; |
| |
| #define ngx_thread_self() pthread_self() |
| #define ngx_log_tid (int) ngx_thread_self() |
| |
| #if (NGX_FREEBSD) && !(NGX_LINUXTHREADS) |
| #define NGX_TID_T_FMT "%p" |
| #else |
| #define NGX_TID_T_FMT "%d" |
| #endif |
| |
| |
| typedef pthread_key_t ngx_tls_key_t; |
| |
| #define ngx_thread_key_create(key) pthread_key_create(key, NULL) |
| #define ngx_thread_key_create_n "pthread_key_create()" |
| #define ngx_thread_set_tls pthread_setspecific |
| #define ngx_thread_set_tls_n "pthread_setspecific()" |
| #define ngx_thread_get_tls pthread_getspecific |
| |
| |
| #define NGX_MUTEX_LIGHT 0 |
| |
| typedef struct { |
| pthread_mutex_t mutex; |
| ngx_log_t *log; |
| } ngx_mutex_t; |
| |
| typedef struct { |
| pthread_cond_t cond; |
| ngx_log_t *log; |
| } ngx_cond_t; |
| |
| #define ngx_thread_sigmask pthread_sigmask |
| #define ngx_thread_sigmask_n "pthread_sigmask()" |
| |
| #define ngx_thread_join(t, p) pthread_join(t, p) |
| |
| #define ngx_setthrtitle(n) |
| |
| |
| |
| ngx_int_t ngx_mutex_trylock(ngx_mutex_t *m); |
| void ngx_mutex_lock(ngx_mutex_t *m); |
| void ngx_mutex_unlock(ngx_mutex_t *m); |
| |
| #endif |
| |
| |
| #define ngx_thread_volatile volatile |
| |
| |
| typedef struct { |
| ngx_tid_t tid; |
| ngx_cond_t *cv; |
| ngx_uint_t state; |
| } ngx_thread_t; |
| |
| #define NGX_THREAD_FREE 1 |
| #define NGX_THREAD_BUSY 2 |
| #define NGX_THREAD_EXIT 3 |
| #define NGX_THREAD_DONE 4 |
| |
| extern ngx_int_t ngx_threads_n; |
| extern volatile ngx_thread_t ngx_threads[NGX_MAX_THREADS]; |
| |
| |
| typedef void * ngx_thread_value_t; |
| |
| ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle); |
| ngx_err_t ngx_create_thread(ngx_tid_t *tid, |
| ngx_thread_value_t (*func)(void *arg), void *arg, ngx_log_t *log); |
| |
| ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags); |
| void ngx_mutex_destroy(ngx_mutex_t *m); |
| |
| |
| ngx_cond_t *ngx_cond_init(ngx_log_t *log); |
| void ngx_cond_destroy(ngx_cond_t *cv); |
| ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m); |
| ngx_int_t ngx_cond_signal(ngx_cond_t *cv); |
| |
| |
| #else /* !NGX_THREADS */ |
| |
| #define ngx_thread_volatile |
| |
| #define ngx_log_tid 0 |
| #define NGX_TID_T_FMT "%d" |
| |
| #define ngx_mutex_trylock(m) NGX_OK |
| #define ngx_mutex_lock(m) |
| #define ngx_mutex_unlock(m) |
| |
| #define ngx_cond_signal(cv) |
| |
| #define ngx_thread_main() 1 |
| |
| #endif |
| |
| |
| |
| #endif /* _NGX_THREAD_H_INCLUDED_ */ |