blob: 6412fe8b2964d44fcddc6e57c3487b436d6f882b [file] [log] [blame]
Igor Sysoevb54698b2004-02-23 20:57:12 +00001#ifndef _NGX_THREAD_H_INCLUDED_
2#define _NGX_THREAD_H_INCLUDED_
3
4
5#include <ngx_config.h>
6#include <ngx_core.h>
7
8#if (NGX_THREADS)
9
Igor Sysoevea0b1d92004-03-02 15:40:59 +000010#define ngx_thread_volatile volatile
11
Igor Sysoevf2334412004-02-25 20:16:15 +000012#if (NGX_USE_RFORK)
Igor Sysoevb54698b2004-02-23 20:57:12 +000013
14#include <sys/ipc.h>
15#include <sys/sem.h>
16#include <sched.h>
17
18typedef pid_t ngx_tid_t;
19
Igor Sysoevb54698b2004-02-23 20:57:12 +000020#undef ngx_log_pid
21#define ngx_log_pid ngx_thread_self()
Igor Sysoevd94049b2004-02-29 21:03:02 +000022#define ngx_log_tid 0
23
24#define TID_T_FMT PID_T_FMT
Igor Sysoevb54698b2004-02-23 20:57:12 +000025
26
27#define NGX_MUTEX_LIGHT 1
28#define NGX_MUTEX_CV 2
29
30#define NGX_MUTEX_LOCK_BUSY 0x80000000
31
Igor Sysoev48fef662004-02-24 17:31:46 +000032typedef volatile struct {
Igor Sysoevb54698b2004-02-23 20:57:12 +000033 ngx_atomic_t lock;
34 ngx_log_t *log;
35 int semid;
36} ngx_mutex_t;
37
38
Igor Sysoevc0247302004-06-27 18:01:57 +000039typedef struct {
40 ngx_mutex_t mutex;
41} ngx_cv_t;
42
43
Igor Sysoev6a930452004-03-04 16:34:23 +000044#define ngx_thread_sigmask(how, set, oset) \
45 (sigprocmask(how, set, oset) == -1) ? ngx_errno : 0
46
47#define ngx_thread_sigmask_n "sigprocmask()"
48
49
Igor Sysoevd94049b2004-02-29 21:03:02 +000050extern char *ngx_freebsd_kern_usrstack;
51extern size_t ngx_thread_stack_size;
52
53static inline int ngx_gettid()
54{
55 char *sp;
56
57 if (ngx_thread_stack_size == 0) {
58 return 0;
59 }
60
61#if ( __i386__ )
62
63 __asm__ volatile ("mov %%esp, %0" : "=q" (sp));
64
65#elif ( __amd64__ )
66
67 __asm__ volatile ("mov %%rsp, %0" : "=q" (sp));
68
69#else
70
71#error "rfork()ed threads are not supported on this platform"
72
73#endif
74
75 return (ngx_freebsd_kern_usrstack - sp) / ngx_thread_stack_size;
76}
77
78
79
Igor Sysoevb54698b2004-02-23 20:57:12 +000080#else /* use pthreads */
81
82#include <pthread.h>
83
84typedef pthread_t ngx_tid_t;
85
Igor Sysoevd94049b2004-02-29 21:03:02 +000086#define ngx_gettid() ((ngx_int_t) pthread_getspecific(0))
Igor Sysoevb54698b2004-02-23 20:57:12 +000087#define ngx_log_tid ngx_thread_self()
88
Igor Sysoev6a930452004-03-04 16:34:23 +000089#define ngx_thread_sigmask pthread_sigmask
90#define ngx_thread_sigmask_n "pthread_sigmask()"
91
Igor Sysoevb54698b2004-02-23 20:57:12 +000092#endif
93
94
Igor Sysoevf2334412004-02-25 20:16:15 +000095ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle);
Igor Sysoevb54698b2004-02-23 20:57:12 +000096int ngx_create_thread(ngx_tid_t *tid, int (*func)(void *arg), void *arg,
97 ngx_log_t *log);
98ngx_tid_t ngx_thread_self();
99
Igor Sysoevd94049b2004-02-29 21:03:02 +0000100
Igor Sysoevb54698b2004-02-23 20:57:12 +0000101ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, uint flags);
102void ngx_mutex_done(ngx_mutex_t *m);
103
Igor Sysoevd94049b2004-02-29 21:03:02 +0000104#define ngx_mutex_trylock(m) ngx_mutex_dolock(m, 1)
105#define ngx_mutex_lock(m) ngx_mutex_dolock(m, 0)
106ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try);
Igor Sysoevb54698b2004-02-23 20:57:12 +0000107ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m);
108
109
Igor Sysoevc0247302004-06-27 18:01:57 +0000110ngx_cv_t *ngx_cv_init(ngx_log_t *log);
111void ngx_cv_done(ngx_cv_t *cv);
112ngx_int_t ngx_cv_wait(ngx_cv_t *cv);
113ngx_int_t ngx_cv_signal(ngx_cv_t *cv);
114
115
Igor Sysoevb54698b2004-02-23 20:57:12 +0000116#else /* !NGX_THREADS */
117
Igor Sysoevea0b1d92004-03-02 15:40:59 +0000118#define ngx_thread_volatile
119
Igor Sysoevb54698b2004-02-23 20:57:12 +0000120#define ngx_log_tid 0
121#define TID_T_FMT "%d"
122
Igor Sysoev5edf3872004-03-03 16:14:15 +0000123#define ngx_mutex_lock(m) NGX_OK
Igor Sysoevb54698b2004-02-23 20:57:12 +0000124#define ngx_mutex_unlock(m)
125
126#endif
127
128
129#endif /* _NGX_THREAD_H_INCLUDED_ */