summaryrefslogtreecommitdiff
path: root/src/core/servers.c
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2001-10-21 13:59:07 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2001-10-21 13:59:07 +0000
commit1256621041e46c11a20646b389ba33192b054781 (patch)
treec846a6bb1fea5470b5d0666effc2d2a431ae379f /src/core/servers.c
parentae1b5b0d50b58a4230ce45a09c0ee98231d28f0e (diff)
downloadirssi-1256621041e46c11a20646b389ba33192b054781.zip
Added reference counter to SERVER_CONNECT_REC. Since it's being moved around
a lot in reconnects etc. this should make it easier to track when it's supposed to be destroyed. Hopefully fixes a crash I assume is related to this but couldn't find.. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1880 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/core/servers.c')
-rw-r--r--src/core/servers.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/core/servers.c b/src/core/servers.c
index 6b6c8087..0c1bcc6f 100644
--- a/src/core/servers.c
+++ b/src/core/servers.c
@@ -59,7 +59,7 @@ void server_connect_failed(SERVER_REC *server, const char *msg)
}
MODULE_DATA_DEINIT(server);
- server_connect_free(server->connrec);
+ server_connect_unref(server->connrec);
g_free_not_null(server->nick);
g_free(server->tag);
g_free(server);
@@ -361,7 +361,7 @@ void server_disconnect(SERVER_REC *server)
g_source_remove(server->readtag);
MODULE_DATA_DEINIT(server);
- server_connect_free(server->connrec);
+ server_connect_unref(server->connrec);
rawlog_destroy(server->rawlog);
line_split_free(server->buffer);
g_free_not_null(server->version);
@@ -413,12 +413,25 @@ SERVER_REC *server_find_chatnet(const char *chatnet)
return NULL;
}
-void server_connect_free(SERVER_CONNECT_REC *conn)
+void server_connect_ref(SERVER_CONNECT_REC *conn)
+{
+ conn->refcount++;
+}
+
+void server_connect_unref(SERVER_CONNECT_REC *conn)
{
g_return_if_fail(IS_SERVER_CONNECT(conn));
- signal_emit("server connect free", 1, conn);
- g_free_not_null(conn->proxy);
+ if (--conn->refcount > 0)
+ return;
+ if (conn->refcount < 0) {
+ g_warning("Connection '%s' refcount = %d",
+ conn->tag, conn->refcount);
+ }
+
+ CHAT_PROTOCOL(conn)->destroy_server_connect(conn);
+
+ g_free_not_null(conn->proxy);
g_free_not_null(conn->proxy_string);
g_free_not_null(conn->proxy_password);