1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
from gnome bug #466574
Index: src/orb/GIOP/giop-recv-buffer.c
===================================================================
--- src/orb/GIOP/giop-recv-buffer.c (revision 2016)
+++ src/orb/GIOP/giop-recv-buffer.c (working copy)
@@ -736,6 +736,7 @@
link_io_thread_remove_timeout (ent->cnx->parent.timeout_source_id);
ent->cnx->parent.timeout_source_id = 0;
ent->cnx->parent.timeout_status = LINK_TIMEOUT_NO;
+ g_object_unref (&ent->cnx->parent); // we remove the source so we must unref the connection
} else if (ent->cnx->parent.timeout_status == LINK_TIMEOUT_YES)
*timeout = TRUE;
g_mutex_unlock (ent->cnx->parent.timeout_mutex);
@@ -1355,17 +1356,12 @@
return TRUE;
}
-struct timeout_thread_data {
- GIOPThread *tdata;
- LinkConnection *lcnx;
-};
-
static gboolean
-giop_timeout(gpointer data)
+giop_timeout (gpointer data)
{
gboolean retv = FALSE;
- LinkConnection *lcnx = ((struct timeout_thread_data*)data)->lcnx;
- GIOPThread *tdata = ((struct timeout_thread_data*)data)->tdata;
+ LinkConnection *lcnx = (LinkConnection*)data;
+ GIOPThread *tdata = (GIOPThread *)lcnx->tdata;
g_assert (lcnx->timeout_mutex);
@@ -1386,27 +1382,29 @@
giop_incoming_signal_T (tdata, GIOP_CLOSECONNECTION);
g_mutex_unlock (tdata->lock); /* ent_lock */
-out:
- g_object_unref (lcnx);
- g_free (data);
+ g_object_unref (lcnx); // we remove the source so we must unref lcnx
+out:
return retv;
}
void
-giop_timeout_add(GIOPConnection *cnx)
+giop_timeout_add (GIOPConnection *cnx)
{
- struct timeout_thread_data *data = NULL;
+ static GStaticMutex static_mutex = G_STATIC_MUTEX_INIT;
LinkConnection *lcnx = LINK_CONNECTION (cnx);
- GSource *timeout_source = NULL;
if (!giop_thread_io ())
return;
if (!lcnx->timeout_msec)
return;
- g_object_ref (lcnx);
+ g_static_mutex_lock (&static_mutex);
+ if (lcnx->timeout_source_id)
+ goto out;
+ g_object_ref (lcnx); // to be unref'ed by the one who removes the timeout source
+
if (!lcnx->timeout_mutex)
lcnx->timeout_mutex = g_mutex_new ();
@@ -1414,11 +1412,12 @@
lcnx->timeout_status = LINK_TIMEOUT_UNKNOWN;
g_mutex_unlock (lcnx->timeout_mutex);
- data = g_new0 (struct timeout_thread_data, 1);
- data->tdata = giop_thread_self ();
- data->lcnx = lcnx;
+ lcnx->tdata = giop_thread_self ();
- lcnx->timeout_source_id = link_io_thread_add_timeout (lcnx->timeout_msec, giop_timeout, data);
+ lcnx->timeout_source_id = link_io_thread_add_timeout (lcnx->timeout_msec, giop_timeout, (gpointer)lcnx);
+
+out:
+ g_static_mutex_unlock (&static_mutex);
}
GIOPRecvBuffer *
Index: src/orb/GIOP/giop-send-buffer.c
===================================================================
--- src/orb/GIOP/giop-send-buffer.c (revision 2016)
+++ src/orb/GIOP/giop-send-buffer.c (working copy)
@@ -456,6 +456,7 @@
if (g_thread_supported ()
&& lcnx->timeout_msec
+ && !lcnx->timeout_source_id
&& !giop_send_buffer_is_oneway (buf)) {
giop_timeout_add (cnx);
}
Index: linc2/include/linc/linc-connection.h
===================================================================
--- linc2/include/linc/linc-connection.h (revision 2016)
+++ linc2/include/linc/linc-connection.h (working copy)
@@ -67,6 +67,7 @@
guint timeout_msec;
guint timeout_source_id; // protected by timeout_mutex
LinkTimeoutStatus timeout_status; // protected by timeout_mutex
+ void *tdata; // "do not pollute the namespace"-hack (it's a GIOPThread*)
} LinkConnection;
typedef struct {
Index: linc2/src/linc-connection.c
===================================================================
--- linc2/src/linc-connection.c (revision 2016)
+++ linc2/src/linc-connection.c (working copy)
@@ -1269,11 +1269,9 @@
if (cnx->timeout_mutex)
g_mutex_free (cnx->timeout_mutex);
-
- if (cnx->timeout_source_id)
+ if (cnx->timeout_source_id)
link_io_thread_remove_timeout (cnx->timeout_source_id);
-
#ifdef G_ENABLE_DEBUG
g_assert (g_list_find(cnx_list, cnx) == NULL);
#endif
@@ -1294,6 +1292,7 @@
cnx->timeout_msec = 0;
cnx->timeout_source_id = 0;
cnx->timeout_status = LINK_TIMEOUT_UNKNOWN;
+ cnx->tdata = NULL;
#ifdef CONNECTION_DEBUG
cnx->priv->total_read_bytes = 0;
|