Clean up and add more debug (normally compiled out)
This commit is contained in:
parent
7cf7f4cb7b
commit
e88b23ebd8
|
@ -413,7 +413,9 @@ static int register_weak_ref(lua_State *L)
|
||||||
|
|
||||||
lua_remove(L, -2); // Remove the original ivalue
|
lua_remove(L, -2); // Remove the original ivalue
|
||||||
|
|
||||||
return luaL_ref(L, LUA_REGISTRYINDEX); // this pops the new_table
|
int result = luaL_ref(L, LUA_REGISTRYINDEX); // this pops the new_table
|
||||||
|
WS_DEBUG("register_weak_ref returning %d\n", result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the value of the weak ref on the stack
|
// Returns the value of the weak ref on the stack
|
||||||
|
@ -423,16 +425,20 @@ static bool deref_weak_ref(lua_State *L, int ref)
|
||||||
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
|
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
|
||||||
if (lua_isnil(L, -1)) {
|
if (lua_isnil(L, -1)) {
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
WS_DEBUG("deref_weak_ref(%d) has nothing in registry\n", ref);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
lua_rawgeti(L, -1, 1);
|
lua_rawgeti(L, -1, 1);
|
||||||
|
|
||||||
// Either we have nil, or we have the underlying object
|
// Either we have nil, or we have the underlying object
|
||||||
if (lua_isnil(L, -1)) {
|
if (lua_isnil(L, -1)) {
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 2);
|
||||||
|
WS_DEBUG("deref_weak_ref(%d) has nothing in weak table\n", ref);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lua_remove(L, -2); // remove the table
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -462,6 +468,7 @@ static void free_sess_ctx(void *ctx) {
|
||||||
static void ws_clear(lua_State *L, ws_connection_t *ws)
|
static void ws_clear(lua_State *L, ws_connection_t *ws)
|
||||||
{
|
{
|
||||||
luaL_unref2(L, LUA_REGISTRYINDEX, ws->self_weak_ref);
|
luaL_unref2(L, LUA_REGISTRYINDEX, ws->self_weak_ref);
|
||||||
|
luaL_unref2(L, LUA_REGISTRYINDEX, ws->self_ref);
|
||||||
if (ws->text_fn_ref > 0) {
|
if (ws->text_fn_ref > 0) {
|
||||||
luaL_unref2(L, LUA_REGISTRYINDEX, ws->text_fn_ref);
|
luaL_unref2(L, LUA_REGISTRYINDEX, ws->text_fn_ref);
|
||||||
}
|
}
|
||||||
|
@ -666,6 +673,7 @@ static void dynamic_handler_lvm(task_param_t param, task_prio_t prio)
|
||||||
if (req_info->method == HTTP_WEBSOCKET_GET) {
|
if (req_info->method == HTTP_WEBSOCKET_GET) {
|
||||||
// web socket
|
// web socket
|
||||||
ws_connection_t *ws = (ws_connection_t *) lua_newuserdata(L, sizeof(*ws));
|
ws_connection_t *ws = (ws_connection_t *) lua_newuserdata(L, sizeof(*ws));
|
||||||
|
WS_DEBUG("Created new WS object\n");
|
||||||
memset(ws, 0, sizeof(*ws));
|
memset(ws, 0, sizeof(*ws));
|
||||||
luaL_getmetatable(L, WS_METATABLE);
|
luaL_getmetatable(L, WS_METATABLE);
|
||||||
lua_setmetatable(L, -2);
|
lua_setmetatable(L, -2);
|
||||||
|
@ -675,16 +683,15 @@ static void dynamic_handler_lvm(task_param_t param, task_prio_t prio)
|
||||||
ws->fd = httpd_req_to_sockfd(req_info->req);
|
ws->fd = httpd_req_to_sockfd(req_info->req);
|
||||||
ws->self_ref = LUA_NOREF;
|
ws->self_ref = LUA_NOREF;
|
||||||
|
|
||||||
// Set the session context so we know what is going on.
|
|
||||||
req_info->req->sess_ctx = (void *) ws->self_weak_ref;
|
|
||||||
req_info->req->free_ctx = free_sess_ctx;
|
|
||||||
|
|
||||||
int err = luaL_pcallx(L, 2, 0);
|
int err = luaL_pcallx(L, 2, 0);
|
||||||
if (err) {
|
if (err) {
|
||||||
tr.request_type = SEND_ERROR;
|
tr.request_type = SEND_ERROR;
|
||||||
ws_clear(L, ws);
|
ws_clear(L, ws);
|
||||||
} else {
|
} else {
|
||||||
tr.request_type = SEND_OK;
|
tr.request_type = SEND_OK;
|
||||||
|
// Set the session context so we know what is going on.
|
||||||
|
req_info->req->sess_ctx = (void *)ws->self_weak_ref;
|
||||||
|
req_info->req->free_ctx = free_sess_ctx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
@ -1042,6 +1049,7 @@ static int ws_close(lua_State *L) {
|
||||||
async_send_t *async_close = malloc(sizeof(async_send_t));
|
async_send_t *async_close = malloc(sizeof(async_send_t));
|
||||||
async_close->hd = ws->handle;
|
async_close->hd = ws->handle;
|
||||||
async_close->fd = ws->fd;
|
async_close->fd = ws->fd;
|
||||||
|
WS_DEBUG("ws_close called and now marked closed\n");
|
||||||
httpd_queue_work(ws->handle, ws_async_close, async_close);
|
httpd_queue_work(ws->handle, ws_async_close, async_close);
|
||||||
} else {
|
} else {
|
||||||
WS_DEBUG("ws_close called when already closed\n");
|
WS_DEBUG("ws_close called when already closed\n");
|
||||||
|
@ -1049,6 +1057,11 @@ static int ws_close(lua_State *L) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ws_gcclose(lua_State *L) {
|
||||||
|
WS_DEBUG("gc cleaning up block\n");
|
||||||
|
return ws_close(L);
|
||||||
|
}
|
||||||
|
|
||||||
// event types: text, binary, close
|
// event types: text, binary, close
|
||||||
static int ws_on(lua_State *L) {
|
static int ws_on(lua_State *L) {
|
||||||
ws_connection_t *ws = (ws_connection_t*)luaL_checkudata(L, 1, WS_METATABLE);
|
ws_connection_t *ws = (ws_connection_t*)luaL_checkudata(L, 1, WS_METATABLE);
|
||||||
|
@ -1113,7 +1126,7 @@ static int ws_binary(lua_State *L) {
|
||||||
|
|
||||||
LROT_BEGIN(httpd_ws_mt, NULL, LROT_MASK_GC_INDEX)
|
LROT_BEGIN(httpd_ws_mt, NULL, LROT_MASK_GC_INDEX)
|
||||||
LROT_TABENTRY( __index, httpd_ws_mt )
|
LROT_TABENTRY( __index, httpd_ws_mt )
|
||||||
LROT_FUNCENTRY( __gc, ws_close )
|
LROT_FUNCENTRY( __gc, ws_gcclose )
|
||||||
LROT_FUNCENTRY( close, ws_close )
|
LROT_FUNCENTRY( close, ws_close )
|
||||||
LROT_FUNCENTRY( on, ws_on )
|
LROT_FUNCENTRY( on, ws_on )
|
||||||
LROT_FUNCENTRY( text, ws_text )
|
LROT_FUNCENTRY( text, ws_text )
|
||||||
|
|
Loading…
Reference in New Issue