Hi! I'm using bufferevent in my proxy project and I have a bug. The entire program is single-thread, but apparently the error callback can be called while something is still running (ie. a parser) into server/client read callbacks, causing a segmentation fault, since the error callback destroy the Connection class. Is it the expected behavior? Should I add a *state* to check when a callback is running and not delete on error callback directly?
The related code is listed below (server_error_cb, server_read_cb functions are similar, but not listed): ############################################## *// static void Connection::client_error_cb(struct bufferevent* bufev, short error, void* arg) { Connection* conn = static_cast<Connection*>(arg); bool done = false; DLOG(2, "%s: called", __func__); if (error & EVBUFFER_EOF) { // connection has been closed, do any clean up here done = true; } else if (error & EVBUFFER_ERROR) { // check errno to see what error occurred done = true; } if (done) { // TODO: disconnect / states (delete or mark) delete conn; } } // static void Connection::client_read_cb(struct bufferevent* bufev, void* arg) { Connection* conn = static_cast<Connection*>(arg); struct evbuffer* input = EVBUFFER_INPUT(bufev); size_t len; DLOG(2, "%s: called", __func__); // TODO: disconnect / states (set) while (1) { len = EVBUFFER_LENGTH(input); if (len <= 0) break; if (conn->server_port == MSN_PORT) { if (msn::parse_packet(0, input, conn) == -1) evbuffer_drain(input, len); } else { DLOG(1, " ... read %ld bytes", len); bufferevent_write_buffer(conn->server_bufev, input); evbuffer_drain(input, len); } } // TODO: disconnect / states (unset) //TODO: disconnect / states (check for delete) } * ############################################## Thanks in advance, -- w