Mercurial > hg > nginx
comparison src/os/unix/ngx_thread.h @ 376:d0451e402e27
nginx-0.0.7-2004-07-05-10:55:54 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 05 Jul 2004 06:55:54 +0000 |
parents | c9fdfccebc49 |
children | 73688d5d7fc3 |
comparison
equal
deleted
inserted
replaced
375:744ccb59062d | 376:d0451e402e27 |
---|---|
5 #include <ngx_config.h> | 5 #include <ngx_config.h> |
6 #include <ngx_core.h> | 6 #include <ngx_core.h> |
7 | 7 |
8 #if (NGX_THREADS) | 8 #if (NGX_THREADS) |
9 | 9 |
10 #define ngx_thread_volatile volatile | 10 #define NGX_MAX_THREADS 128 |
11 | 11 |
12 #if (NGX_USE_RFORK) | 12 #if (NGX_USE_RFORK) |
13 | 13 #include <ngx_freebsd_rfork_thread.h> |
14 #include <sys/ipc.h> | |
15 #include <sys/sem.h> | |
16 #include <sched.h> | |
17 | |
18 typedef pid_t ngx_tid_t; | |
19 | |
20 #undef ngx_log_pid | |
21 #define ngx_log_pid ngx_thread_self() | |
22 #define ngx_log_tid 0 | |
23 | |
24 #define TID_T_FMT PID_T_FMT | |
25 | |
26 | |
27 #define NGX_MUTEX_LIGHT 1 | |
28 #define NGX_MUTEX_CV 2 | |
29 | |
30 #define NGX_MUTEX_LOCK_BUSY 0x80000000 | |
31 | |
32 typedef volatile struct { | |
33 ngx_atomic_t lock; | |
34 ngx_log_t *log; | |
35 int semid; | |
36 } ngx_mutex_t; | |
37 | |
38 | |
39 typedef struct { | |
40 int semid; | |
41 ngx_log_t *log; | |
42 } ngx_cond_t; | |
43 | |
44 | |
45 #define ngx_thread_sigmask(how, set, oset) \ | |
46 (sigprocmask(how, set, oset) == -1) ? ngx_errno : 0 | |
47 | |
48 #define ngx_thread_sigmask_n "sigprocmask()" | |
49 | |
50 | |
51 extern char *ngx_freebsd_kern_usrstack; | |
52 extern size_t ngx_thread_stack_size; | |
53 | |
54 static inline int ngx_gettid() | |
55 { | |
56 char *sp; | |
57 | |
58 if (ngx_thread_stack_size == 0) { | |
59 return 0; | |
60 } | |
61 | |
62 #if ( __i386__ ) | |
63 | |
64 __asm__ volatile ("mov %%esp, %0" : "=q" (sp)); | |
65 | |
66 #elif ( __amd64__ ) | |
67 | |
68 __asm__ volatile ("mov %%rsp, %0" : "=q" (sp)); | |
69 | |
70 #else | |
71 | |
72 #error "rfork()ed threads are not supported on this platform" | |
73 | |
74 #endif | |
75 | |
76 return (ngx_freebsd_kern_usrstack - sp) / ngx_thread_stack_size; | |
77 } | |
78 | |
79 | |
80 #define ngx_thread_main() (ngx_gettid() == 0) | |
81 | 14 |
82 | 15 |
83 #else /* use pthreads */ | 16 #else /* use pthreads */ |
84 | 17 |
85 #include <pthread.h> | 18 #include <pthread.h> |
19 #include <pthread_np.h> | |
86 | 20 |
87 typedef pthread_t ngx_tid_t; | 21 typedef pthread_t ngx_tid_t; |
88 | 22 |
89 #define ngx_gettid() ((ngx_int_t) pthread_getspecific(0)) | 23 #define ngx_thread_self() pthread_self() |
90 #define ngx_log_tid ngx_thread_self() | 24 #define ngx_thread_main() pthread_main_np() |
25 #define ngx_log_tid (int) ngx_thread_self() | |
26 | |
27 #define TID_T_FMT PTR_FMT | |
28 | |
29 | |
30 #define NGX_MUTEX_LIGHT 0 | |
31 | |
32 typedef struct { | |
33 pthread_mutex_t mutex; | |
34 ngx_log_t *log; | |
35 } ngx_mutex_t; | |
36 | |
37 typedef struct { | |
38 pthread_cond_t cond; | |
39 ngx_tid_t tid; | |
40 ngx_log_t *log; | |
41 } ngx_cond_t; | |
91 | 42 |
92 #define ngx_thread_sigmask pthread_sigmask | 43 #define ngx_thread_sigmask pthread_sigmask |
93 #define ngx_thread_sigmask_n "pthread_sigmask()" | 44 #define ngx_thread_sigmask_n "pthread_sigmask()" |
94 | 45 |
46 #define ngx_thread_join(t, p) pthread_join(t, p) | |
47 | |
48 #define ngx_setthrtitle(n) | |
49 | |
50 | |
51 | |
52 ngx_int_t ngx_mutex_trylock(ngx_mutex_t *m); | |
53 ngx_int_t ngx_mutex_lock(ngx_mutex_t *m); | |
54 ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m); | |
55 | |
95 #endif | 56 #endif |
96 | 57 |
97 | 58 |
59 #define ngx_thread_volatile volatile | |
60 | |
61 | |
62 typedef struct { | |
63 ngx_tid_t tid; | |
64 ngx_cond_t *cv; | |
65 ngx_uint_t state; | |
66 } ngx_thread_t; | |
67 | |
68 #define NGX_THREAD_FREE 1 | |
69 #define NGX_THREAD_BUSY 2 | |
70 #define NGX_THREAD_EXIT 3 | |
71 #define NGX_THREAD_DONE 4 | |
72 | |
73 extern ngx_int_t ngx_threads_n; | |
74 extern volatile ngx_thread_t ngx_threads[NGX_MAX_THREADS]; | |
75 | |
76 | |
98 ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle); | 77 ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle); |
99 int ngx_create_thread(ngx_tid_t *tid, int (*func)(void *arg), void *arg, | 78 int ngx_create_thread(ngx_tid_t *tid, void* (*func)(void *arg), void *arg, |
100 ngx_log_t *log); | 79 ngx_log_t *log); |
101 ngx_tid_t ngx_thread_self(); | |
102 | 80 |
103 | 81 |
104 ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, uint flags); | 82 ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, uint flags); |
105 void ngx_mutex_done(ngx_mutex_t *m); | 83 void ngx_mutex_destroy(ngx_mutex_t *m); |
106 | |
107 #define ngx_mutex_trylock(m) ngx_mutex_dolock(m, 1) | |
108 #define ngx_mutex_lock(m) ngx_mutex_dolock(m, 0) | |
109 ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try); | |
110 ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m); | |
111 | 84 |
112 | 85 |
113 ngx_cond_t *ngx_cond_init(ngx_log_t *log); | 86 ngx_cond_t *ngx_cond_init(ngx_log_t *log); |
114 void ngx_cond_done(ngx_cond_t *cv); | 87 void ngx_cond_destroy(ngx_cond_t *cv); |
115 ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m); | 88 ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m); |
116 ngx_int_t ngx_cond_signal(ngx_cond_t *cv); | 89 ngx_int_t ngx_cond_signal(ngx_cond_t *cv); |
117 | 90 |
118 | 91 |
119 #else /* !NGX_THREADS */ | 92 #else /* !NGX_THREADS */ |