aboutsummaryrefslogtreecommitdiff
path: root/src/os
diff options
context:
space:
mode:
Diffstat (limited to 'src/os')
-rw-r--r--src/os/freebsd/ngx_os_thread.c64
-rw-r--r--src/os/freebsd/ngx_os_thread.h24
-rw-r--r--src/os/unix/ngx_recv.h10
-rw-r--r--src/os/unix/ngx_time.c67
-rw-r--r--src/os/win32/ngx_recv.h10
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_ */