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
|
--- cpp.orig/src/Glacier2/RequestQueue.cpp 2011-06-15 21:43:58.000000000 +0200
+++ cpp/src/Glacier2/RequestQueue.cpp 2012-03-04 19:39:27.000000000 +0100
@@ -185,7 +185,8 @@
_callback(newCallback_Object_ice_invoke(this, &RequestQueue::response, &RequestQueue::exception,
&RequestQueue::sent)),
_flushCallback(newCallback_Connection_flushBatchRequests(this, &RequestQueue::exception, &RequestQueue::sent)),
- _pendingSend(false)
+ _pendingSend(false),
+ _destroyed(false)
{
}
@@ -241,6 +242,37 @@
}
void
+Glacier2::RequestQueue::destroy()
+{
+ IceUtil::Mutex::Lock lock(*this);
+
+ _destroyed = true;
+
+ //
+ // Although the session has been destroyed, we cannot destroy this queue
+ // until all requests have completed.
+ //
+ if(_requests.empty())
+ {
+ destroyInternal();
+ }
+}
+
+void
+Glacier2::RequestQueue::destroyInternal()
+{
+ //
+ // Must be called with the mutex locked.
+ //
+
+ //
+ // Remove cyclic references.
+ //
+ const_cast<Ice::Callback_Object_ice_invokePtr&>(_callback) = 0;
+ const_cast<Ice::Callback_Connection_flushBatchRequestsPtr&>(_flushCallback) = 0;
+}
+
+void
Glacier2::RequestQueue::flush()
{
assert(_connection);
@@ -289,6 +321,11 @@
_pendingSendRequest = 0;
}
}
+
+ if(_destroyed && _requests.empty())
+ {
+ destroyInternal();
+ }
}
void
@@ -312,6 +349,11 @@
}
}
_requests.clear();
+
+ if(_destroyed)
+ {
+ destroyInternal();
+ }
}
void
|