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