blob: a85750d4744493faa29e4a6b3efe592cc9249b1f [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 Sysoevd94049b2004-02-29 21:03:02 +000039extern char *ngx_freebsd_kern_usrstack;
40extern size_t ngx_thread_stack_size;
41
42static inline int ngx_gettid()
43{
44 char *sp;
45
46 if (ngx_thread_stack_size == 0) {
47 return 0;
48 }
49
50#if ( __i386__ )
51
52 __asm__ volatile ("mov %%esp, %0" : "=q" (sp));
53
54#elif ( __amd64__ )
55
56 __asm__ volatile ("mov %%rsp, %0" : "=q" (sp));
57
58#else
59
60#error "rfork()ed threads are not supported on this platform"
61
62#endif
63
64 return (ngx_freebsd_kern_usrstack - sp) / ngx_thread_stack_size;
65}
66
67
68
Igor Sysoevb54698b2004-02-23 20:57:12 +000069#else /* use pthreads */
70
71#include <pthread.h>
72
73typedef pthread_t ngx_tid_t;
74
Igor Sysoevd94049b2004-02-29 21:03:02 +000075#define ngx_gettid() ((ngx_int_t) pthread_getspecific(0))
Igor Sysoevb54698b2004-02-23 20:57:12 +000076#define ngx_log_tid ngx_thread_self()
77
78#endif
79
80
Igor Sysoevf2334412004-02-25 20:16:15 +000081ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle);
Igor Sysoevb54698b2004-02-23 20:57:12 +000082int ngx_create_thread(ngx_tid_t *tid, int (*func)(void *arg), void *arg,
83 ngx_log_t *log);
84ngx_tid_t ngx_thread_self();
85
Igor Sysoevd94049b2004-02-29 21:03:02 +000086
Igor Sysoevb54698b2004-02-23 20:57:12 +000087ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, uint flags);
88void ngx_mutex_done(ngx_mutex_t *m);
89
Igor Sysoevd94049b2004-02-29 21:03:02 +000090#define ngx_mutex_trylock(m) ngx_mutex_dolock(m, 1)
91#define ngx_mutex_lock(m) ngx_mutex_dolock(m, 0)
92ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try);
Igor Sysoevb54698b2004-02-23 20:57:12 +000093ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m);
94
95
Igor Sysoev898446c2004-02-26 17:10:01 +000096extern ngx_int_t ngx_threaded;
97
98
Igor Sysoevb54698b2004-02-23 20:57:12 +000099#else /* !NGX_THREADS */
100
Igor Sysoevea0b1d92004-03-02 15:40:59 +0000101#define ngx_thread_volatile
102
Igor Sysoevb54698b2004-02-23 20:57:12 +0000103#define ngx_log_tid 0
104#define TID_T_FMT "%d"
105
Igor Sysoev5edf3872004-03-03 16:14:15 +0000106#define ngx_mutex_lock(m) NGX_OK
Igor Sysoevb54698b2004-02-23 20:57:12 +0000107#define ngx_mutex_unlock(m)
108
109#endif
110
111
112#endif /* _NGX_THREAD_H_INCLUDED_ */