libsoup websocket server memory problems
- From: Benjamin Reikowski <reikowski dresearch-fe de>
- To: libsoup-list gnome org
- Subject: libsoup websocket server memory problems
- Date: Wed, 15 Jan 2020 14:12:57 +0100
Hello libsoup mailing list members,
I'm using the libsoup websocket server and recently updated my libsoup from 2.64.2 to 2.68.3 due to a bug that has been fixed with
https://github.com/GNOME/libsoup/commit/35f1bac5ff9ec694e64b65e51f0e7a3226aa3aaf
Since then I have a new problem, which I better explain using this simple example code:
static void websocket_client_message_cb(SoupWebsocketConnection *ws, SoupWebsocketDataType type, GBytes *message, gpointer user_data) {
(void) ws; (void) type; (void) message; (void) user_data;
g_message("%s", __func__);
}
static void websocket_client_closed_cb(SoupWebsocketConnection *ws, gpointer user_data) {
(void) user_data;
g_object_unref(ws);
g_message("%s", __func__);
}
static void websocket_client_error_cb(SoupWebsocketConnection *ws, GError *error, gpointer user_data)'{
(void) ws; (void) error; (void) user_data;
g_message("%s", __func__);
}
static void websocket_client_connect_cb(SoupServer *server, SoupWebsocketConnection *ws,
const char *path, SoupClientContext *client, gpointer user_data) {
(void) server; (void) client; (void) user_data; (void) path;
g_object_ref(ws);
g_signal_connect(ws, "message", G_CALLBACK(websocket_client_message_cb), NULL);
g_signal_connect(ws, "closed", G_CALLBACK(websocket_client_closed_cb), NULL);
g_signal_connect(ws, "error", G_CALLBACK(websocket_client_error_cb), NULL);
g_message("%s", __func__);
}
int main(int argc, char* argv[]) {
GMainLoop *mainloop = g_main_loop_new(0, FALSE);
/* play here */
GError *error = NULL;
SoupServer *server = soup_server_new(NULL, NULL);
soup_server_listen_all(server, 33333, 0, &error);
g_assert_no_error(error);
soup_server_add_websocket_handler(server, "/", NULL, NULL, websocket_client_connect_cb, NULL, NULL);
g_message("ws server started");
/* run mainloop */
g_main_loop_run(mainloop);
}
This starts a simple websocket server with 1 handler and registers the usual signal callbacks. The new problem is, every time a websocket client disconnects from this server, I run into this g_assert:
[benjamin@pc-0480-19-0139 spielwiese]$ ./main
** Message: 11:08:27.392: ws server started
** Message: 11:08:33.295: websocket_client_connect_cb
** Message: 11:08:34.709: websocket_client_closed_cb
**
libsoup:ERROR:../libsoup/soup-websocket-connection.c:1445:soup_websocket_connection_finalize: assertion failed: (!pv->input_source)
Bail out! libsoup:ERROR:../libsoup/soup-websocket-connection.c:1445:soup_websocket_connection_finalize: assertion failed: (!pv->input_source)
Aborted (core dumped)
[benjamin@pc-0480-19-0139 spielwiese]$
This assertion is new and did not happen before the commit I mentioned at the beginning. I do NOT run into this g_assert if I'm either not using g_object_unref(ws) in function websocket_client_closed_cb or delay it by 1s. But I HAVE to use g_object_ref(ws) in function websocket_client_connect_cb otherwise the SoupWebsocketConnection *ws would not survive. After I discovered that, I took a look into your regression code (namely tests/websocket-tests.c) and found you doing the same: g_object_ref(ws) on every client connect and no g_object_unref(ws) on "closed".
At last, I used valgrind on my example code and found out that it's pretty leaky w/o g_object_unref(ws).
So my question: did I do something wrong in my example code or is this possibly a bug?
With best regards
Benjamin Reikowski
Wir ziehen um! Bitte beachten Sie unsere neue Anschrift ab 1.4.2020:
We're moving! Please note our new address from 1.4.2020:
DResearch Fahrzeugelektronik GmbH
Tor 2, Aufgang R (R03.020)
Wolfener Straße 36
12681 Berlin
[Date Prev][
Date Next] [Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]