-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feature: support socket in some block phase
- Loading branch information
1 parent
fdf752d
commit d171684
Showing
6 changed files
with
383 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
|
||
/* | ||
* Copyright (C) Yichun Zhang (agentzh) | ||
*/ | ||
|
||
|
||
#include <ngx_core.h> | ||
#include <ngx_event.h> | ||
#include <ngx_http.h> | ||
|
||
int ngx_lua_kqueue = -1; | ||
static struct kevent change_list[1]; | ||
static struct kevent event_list[1]; | ||
|
||
ngx_int_t | ||
ngx_http_lua_kqueue_init(ngx_conf_t *cf) | ||
{ | ||
if (ngx_lua_kqueue == -1) { | ||
ngx_lua_kqueue = kqueue(); | ||
|
||
if (ngx_lua_kqueue == -1) { | ||
ngx_conf_log_error(NGX_LOG_ALERT, cf, 0, "kqueue() failed"); | ||
|
||
return NGX_ERROR; | ||
} | ||
} | ||
|
||
return NGX_OK; | ||
} | ||
|
||
|
||
void | ||
ngx_http_lua_kqueue_set_event(ngx_event_t *ev, ngx_int_t event) | ||
{ | ||
struct kevent *kev; | ||
ngx_connection_t *c; | ||
|
||
c = ev->data; | ||
|
||
ev->active = 1; | ||
|
||
kev = &change_list[0]; | ||
|
||
kev->ident = c->fd; | ||
kev->filter = (short) event; | ||
kev->flags = EV_ADD|EV_ENABLE; | ||
kev->udata = NGX_KQUEUE_UDATA_T ((uintptr_t) ev | ev->instance); | ||
} | ||
|
||
|
||
ngx_int_t | ||
ngx_http_lua_kqueue_process_events(ngx_http_request_t *r, ngx_msec_t timer) | ||
{ | ||
int events; | ||
struct timespec ts; | ||
ngx_event_t *ev; | ||
ngx_int_t instance; | ||
ngx_err_t err; | ||
|
||
ts.tv_sec = timer / 1000; | ||
ts.tv_nsec = (timer % 1000) * 1000000; | ||
|
||
events = kevent(ngx_lua_kqueue, change_list, 1, event_list, 1, &ts); | ||
|
||
err = (events == -1) ? ngx_errno : 0; | ||
|
||
if (err) { | ||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, err, "kevent() failed"); | ||
|
||
return NGX_ERROR; | ||
} | ||
|
||
if (events == 0) { | ||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, | ||
"kevent() returned no events without timeout"); | ||
|
||
return NGX_ERROR; | ||
} | ||
|
||
ev = (ngx_event_t *) event_list[0].udata; | ||
instance = (uintptr_t) ev & 1; | ||
ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1); | ||
|
||
ev->available = event_list[0].data; | ||
ev->ready = 1; | ||
|
||
return NGX_OK; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
|
||
/* | ||
* Copyright (C) Yichun Zhang (agentzh) | ||
*/ | ||
|
||
|
||
#include <ngx_core.h> | ||
#include <ngx_event.h> | ||
#include <ngx_http.h> | ||
|
||
static struct pollfd event_list[1]; | ||
|
||
ngx_int_t | ||
ngx_http_lua_poll_init(ngx_conf_t *cf) | ||
{ | ||
return NGX_OK; | ||
} | ||
|
||
|
||
void | ||
ngx_http_lua_poll_set_event(ngx_event_t *ev, ngx_int_t event) | ||
{ | ||
ngx_connection_t *c; | ||
|
||
c = ev->data; | ||
|
||
ev->active = 1; | ||
|
||
if (event == NGX_READ_EVENT) { | ||
#if (NGX_READ_EVENT != POLLIN) | ||
event = POLLIN; | ||
#endif | ||
|
||
} else { | ||
#if (NGX_WRITE_EVENT != POLLOUT) | ||
event = POLLOUT; | ||
#endif | ||
} | ||
|
||
event_list[0].fd = c->fd; | ||
event_list[0].events = (short) event; | ||
event_list[0].revents = 0; | ||
} | ||
|
||
|
||
ngx_int_t | ||
ngx_http_lua_poll_process_events(ngx_http_request_t *r, ngx_msec_t timer) | ||
{ | ||
int ready, revents; | ||
ngx_event_t *ev; | ||
ngx_err_t err; | ||
ngx_connection_t *c; | ||
|
||
ready = poll(event_list, 1, (int) timer); | ||
|
||
err = (ready == -1) ? ngx_errno : 0; | ||
|
||
if (err) { | ||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, err, "poll() failed"); | ||
|
||
return NGX_ERROR; | ||
} | ||
|
||
if (ready == 0) { | ||
ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, | ||
"poll() returned no events without timeout"); | ||
|
||
return NGX_ERROR; | ||
} | ||
|
||
revents = event_list[0].revents; | ||
c = ngx_cycle->files[event_list[0].fd]; | ||
|
||
if ((revents & POLLIN) && c->read->active) { | ||
ev = c->read; | ||
ev->ready = 1; | ||
ev->available = -1; | ||
} | ||
|
||
if ((revents & POLLOUT) && c->write->active) { | ||
ev = c->write; | ||
ev->ready = 1; | ||
} | ||
|
||
return NGX_OK; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
|
||
/* | ||
* Copyright (C) Yichun Zhang (agentzh) | ||
*/ | ||
|
||
|
||
#ifndef _NGX_HTTP_LUA_EVENT_H_INCLUDED_ | ||
#define _NGX_HTTP_LUA_EVENT_H_INCLUDED_ | ||
|
||
|
||
#include "ngx_http_lua_common.h" | ||
|
||
|
||
ngx_int_t ngx_http_lua_poll_init(ngx_conf_t *cf); | ||
|
||
void ngx_http_lua_poll_set_event(ngx_event_t *ev, ngx_int_t event); | ||
|
||
ngx_int_t ngx_http_lua_poll_process_events(ngx_http_request_t *r, | ||
ngx_msec_t timer); | ||
|
||
ngx_int_t ngx_http_lua_kqueue_init(ngx_conf_t *cf); | ||
|
||
void ngx_http_lua_kqueue_set_event(ngx_event_t *ev, ngx_int_t event); | ||
|
||
ngx_int_t ngx_http_lua_kqueue_process_events(ngx_http_request_t *r, | ||
ngx_msec_t timer); | ||
|
||
|
||
#define ngx_http_lua_init_event ngx_http_lua_poll_init | ||
#define ngx_http_lua_set_event ngx_http_lua_poll_set_event | ||
#define ngx_http_lua_process_events ngx_http_lua_poll_process_events | ||
|
||
|
||
#endif /* _NGX_HTTP_LUA_EVENT_H_INCLUDED_ */ | ||
|
||
/* vi:set ft=c ts=4 sw=4 et fdm=marker: */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.