upstream nginx-0.7.31
[nginx.git] / nginx / src / event / ngx_event_busy_lock.h
1
2 /*
3  * Copyright (C) Igor Sysoev
4  */
5
6
7 #ifndef _NGX_EVENT_BUSY_LOCK_H_INCLUDED_
8 #define _NGX_EVENT_BUSY_LOCK_H_INCLUDED_
9
10
11 #include <ngx_config.h>
12 #include <ngx_core.h>
13 #include <ngx_event.h>
14
15 typedef struct ngx_event_busy_lock_ctx_s  ngx_event_busy_lock_ctx_t;
16
17 struct ngx_event_busy_lock_ctx_s {
18     ngx_event_t                *event;
19     ngx_event_handler_pt        handler;
20     void                       *data;
21     ngx_msec_t                  timer;
22
23     unsigned                    locked:1;
24     unsigned                    waiting:1;
25     unsigned                    cache_updated:1;
26
27     char                       *md5;
28     ngx_int_t                   slot;
29
30     ngx_event_busy_lock_ctx_t  *next;
31 };
32
33
34 typedef struct {
35     u_char                     *md5_mask;
36     char                       *md5;
37     ngx_uint_t                  cacheable;
38
39     ngx_uint_t                  busy;
40     ngx_uint_t                  max_busy;
41
42     ngx_uint_t                  waiting;
43     ngx_uint_t                  max_waiting;
44
45     ngx_event_busy_lock_ctx_t  *events;
46     ngx_event_busy_lock_ctx_t  *last;
47
48 #if (NGX_THREADS)
49     ngx_mutex_t                *mutex;
50 #endif
51 } ngx_event_busy_lock_t;
52
53
54 ngx_int_t ngx_event_busy_lock(ngx_event_busy_lock_t *bl,
55     ngx_event_busy_lock_ctx_t *ctx);
56 ngx_int_t ngx_event_busy_lock_cacheable(ngx_event_busy_lock_t *bl,
57     ngx_event_busy_lock_ctx_t *ctx);
58 void ngx_event_busy_unlock(ngx_event_busy_lock_t *bl,
59     ngx_event_busy_lock_ctx_t *ctx);
60 void ngx_event_busy_lock_cancel(ngx_event_busy_lock_t *bl,
61     ngx_event_busy_lock_ctx_t *ctx);
62
63
64 #endif /* _NGX_EVENT_BUSY_LOCK_H_INCLUDED_ */