summaryrefslogtreecommitdiff
path: root/devel/ice/files/patch-cpp-src-Glacier2-RequestQueue.cpp
blob: e6b336b265c1f5265a131d57020bc0d2cdbc4c3d (plain) (blame)
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