|  |  | 
|  | /* | 
|  | * Copyright (C) Igor Sysoev | 
|  | * Copyright (C) Nginx, Inc. | 
|  | */ | 
|  |  | 
|  |  | 
|  | #include <ngx_config.h> | 
|  | #include <ngx_core.h> | 
|  | #include <ngx_thread_pool.h> | 
|  |  | 
|  |  | 
|  | #if (NGX_LINUX) | 
|  |  | 
|  | /* | 
|  | * Linux thread id is a pid of thread created by clone(2), | 
|  | * glibc does not provide a wrapper for gettid(). | 
|  | */ | 
|  |  | 
|  | ngx_tid_t | 
|  | ngx_thread_tid(void) | 
|  | { | 
|  | return syscall(SYS_gettid); | 
|  | } | 
|  |  | 
|  | #elif (NGX_FREEBSD) && (__FreeBSD_version >= 900031) | 
|  |  | 
|  | #include <pthread_np.h> | 
|  |  | 
|  | ngx_tid_t | 
|  | ngx_thread_tid(void) | 
|  | { | 
|  | return pthread_getthreadid_np(); | 
|  | } | 
|  |  | 
|  | #elif (NGX_DARWIN) | 
|  |  | 
|  | /* | 
|  | * MacOSX thread has two thread ids: | 
|  | * | 
|  | * 1) MacOSX 10.6 (Snow Leoprad) has pthread_threadid_np() returning | 
|  | *    an uint64_t value, which is obtained using the __thread_selfid() | 
|  | *    syscall.  It is a number above 300,000. | 
|  | */ | 
|  |  | 
|  | ngx_tid_t | 
|  | ngx_thread_tid(void) | 
|  | { | 
|  | uint64_t  tid; | 
|  |  | 
|  | (void) pthread_threadid_np(NULL, &tid); | 
|  | return tid; | 
|  | } | 
|  |  | 
|  | /* | 
|  | * 2) Kernel thread mach_port_t returned by pthread_mach_thread_np(). | 
|  | *    It is a number in range 100-100,000. | 
|  | * | 
|  | * return pthread_mach_thread_np(pthread_self()); | 
|  | */ | 
|  |  | 
|  | #else | 
|  |  | 
|  | ngx_tid_t | 
|  | ngx_thread_tid(void) | 
|  | { | 
|  | return (uint64_t) (uintptr_t) pthread_self(); | 
|  | } | 
|  |  | 
|  | #endif |