|  | 
 | /* | 
 |  * Copyright (C) Igor Sysoev | 
 |  * Copyright (C) Nginx, Inc. | 
 |  */ | 
 |  | 
 |  | 
 | #ifndef _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ | 
 | #define _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ | 
 |  | 
 |  | 
 | #include <sys/ipc.h> | 
 | #include <sys/sem.h> | 
 | #include <sched.h> | 
 |  | 
 | typedef pid_t  ngx_tid_t; | 
 |  | 
 | #define ngx_log_pid    ngx_thread_self() | 
 | #define ngx_log_tid    0 | 
 |  | 
 | #define NGX_TID_T_FMT  "%P" | 
 |  | 
 |  | 
 | #define NGX_MUTEX_LIGHT      1 | 
 |  | 
 | #define NGX_MUTEX_LOCK_BUSY  0x80000000 | 
 |  | 
 | typedef volatile struct { | 
 |     ngx_atomic_t  lock; | 
 |     ngx_log_t    *log; | 
 |     int           semid; | 
 | } ngx_mutex_t; | 
 |  | 
 |  | 
 | #define NGX_CV_SIGNAL        64 | 
 |  | 
 | typedef struct { | 
 |     int           signo; | 
 |     int           kq; | 
 |     ngx_tid_t     tid; | 
 |     ngx_log_t    *log; | 
 | } ngx_cond_t; | 
 |  | 
 |  | 
 | #define ngx_thread_sigmask(how, set, oset)                         \ | 
 |             (sigprocmask(how, set, oset) == -1) ? ngx_errno : 0 | 
 |  | 
 | #define ngx_thread_sigmask_n   "sigprocmask()" | 
 |  | 
 | #define ngx_thread_join(t, p) | 
 |  | 
 | #define ngx_setthrtitle(n)     setproctitle(n) | 
 |  | 
 |  | 
 | extern char    *ngx_freebsd_kern_usrstack; | 
 | extern size_t   ngx_thread_stack_size; | 
 |  | 
 |  | 
 | static ngx_inline ngx_int_t | 
 | ngx_gettid() | 
 | { | 
 |     char  *sp; | 
 |  | 
 |     if (ngx_thread_stack_size == 0) { | 
 |         return 0; | 
 |     } | 
 |  | 
 | #if ( __i386__ ) | 
 |  | 
 |     __asm__ volatile ("mov %%esp, %0" : "=q" (sp)); | 
 |  | 
 | #elif ( __amd64__ ) | 
 |  | 
 |     __asm__ volatile ("mov %%rsp, %0" : "=q" (sp)); | 
 |  | 
 | #else | 
 |  | 
 | #error "rfork()ed threads are not supported on this platform" | 
 |  | 
 | #endif | 
 |  | 
 |     return (ngx_freebsd_kern_usrstack - sp) / ngx_thread_stack_size; | 
 | } | 
 |  | 
 |  | 
 | ngx_tid_t ngx_thread_self(); | 
 |  | 
 |  | 
 | typedef ngx_uint_t               ngx_tls_key_t; | 
 |  | 
 | #define NGX_THREAD_KEYS_MAX      16 | 
 |  | 
 | extern void    **ngx_tls; | 
 |  | 
 | ngx_err_t ngx_thread_key_create(ngx_tls_key_t *key); | 
 | #define ngx_thread_key_create_n  "the tls key creation" | 
 |  | 
 | ngx_err_t ngx_thread_set_tls(ngx_tls_key_t key, void *value); | 
 | #define ngx_thread_set_tls_n     "the tls key setting" | 
 |  | 
 |  | 
 | static void * | 
 | ngx_thread_get_tls(ngx_tls_key_t key) | 
 | { | 
 |     if (key >= NGX_THREAD_KEYS_MAX) { | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     return ngx_tls[key * NGX_THREAD_KEYS_MAX + ngx_gettid()]; | 
 | } | 
 |  | 
 |  | 
 | #define ngx_mutex_trylock(m)  ngx_mutex_dolock(m, 1) | 
 | #define ngx_mutex_lock(m)     (void) ngx_mutex_dolock(m, 0) | 
 | ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try); | 
 | void ngx_mutex_unlock(ngx_mutex_t *m); | 
 |  | 
 |  | 
 | typedef int (*ngx_rfork_thread_func_pt)(void *arg); | 
 |  | 
 |  | 
 | #endif /* _NGX_FREEBSD_RFORK_THREAD_H_INCLUDED_ */ |