diff options
Diffstat (limited to 'src/os')
-rw-r--r-- | src/os/freebsd/ngx_os_thread.c | 64 | ||||
-rw-r--r-- | src/os/freebsd/ngx_os_thread.h | 24 | ||||
-rw-r--r-- | src/os/unix/ngx_recv.h | 10 | ||||
-rw-r--r-- | src/os/unix/ngx_time.c | 67 | ||||
-rw-r--r-- | src/os/win32/ngx_recv.h | 10 |
5 files changed, 175 insertions, 0 deletions
diff --git a/src/os/freebsd/ngx_os_thread.c b/src/os/freebsd/ngx_os_thread.c new file mode 100644 index 000000000..f40956e20 --- /dev/null +++ b/src/os/freebsd/ngx_os_thread.c @@ -0,0 +1,64 @@ + +#include <ngx_os_thread.h> + +char *ngx_stacks_start; +char *ngx_stacks_end; +size_t ngx_stack_size; + + +/* handle thread-safe errno */ +static int errno0; /* errno for main thread */ +static int *errnos; + +int *__error() +{ + ngx_tid_t tid = ngx_gettid(); + return tid ? &(errnos[ngx_gettid()]) : &errno0; +} + + +int ngx_create_os_thread(ngx_os_tid_t *tid, void *stack, + int (*func)(void *arg), void *arg, ngx_log_t log) +{ + int id, err; + + id = rfork_thread(RFPROC|RFMEM, stack, func, arg); + err = ngx_errno; + + if (id == -1) + ngx_log_error(NGX_LOG_ERR, log, err, + "ngx_create_os_thread: rfork failed"); + else + *tid = id; + + return err; +} + + +int ngx_create_os_thread_env(int n, size_t size, ngx_log_t log) +{ + char *addr; + + /* create thread stacks */ + addr = mmap(NULL, n * size, PROT_READ|PROT_WRITE, MAP_ANON, -1, NULL); + if (addr == MAP_FAILED) { + ngx_log_error(NGX_LOG_ERR, log, ngx_errno, + "ngx_create_os_thread_stacks: mmap failed"); + return -1; + } + + nxg_stacks_start = addr; + nxg_stacks_end = addr + n * size; + nxg_stack_size = size; + + /* create thread errno array */ + ngx_test_null(errnos, ngx_calloc(n * sizeof(int)), -1); + + /* create thread tid array */ + ngx_test_null(ngx_os_tids, ngx_calloc(n * sizeof(ngx_os_tid_t)), -1); + + /* allow spinlock in malloc() */ + __isthreaded = 1; + + return 0; +} diff --git a/src/os/freebsd/ngx_os_thread.h b/src/os/freebsd/ngx_os_thread.h new file mode 100644 index 000000000..bd500e1a4 --- /dev/null +++ b/src/os/freebsd/ngx_os_thread.h @@ -0,0 +1,24 @@ +#ifndef _NGX_OS_THREAD_H_INCLUDED_ +#define _NGX_OS_THREAD_H_INCLUDED_ + + +typedef int ngx_os_tid_t; +typedef int ngx_tid_t; + + +extern char *ngx_stacks_start; +extern char *ngx_stacks_end; +extern size_t ngx_stack_size; + + +static inline ngx_tid_t ngx_gettid() +{ + char *sp; + + __asm__ ("mov %%esp,%0" : "=r" (sp)); + return (sp > ngx_stacks_end) ? 0: + (sp - ngx_stacks_start) / ngx_stack_size + 1; +} + + +#endif /* _NGX_OS_THREAD_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_recv.h b/src/os/unix/ngx_recv.h new file mode 100644 index 000000000..e92832cc7 --- /dev/null +++ b/src/os/unix/ngx_recv.h @@ -0,0 +1,10 @@ +#ifndef _NGX_RECV_H_INCLUDED_ +#define _NGX_RECV_H_INCLUDED_ + + +#include <errno.h> + +#define ngx_recv(fd, buf, size, flags) recv(fd, buf, size, flags) + + +#endif /* _NGX_RECV_H_INCLUDED_ */ diff --git a/src/os/unix/ngx_time.c b/src/os/unix/ngx_time.c index d4be966dd..5dfcb63f2 100644 --- a/src/os/unix/ngx_time.c +++ b/src/os/unix/ngx_time.c @@ -17,3 +17,70 @@ u_int ngx_msec(void) return tv.tv_sec * 1000 + tv.tv_usec / 1000; } + +#if 0 + +typedef struct { + int busy; + u_int_64 msec; + time_t sec; + tm; + http_time_len; + http_time[n]; +}; + +volatile *ngx_time_p; + +ngx_time() +{ + p = ngx_time_p; +} + +ngx_update_time() +{ + u_int64 msec; + struct timeval tv; + + gettimeofday(&tv, NULL); + + msec = (unsigned long) tv.tv_sec * 1000 + tv.tv_usec / 1000; + p = ngx_time_p; + + /* minimum can be for example 0, 10, 50 or 100 ms */ + if (tv_sec > p->sec || msec - p->msec >= minimum) { + old_p = p; + /* max_tries < max_slots - 10, + max_slots should be more than max of threads */ + for (/* void */; i < max_tries; i++) { + if (++p >= last_slot) + p = first_slot; + + if (!test_and_set(p->busy) + break; + } + + if (i == max_tries) { + ngx_log_error(); + return; + } + + if (tv_sec > p->sec) { + p->sec = tv.tv.sec; + p->msec = msec; + localtime_r(&tv.tv_sec, tm); + make http stirng; + + } else { + ngx_memcpy(p->sec, old_p->sec, sizeof() - offset_of(, sec)); + p->msec = msec; + } + + /* here can be too seldom and non-critical race condition */ + if (ngx_time_p == old_p) + ngx_time_p = p; + + unlock(p->busy); + } +} + +#endif diff --git a/src/os/win32/ngx_recv.h b/src/os/win32/ngx_recv.h new file mode 100644 index 000000000..e92832cc7 --- /dev/null +++ b/src/os/win32/ngx_recv.h @@ -0,0 +1,10 @@ +#ifndef _NGX_RECV_H_INCLUDED_ +#define _NGX_RECV_H_INCLUDED_ + + +#include <errno.h> + +#define ngx_recv(fd, buf, size, flags) recv(fd, buf, size, flags) + + +#endif /* _NGX_RECV_H_INCLUDED_ */ |