| /* | |
| * 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_ */ |