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
|
#include "Collocated_Invocation.h"
#include "Collocation_Proxy_Broker.h"
#include "operation_details.h"
ACE_RCSID (tao,
Collocated_Invocation,
"$Id$")
namespace TAO
{
Collocated_Invocation::Collocated_Invocation (CORBA::Object_ptr t,
CORBA::Object_ptr et,
TAO_Stub *stub,
TAO_Operation_Details &detail,
bool response_expected)
: Invocation_Base (t,
et,
stub,
detail,
response_expected)
{
}
Invocation_Status
Collocated_Invocation::invoke (Collocation_Proxy_Broker *cpb,
Collocation_Strategy strat
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::Exception))
{
Invocation_Status s = TAO_INVOKE_FAILURE;
/// Start the interception point
#if TAO_HAS_INTERCEPTORS == 1
s =
this->send_request_interception (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (TAO_INVOKE_FAILURE);
if (s != TAO_INVOKE_SUCCESS)
return s;
#endif /*TAO_HAS_INTERCEPTORS */
ACE_TRY
{
cpb->dispatch (this->effective_target (),
this->forwarded_to_.out (),
this->details_.args (),
this->details_.args_num (),
this->details_.opname (),
this->details_.opname_len (),
strat
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Invocation completed succesfully
s = TAO_INVOKE_SUCCESS;
#if TAO_HAS_INTERCEPTORS == 1
if (this->forwarded_to_.in () ||
this->response_expected_ == false)
{
if (this->forwarded_to_.in ())
this->reply_received (TAO_INVOKE_RESTART);
s =
this->receive_other_interception (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
// NOTE: Any other condition that needs handling?
else if (this->response_expected ())
{
this->reply_received (TAO_INVOKE_SUCCESS);
s =
this->receive_reply_interception (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
if (s != TAO_INVOKE_SUCCESS)
return s;
#endif /*TAO_HAS_INTERCEPTORS */
}
ACE_CATCHANY
{
// Ignore exceptions for oneways
if (this->response_expected_ == false)
return TAO_INVOKE_SUCCESS;
#if TAO_HAS_INTERCEPTORS == 1
PortableInterceptor::ReplyStatus status =
this->handle_any_exception (&ACE_ANY_EXCEPTION
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (status == PortableInterceptor::LOCATION_FORWARD ||
status == PortableInterceptor::TRANSPORT_RETRY)
s = TAO_INVOKE_RESTART;
else
#endif /*TAO_HAS_INTERCEPTORS*/
ACE_RE_THROW;
}
# if defined (ACE_HAS_EXCEPTIONS) \
&& defined (ACE_HAS_BROKEN_UNEXPECTED_EXCEPTIONS)
ACE_CATCHALL
{
if (this->response_expected () == false)
return TAO_INVOKE_SUCCESS;
#if TAO_HAS_INTERCEPTORS == 1
PortableInterceptor::ReplyStatus st =
this->handle_all_exception (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
if (st == PortableInterceptor::LOCATION_FORWARD ||
st == PortableInterceptor::TRANSPORT_RETRY)
s = TAO_INVOKE_RESTART;
else
#endif /*TAO_HAS_INTERCEPTORS == 1*/
ACE_RE_THROW;
}
# endif /* ACE_HAS_EXCEPTIONS &&
ACE_HAS_BROKEN_UNEXPECTED_EXCEPTION*/
ACE_ENDTRY;
ACE_CHECK_RETURN (TAO_INVOKE_FAILURE);
if (this->forwarded_to_.in () != 0)
s = TAO_INVOKE_RESTART;
return s;
}
}
|