diff options
Diffstat (limited to 'src/os/unix')
-rw-r--r-- | src/os/unix/ngx_channel.c | 7 | ||||
-rw-r--r-- | src/os/unix/ngx_errno.h | 2 | ||||
-rw-r--r-- | src/os/unix/ngx_freebsd_rfork_thread.c | 45 | ||||
-rw-r--r-- | src/os/unix/ngx_freebsd_rfork_thread.h | 31 | ||||
-rw-r--r-- | src/os/unix/ngx_process_cycle.c | 27 | ||||
-rw-r--r-- | src/os/unix/ngx_thread.h | 25 |
6 files changed, 93 insertions, 44 deletions
diff --git a/src/os/unix/ngx_channel.c b/src/os/unix/ngx_channel.c index ff0aeccb0..01416d6ab 100644 --- a/src/os/unix/ngx_channel.c +++ b/src/os/unix/ngx_channel.c @@ -194,6 +194,13 @@ ngx_int_t ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, rev->data = c; wev->data = c; +#if (NGX_THREADS) + rev->lock = &c->lock; + wev->lock = &c->lock; + rev->own_lock = &c->lock; + wev->own_lock = &c->lock; +#endif + ev = (event == NGX_READ_EVENT) ? rev : wev; ev->event_handler = handler; diff --git a/src/os/unix/ngx_errno.h b/src/os/unix/ngx_errno.h index 375b43d2f..f539a1225 100644 --- a/src/os/unix/ngx_errno.h +++ b/src/os/unix/ngx_errno.h @@ -12,10 +12,12 @@ typedef int ngx_err_t; #define NGX_ESRCH ESRCH #define NGX_EINTR EINTR #define NGX_ECHILD ECHILD +#define NGX_ENOMEM ENOMEM #define NGX_EACCES EACCES #define NGX_EBUSY EBUSY #define NGX_EEXIST EEXIST #define NGX_ENOTDIR ENOTDIR +#define NGX_EINVAL EINVAL #define NGX_EPIPE EPIPE #define NGX_EAGAIN EWOULDBLOCK #define NGX_EINPROGRESS EINPROGRESS diff --git a/src/os/unix/ngx_freebsd_rfork_thread.c b/src/os/unix/ngx_freebsd_rfork_thread.c index bb638fa62..5f651c38b 100644 --- a/src/os/unix/ngx_freebsd_rfork_thread.c +++ b/src/os/unix/ngx_freebsd_rfork_thread.c @@ -30,18 +30,20 @@ */ -char *ngx_freebsd_kern_usrstack; -size_t ngx_thread_stack_size; +char *ngx_freebsd_kern_usrstack; +size_t ngx_thread_stack_size; -static size_t rz_size; -static size_t usable_stack_size; -static char *last_stack; +static size_t rz_size; +static size_t usable_stack_size; +static char *last_stack; -static ngx_uint_t nthreads; -static ngx_uint_t max_threads; -static ngx_tid_t *tids; /* the threads tids array */ -void **ngx_tls; /* the threads tls's array */ +static ngx_uint_t nthreads; +static ngx_uint_t max_threads; + +static ngx_uint_t nkeys; +static ngx_tid_t *tids; /* the threads tids array */ +void **ngx_tls; /* the threads tls's array */ /* the thread-safe libc errno */ @@ -236,7 +238,9 @@ ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle) /* create the threads tls's array */ - if (!(ngx_tls = ngx_calloc((n + 1) * sizeof(void *), cycle->log))) { + ngx_tls = ngx_calloc(NGX_THREAD_KEYS_MAX * (n + 1) * sizeof(void *), + cycle->log); + if (ngx_tls == NULL) { return NGX_ERROR; } @@ -270,11 +274,26 @@ ngx_tid_t ngx_thread_self() } -ngx_int_t ngx_thread_set_tls(void *value) +ngx_int_t ngx_thread_key_create(ngx_tls_key_t *key) { - ngx_tls[ngx_gettid()] = value; + if (nkeys >= NGX_THREAD_KEYS_MAX) { + return NGX_ENOMEM; + } - return NGX_OK; + *key = nkeys++; + + return 0; +} + + +ngx_int_t ngx_thread_set_tls(ngx_tls_key_t key, void *value) +{ + if (key >= NGX_THREAD_KEYS_MAX) { + return NGX_EINVAL; + } + + ngx_tls[key * NGX_THREAD_KEYS_MAX + ngx_gettid()] = value; + return 0; } diff --git a/src/os/unix/ngx_freebsd_rfork_thread.h b/src/os/unix/ngx_freebsd_rfork_thread.h index c9ae99c09..ce68a4efc 100644 --- a/src/os/unix/ngx_freebsd_rfork_thread.h +++ b/src/os/unix/ngx_freebsd_rfork_thread.h @@ -13,14 +13,6 @@ typedef pid_t ngx_tid_t; #define ngx_log_tid 0 #define TID_T_FMT PID_T_FMT - - -extern void **ngx_tls; - -#define ngx_thread_create_tls() 0 -#define ngx_thread_create_tls_n "" -#define ngx_thread_get_tls() ngx_tls[ngx_gettid()] -ngx_int_t ngx_thread_set_tls(void *value); #define NGX_MUTEX_LIGHT 1 @@ -87,6 +79,29 @@ static inline int ngx_gettid() ngx_tid_t ngx_thread_self(); +typedef ngx_uint_t ngx_tls_key_t; + +#define NGX_THREAD_KEYS_MAX 16 + +extern void **ngx_tls; + +ngx_int_t ngx_thread_key_create(ngx_tls_key_t *key); +#define ngx_thread_key_create_n "the tls key creation" + +ngx_int_t ngx_thread_set_tls(ngx_tls_key_t key, void *value); +#define ngx_thread_set_tls_n "the tls key setting" + + +static void *ngx_thread_get_tls(ngx_tls_key_t key) +{ + if (key >= NGX_THREAD_KEYS_MAX) { + return NULL; + } + + return ngx_tls[key * NGX_THREAD_KEYS_MAX + ngx_gettid()]; +} + + #define ngx_mutex_trylock(m) ngx_mutex_dolock(m, 1) #define ngx_mutex_lock(m) ngx_mutex_dolock(m, 0) ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try); diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c index 9a46d1531..433c4f073 100644 --- a/src/os/unix/ngx_process_cycle.c +++ b/src/os/unix/ngx_process_cycle.c @@ -526,6 +526,7 @@ static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx) static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) { sigset_t set; + ngx_err_t err; ngx_int_t n; ngx_uint_t i; ngx_listening_t *ls; @@ -637,6 +638,14 @@ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data) exit(2); } + err = ngx_thread_key_create(&ngx_core_tls_key); + if (err != 0) { + ngx_log_error(NGX_LOG_ALERT, cycle->log, err, + ngx_thread_key_create_n " failed"); + /* fatal */ + exit(2); + } + for (n = 0; n < ngx_threads_n; n++) { if (!(ngx_threads[n].cv = ngx_cond_init(cycle->log))) { @@ -829,7 +838,7 @@ static void* ngx_worker_thread_cycle(void *data) sigset_t set; ngx_err_t err; - ngx_tls_t *tls; + ngx_core_tls_t *tls; ngx_cycle_t *cycle; struct timeval tv; @@ -854,19 +863,17 @@ static void* ngx_worker_thread_cycle(void *data) ngx_setthrtitle("worker thread"); - if (!(tls = ngx_calloc(sizeof(ngx_tls_t), cycle->log))) { + if (!(tls = ngx_calloc(sizeof(ngx_core_tls_t), cycle->log))) { return (void *) 1; } - err = ngx_thread_create_tls(); + err = ngx_thread_set_tls(ngx_core_tls_key, tls); if (err != 0) { ngx_log_error(NGX_LOG_ALERT, cycle->log, err, - ngx_thread_create_tls_n " failed"); + ngx_thread_set_tls_n " failed"); return (void *) 1; } - ngx_thread_set_tls(tls); - if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { return (void *) 1; } @@ -883,7 +890,7 @@ static void* ngx_worker_thread_cycle(void *data) ngx_mutex_unlock(ngx_posted_events_mutex); - ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, ngx_errno, + ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "thread %d is done", ngx_thread_self()); return (void *) 0; @@ -899,8 +906,10 @@ static void* ngx_worker_thread_cycle(void *data) return (void *) 1; } - if (ngx_process_changes(cycle, 1) == NGX_ERROR) { - return (void *) 1; + if (ngx_process_changes) { + if (ngx_process_changes(cycle, 1) == NGX_ERROR) { + return (void *) 1; + } } } } diff --git a/src/os/unix/ngx_thread.h b/src/os/unix/ngx_thread.h index b9348e89d..eb5c33f85 100644 --- a/src/os/unix/ngx_thread.h +++ b/src/os/unix/ngx_thread.h @@ -16,20 +16,22 @@ #else /* use pthreads */ #include <pthread.h> -#include <pthread_np.h> -typedef pthread_t ngx_tid_t; +typedef pthread_t ngx_tid_t; -#define ngx_thread_self() pthread_self() -#define ngx_log_tid (int) ngx_thread_self() +#define ngx_thread_self() pthread_self() +#define ngx_log_tid (int) ngx_thread_self() -#define TID_T_FMT PTR_FMT +#define TID_T_FMT PTR_FMT -#define ngx_thread_create_tls() pthread_key_create(0, NULL) -#define ngx_thread_create_tls_n "pthread_key_create(0, NULL)" -#define ngx_thread_get_tls() pthread_getspecific(0) -#define ngx_thread_set_tls(v) pthread_setspecific(0, v) +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 @@ -111,10 +113,5 @@ ngx_int_t ngx_cond_signal(ngx_cond_t *cv); #endif -typedef struct { - ngx_event_t *event; -} ngx_tls_t; - - #endif /* _NGX_THREAD_H_INCLUDED_ */ |