upstream nginx-0.7.31
[nginx.git] / nginx / src / os / unix / ngx_freebsd_rfork_thread.h
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #ifndef _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_
8 #define _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_
9
10
11 #include <sys/ipc.h>
12 #include <sys/sem.h>
13 #include <sched.h>
14
15 typedef pid_t  ngx_tid_t;
16
17 #define ngx_log_pid    ngx_thread_self()
18 #define ngx_log_tid    0
19
20 #define NGX_TID_T_FMT  "%P"
21
22
23 #define NGX_MUTEX_LIGHT      1
24
25 #define NGX_MUTEX_LOCK_BUSY  0x80000000
26
27 typedef volatile struct {
28     ngx_atomic_t  lock;
29     ngx_log_t    *log;
30     int           semid;
31 } ngx_mutex_t;
32
33
34 #define NGX_CV_SIGNAL        64
35
36 typedef struct {
37     int           signo;
38     int           kq;
39     ngx_tid_t     tid;
40     ngx_log_t    *log;
41 } ngx_cond_t;
42
43
44 #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 #define ngx_thread_join(t, p)
50
51 #define ngx_setthrtitle(n)     setproctitle(n)
52
53
54 extern char    *ngx_freebsd_kern_usrstack;
55 extern size_t   ngx_thread_stack_size;
56
57
58 static ngx_inline ngx_int_t
59 ngx_gettid()
60 {
61     char  *sp;
62
63     if (ngx_thread_stack_size == 0) {
64         return 0;
65     }
66
67 #if ( __i386__ )
68
69     __asm__ volatile ("mov %%esp, %0" : "=q" (sp));
70
71 #elif ( __amd64__ )
72
73     __asm__ volatile ("mov %%rsp, %0" : "=q" (sp));
74
75 #else
76
77 #error "rfork()ed threads are not supported on this platform"
78
79 #endif
80
81     return (ngx_freebsd_kern_usrstack - sp) / ngx_thread_stack_size;
82 }
83
84
85 ngx_tid_t ngx_thread_self();
86
87
88 typedef ngx_uint_t               ngx_tls_key_t;
89
90 #define NGX_THREAD_KEYS_MAX      16
91
92 extern void    **ngx_tls;
93
94 ngx_err_t ngx_thread_key_create(ngx_tls_key_t *key);
95 #define ngx_thread_key_create_n  "the tls key creation"
96
97 ngx_err_t ngx_thread_set_tls(ngx_tls_key_t key, void *value);
98 #define ngx_thread_set_tls_n     "the tls key setting"
99
100
101 static void *
102 ngx_thread_get_tls(ngx_tls_key_t key)
103 {
104     if (key >= NGX_THREAD_KEYS_MAX) {
105         return NULL;
106     }
107
108     return ngx_tls[key * NGX_THREAD_KEYS_MAX + ngx_gettid()];
109 }
110
111
112 #define ngx_mutex_trylock(m)  ngx_mutex_dolock(m, 1)
113 #define ngx_mutex_lock(m)     (void) ngx_mutex_dolock(m, 0)
114 ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try);
115 void ngx_mutex_unlock(ngx_mutex_t *m);
116
117
118 typedef int (*ngx_rfork_thread_func_pt)(void *arg);
119
120
121
122 #endif /* _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ */