view src/os/unix/ngx_freebsd_rfork_thread.h @ 391:1d9bef53cd8e

Range filter: late_ranges functionality. Add one more filtering point after postpone filter. This allows to serve range capable replies with subrequests. It's not as efficient as range filtering for static data (i.e. doesn't save us from reading data from disk if some filter needs them in memory), but it may save some network bandwidth for us and for our users.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 21 Jul 2008 05:33:01 +0400
parents df17fbafec8f
children c04fa65fe604
line wrap: on
line source


/*
 * Copyright (C) Igor Sysoev
 */


#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_ */