void ox_sax_drive_cleanup(SaxDrive dr) { rb_gc_unregister_address(&dr->value_obj); buf_cleanup(&dr->buf); stack_cleanup(&dr->stack); }
static int ws_events_callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { struct lws_context *context = lws_get_context(wsi); ws_t *ws = lws_context_user(context); struct per_session_data__events *pss = user; int i; switch (reason) { case LWS_CALLBACK_ESTABLISHED: pss->ws = ws; pss->cmd = command_new((command_handler_t) ws_events_command, pss); buf_init(&pss->out_buf); pss->id = ws_session_add(ws, pss); log_debug(2, "ws_events_callback LWS_CALLBACK_ESTABLISHED [%04X]", pss->id); break; case LWS_CALLBACK_SERVER_WRITEABLE: i = pss->out_buf.len - LWS_SEND_BUFFER_PRE_PADDING; if (i > 0) { log_debug(2, "ws_events_callback LWS_CALLBACK_SERVER_WRITEABLE [%04X]: %d bytes", pss->id, i); buf_grow(&pss->out_buf, LWS_SEND_BUFFER_POST_PADDING); int ret = lws_write(wsi, pss->out_buf.base+LWS_SEND_BUFFER_PRE_PADDING, i, LWS_WRITE_TEXT); pss->out_buf.len = 0; if (ret < i) { log_str("HTTP ERROR: %d writing to event websocket", ret); return -1; } } else { log_debug(2, "ws_events_callback LWS_CALLBACK_SERVER_WRITEABLE [%04X]: READY", pss->id); } break; case LWS_CALLBACK_RECEIVE: log_debug(2, "ws_events_callback LWS_CALLBACK_RECEIVE [%04X]: %d bytes", pss->id, len); log_debug_data(in, len); /* Make sure send buffer has room for pre-padding */ if (pss->out_buf.len == 0) { buf_append_zero(&pss->out_buf, LWS_SEND_BUFFER_PRE_PADDING); } /* Execute command */ command_recv(pss->cmd, in, len); /* Trig response write */ lws_callback_on_writable(wsi); break; case LWS_CALLBACK_CLOSED: log_debug(2, "ws_events_callback LWS_CALLBACK_CLOSED [%04X]", pss->id); pss->ws = NULL; if (pss->cmd != NULL) { command_destroy(pss->cmd); pss->cmd = NULL; } buf_cleanup(&pss->out_buf); pss->id = -1; ws_session_remove(ws, pss); break; /* * this just demonstrates how to use the protocol filter. If you won't * study and reject connections based on header content, you don't need * to handle this callback */ case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION: log_debug(2, "ws_events_callback LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION [%04X]", pss->id); ws_dump_handshake_info(wsi); /* you could return non-zero here and kill the connection */ // return -1; break; case LWS_CALLBACK_PROTOCOL_INIT: log_debug(2, "ws_events_callback LWS_CALLBACK_PROTOCOL_INIT"); break; default: log_debug(2, "ws_events_callback: reason=%d", reason); break; } return 0; }