2002-08-16 01:20:26 +08:00
|
|
|
|
2004-03-01 05:03:02 +08:00
|
|
|
#include <ngx_config.h>
|
|
|
|
#include <ngx_core.h>
|
|
|
|
#include <ngx_event.h>
|
2002-08-16 01:20:26 +08:00
|
|
|
|
|
|
|
|
2004-03-01 05:03:02 +08:00
|
|
|
ngx_int_t ngx_event_mutex_timedlock(ngx_event_mutex_t *m, ngx_msec_t timer,
|
|
|
|
ngx_event_t *ev)
|
2002-08-16 01:20:26 +08:00
|
|
|
{
|
2004-03-01 05:03:02 +08:00
|
|
|
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
|
|
|
|
"lock event mutex " PTR_FMT " lock:%X", m, m->lock);
|
2002-08-16 01:20:26 +08:00
|
|
|
|
2004-03-01 05:03:02 +08:00
|
|
|
if (m->lock) {
|
|
|
|
|
|
|
|
if (m->events == NULL) {
|
|
|
|
m->events = ev;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
m->last->next = ev;
|
|
|
|
}
|
|
|
|
|
|
|
|
m->last = ev;
|
|
|
|
ev->next = NULL;
|
|
|
|
|
2004-03-02 00:45:48 +08:00
|
|
|
#if (NGX_THREADS0)
|
2004-03-01 05:03:02 +08:00
|
|
|
ev->light = 1;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
ngx_add_timer(ev, timer);
|
|
|
|
|
|
|
|
return NGX_AGAIN;
|
|
|
|
}
|
|
|
|
|
|
|
|
m->lock = 1;
|
|
|
|
|
|
|
|
return NGX_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ngx_int_t ngx_event_mutex_unlock(ngx_event_mutex_t *m, ngx_log_t *log)
|
|
|
|
{
|
|
|
|
ngx_event_t *ev;
|
|
|
|
|
|
|
|
if (m->lock == 0) {
|
|
|
|
ngx_log_error(NGX_LOG_ALERT, log, 0,
|
|
|
|
"tring to unlock the free event mutex " PTR_FMT, m);
|
|
|
|
return NGX_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
|
|
|
|
"unlock event mutex " PTR_FMT ", next event: " PTR_FMT,
|
|
|
|
m, m->events);
|
|
|
|
|
|
|
|
m->lock = 0;
|
|
|
|
|
|
|
|
if (m->events) {
|
|
|
|
ev = m->events;
|
|
|
|
m->events = ev->next;
|
|
|
|
|
|
|
|
ev->next = (ngx_event_t *) ngx_posted_events;
|
|
|
|
ngx_posted_events = ev;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NGX_OK;
|
2002-08-16 01:20:26 +08:00
|
|
|
}
|