r2corba 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGES +159 -0
- data/LICENSE +59 -0
- data/README +62 -0
- data/THANKS +52 -0
- data/bin/r2corba +8 -0
- data/bin/ridlc +11 -0
- data/bin/rins +7 -0
- data/ext/ext.mwc +6 -0
- data/ext/extload/extload.c +60 -0
- data/ext/libr2tao/any.cpp +1543 -0
- data/ext/libr2tao/exception.cpp +202 -0
- data/ext/libr2tao/exception.h +104 -0
- data/ext/libr2tao/longdouble.cpp +173 -0
- data/ext/libr2tao/longdouble.h +31 -0
- data/ext/libr2tao/object.cpp +1150 -0
- data/ext/libr2tao/object.h +38 -0
- data/ext/libr2tao/orb.cpp +1029 -0
- data/ext/libr2tao/orb.h +36 -0
- data/ext/libr2tao/r2tao_export.h +45 -0
- data/ext/libr2tao/r2tao_ext.h +38 -0
- data/ext/libr2tao/required.cpp +463 -0
- data/ext/libr2tao/required.h +187 -0
- data/ext/libr2tao/typecode.cpp +888 -0
- data/ext/libr2tao/typecode.h +45 -0
- data/ext/libr2tao/values.cpp +2938 -0
- data/ext/libr2tao/values.h +396 -0
- data/ext/librpoa/iortable.cpp +250 -0
- data/ext/librpoa/poa.cpp +1076 -0
- data/ext/librpoa/poa.h +24 -0
- data/ext/librpoa/rpoa_export.h +44 -0
- data/ext/librpoa/servant.cpp +1338 -0
- data/ext/librpoa/servant.h +116 -0
- data/ext/librpoa/srvreq_fix.cpp +283 -0
- data/ext/librpoa/srvreq_fix.h +149 -0
- data/ext/librpol/policies.cpp +763 -0
- data/ext/librpol/policies.h +15 -0
- data/ext/librpol/rpol_export.h +44 -0
- data/lib/corba/cbase/IORMap.rb +33 -0
- data/lib/corba/cbase/ORB.rb +231 -0
- data/lib/corba/cbase/Request.rb +134 -0
- data/lib/corba/cbase/Streams.rb +129 -0
- data/lib/corba/cbase/Stub.rb +19 -0
- data/lib/corba/cbase/Typecode.rb +441 -0
- data/lib/corba/cbase/Values.rb +129 -0
- data/lib/corba/cbase/exception.rb +66 -0
- data/lib/corba/cbase/poa.rb +23 -0
- data/lib/corba/cbase/policies.rb +78 -0
- data/lib/corba/cbase/post_require.rb +14 -0
- data/lib/corba/cbase/require.rb +28 -0
- data/lib/corba/cmds/base.rb +85 -0
- data/lib/corba/cmds/test.rb +30 -0
- data/lib/corba/common/Any.rb +91 -0
- data/lib/corba/common/IDL.rb +104 -0
- data/lib/corba/common/ORB.rb +368 -0
- data/lib/corba/common/Object.rb +208 -0
- data/lib/corba/common/Request.rb +20 -0
- data/lib/corba/common/Servant.rb +108 -0
- data/lib/corba/common/Struct.rb +22 -0
- data/lib/corba/common/Stub.rb +79 -0
- data/lib/corba/common/Typecode.rb +1121 -0
- data/lib/corba/common/Union.rb +56 -0
- data/lib/corba/common/Values.rb +92 -0
- data/lib/corba/common/const.rb +22 -0
- data/lib/corba/common/exception.rb +68 -0
- data/lib/corba/common/require.rb +27 -0
- data/lib/corba/common/version.rb +22 -0
- data/lib/corba/idl/IDL.rb +21 -0
- data/lib/corba/idl/IORTable.pidl +62 -0
- data/lib/corba/idl/TAO_Ext.pidl +46 -0
- data/lib/corba/idl/require.rb +20 -0
- data/lib/corba/jbase/Any.rb +273 -0
- data/lib/corba/jbase/IORMap.rb +36 -0
- data/lib/corba/jbase/ORB.rb +99 -0
- data/lib/corba/jbase/Object.rb +98 -0
- data/lib/corba/jbase/Request.rb +226 -0
- data/lib/corba/jbase/Servant.rb +247 -0
- data/lib/corba/jbase/ServerRequest.rb +128 -0
- data/lib/corba/jbase/Streams.rb +671 -0
- data/lib/corba/jbase/Stub.rb +38 -0
- data/lib/corba/jbase/Typecode.rb +520 -0
- data/lib/corba/jbase/Values.rb +173 -0
- data/lib/corba/jbase/exception.rb +106 -0
- data/lib/corba/jbase/poa.rb +229 -0
- data/lib/corba/jbase/policies.rb +300 -0
- data/lib/corba/jbase/post_require.rb +14 -0
- data/lib/corba/jbase/require.rb +86 -0
- data/lib/corba/naming.rb +14 -0
- data/lib/corba/naming_service.rb +15 -0
- data/lib/corba/poa.rb +15 -0
- data/lib/corba/policies.rb +18 -0
- data/lib/corba/require.rb +17 -0
- data/lib/corba/svcs/ins/cos_naming.rb +426 -0
- data/lib/corba/svcs/ins/ins.rb +526 -0
- data/lib/corba/svcs/ins/naming_service.rb +119 -0
- data/lib/corba.rb +16 -0
- data/lib/ridlbe/ruby/config.rb +336 -0
- data/lib/ridlbe/ruby/require.rb +16 -0
- data/lib/ridlbe/ruby/walker.rb +1582 -0
- data/mkrf_conf_srcgem.rb +186 -0
- data/rakelib/bin.rake +80 -0
- data/rakelib/bin.rb +146 -0
- data/rakelib/build.rake +87 -0
- data/rakelib/config.rake +52 -0
- data/rakelib/config.rb +450 -0
- data/rakelib/ext.rake +242 -0
- data/rakelib/ext.rb +308 -0
- data/rakelib/ext_r2tao.rb +232 -0
- data/rakelib/gem.rake +212 -0
- data/rakelib/gem.rb +146 -0
- data/rakelib/package.rake +26 -0
- data/rakelib/test.rake +23 -0
- data/test/BiDirectional/Test.idl +34 -0
- data/test/BiDirectional/client.rb +132 -0
- data/test/BiDirectional/run_test.rb +68 -0
- data/test/BiDirectional/server.rb +169 -0
- data/test/CORBA_Services/Naming/BindingIterator/Test.idl +27 -0
- data/test/CORBA_Services/Naming/BindingIterator/client.rb +121 -0
- data/test/CORBA_Services/Naming/BindingIterator/run_test.rb +82 -0
- data/test/CORBA_Services/Naming/BindingIterator/server.rb +109 -0
- data/test/CORBA_Services/Naming/Corbaname/Test.idl +27 -0
- data/test/CORBA_Services/Naming/Corbaname/client.rb +85 -0
- data/test/CORBA_Services/Naming/Corbaname/run_test.rb +88 -0
- data/test/CORBA_Services/Naming/Corbaname/server.rb +135 -0
- data/test/CORBA_Services/Naming/Simple/Test.idl +27 -0
- data/test/CORBA_Services/Naming/Simple/client.rb +84 -0
- data/test/CORBA_Services/Naming/Simple/run_test.rb +82 -0
- data/test/CORBA_Services/Naming/Simple/server.rb +109 -0
- data/test/Collocation/Diamond.idl +39 -0
- data/test/Collocation/run_test.rb +52 -0
- data/test/Collocation/test.rb +195 -0
- data/test/Connect_Timeout/Test.idl +27 -0
- data/test/Connect_Timeout/client.rb +111 -0
- data/test/Connect_Timeout/run_test.rb +52 -0
- data/test/DII/Test.idl +27 -0
- data/test/DII/client.rb +115 -0
- data/test/DII/run_test.rb +69 -0
- data/test/DII/server.rb +95 -0
- data/test/DSI/Test.idl +27 -0
- data/test/DSI/client.rb +66 -0
- data/test/DSI/run_test.rb +69 -0
- data/test/DSI/server.rb +106 -0
- data/test/Exceptions/Test.idl +48 -0
- data/test/Exceptions/client.rb +118 -0
- data/test/Exceptions/run_test.rb +69 -0
- data/test/Exceptions/server.rb +131 -0
- data/test/Hello/Test.idl +27 -0
- data/test/Hello/client.rb +78 -0
- data/test/Hello/run_test.rb +71 -0
- data/test/Hello/server.rb +95 -0
- data/test/IDL_Test/Test.idl +113 -0
- data/test/IDL_Test/Test_inc.idl +17 -0
- data/test/IDL_Test/client.rb +102 -0
- data/test/IDL_Test/run_test.rb +69 -0
- data/test/IDL_Test/server.rb +99 -0
- data/test/IORMap/Test.idl +27 -0
- data/test/IORMap/client.rb +73 -0
- data/test/IORMap/run_test.rb +69 -0
- data/test/IORMap/server.rb +114 -0
- data/test/IORTable/Test.idl +27 -0
- data/test/IORTable/client.rb +75 -0
- data/test/IORTable/run_test.rb +69 -0
- data/test/IORTable/server.rb +130 -0
- data/test/Implicit_Conversion/Test.idl +31 -0
- data/test/Implicit_Conversion/client.rb +110 -0
- data/test/Implicit_Conversion/run_test.rb +69 -0
- data/test/Implicit_Conversion/server.rb +99 -0
- data/test/Multi_Threading/Multiple_ORB/Test.idl +27 -0
- data/test/Multi_Threading/Multiple_ORB/client.rb +82 -0
- data/test/Multi_Threading/Multiple_ORB/run_test.rb +71 -0
- data/test/Multi_Threading/Multiple_ORB/server.rb +108 -0
- data/test/Multi_Threading/Simple/Test.idl +27 -0
- data/test/Multi_Threading/Simple/client.rb +88 -0
- data/test/Multi_Threading/Simple/run_test.rb +69 -0
- data/test/Multi_Threading/Simple/server.rb +118 -0
- data/test/Multi_Threading/Threads/Test.idl +31 -0
- data/test/Multi_Threading/Threads/client.rb +80 -0
- data/test/Multi_Threading/Threads/run_test.rb +76 -0
- data/test/Multi_Threading/Threads/server.rb +119 -0
- data/test/Multi_Threading/Threads/watchdog.rb +87 -0
- data/test/Multiple_Servant_Interfaces/Test.idl +34 -0
- data/test/Multiple_Servant_Interfaces/client.rb +70 -0
- data/test/Multiple_Servant_Interfaces/run_test.rb +69 -0
- data/test/Multiple_Servant_Interfaces/server.rb +102 -0
- data/test/Nil/Test.idl +27 -0
- data/test/Nil/run_test.rb +52 -0
- data/test/Nil/test.rb +78 -0
- data/test/OBV/AbstractInterface/client.rb +179 -0
- data/test/OBV/AbstractInterface/run_test.rb +69 -0
- data/test/OBV/AbstractInterface/server.rb +149 -0
- data/test/OBV/AbstractInterface/test.idl +53 -0
- data/test/OBV/Custom/OBV.idl +18 -0
- data/test/OBV/Custom/OBV_impl.rb +40 -0
- data/test/OBV/Custom/client.rb +86 -0
- data/test/OBV/Custom/run_test.rb +69 -0
- data/test/OBV/Custom/server.rb +100 -0
- data/test/OBV/Simple/OBV.idl +15 -0
- data/test/OBV/Simple/OBV_impl.rb +26 -0
- data/test/OBV/Simple/client.rb +86 -0
- data/test/OBV/Simple/run_test.rb +69 -0
- data/test/OBV/Simple/server.rb +100 -0
- data/test/OBV/Simple_Event/Event.idl +15 -0
- data/test/OBV/Simple_Event/Event_impl.rb +26 -0
- data/test/OBV/Simple_Event/client.rb +86 -0
- data/test/OBV/Simple_Event/run_test.rb +69 -0
- data/test/OBV/Simple_Event/server.rb +100 -0
- data/test/OBV/Supports/client.rb +116 -0
- data/test/OBV/Supports/run_test.rb +69 -0
- data/test/OBV/Supports/server.rb +103 -0
- data/test/OBV/Supports/supports.idl +33 -0
- data/test/OBV/Supports/supports_impl.rb +57 -0
- data/test/OBV/Tree/client.rb +116 -0
- data/test/OBV/Tree/run_test.rb +69 -0
- data/test/OBV/Tree/server.rb +117 -0
- data/test/OBV/Tree/test.idl +32 -0
- data/test/OBV/Truncatable/Extra.idl +27 -0
- data/test/OBV/Truncatable/Truncatable.idl +105 -0
- data/test/OBV/Truncatable/Truncatable_impl.rb +86 -0
- data/test/OBV/Truncatable/client.rb +279 -0
- data/test/OBV/Truncatable/run_test.rb +69 -0
- data/test/OBV/Truncatable/server.rb +89 -0
- data/test/OBV/ValueBox/client.rb +497 -0
- data/test/OBV/ValueBox/run_test.rb +69 -0
- data/test/OBV/ValueBox/server.rb +271 -0
- data/test/OBV/ValueBox/valuebox.idl +101 -0
- data/test/OBV/ValueBox/vb_basic.idl +75 -0
- data/test/OBV/ValueBox/vb_struct.idl +68 -0
- data/test/OBV/ValueBox/vb_union.idl +21 -0
- data/test/Object/Test.idl +27 -0
- data/test/Object/client.rb +103 -0
- data/test/Object/run_test.rb +69 -0
- data/test/Object/server.rb +126 -0
- data/test/POA/Test.idl +27 -0
- data/test/POA/run_test.rb +52 -0
- data/test/POA/test.rb +112 -0
- data/test/Param_Test/Test.idl +182 -0
- data/test/Param_Test/client.rb +277 -0
- data/test/Param_Test/run_test.rb +69 -0
- data/test/Param_Test/server.rb +296 -0
- data/test/Performance/Simple/Test.idl +27 -0
- data/test/Performance/Simple/client.rb +90 -0
- data/test/Performance/Simple/run_test.rb +69 -0
- data/test/Performance/Simple/server.rb +95 -0
- data/test/Policies/Test.idl +27 -0
- data/test/Policies/run_test.rb +52 -0
- data/test/Policies/test.rb +144 -0
- data/test/Timeout/client.rb +207 -0
- data/test/Timeout/run_test.rb +69 -0
- data/test/Timeout/server.rb +109 -0
- data/test/Timeout/test.idl +19 -0
- data/test/lib/assert.rb +43 -0
- data/test/lib/test.rb +542 -0
- data/test/test_runner.rb +193 -0
- metadata +334 -0
|
@@ -0,0 +1,1029 @@
|
|
|
1
|
+
/*--------------------------------------------------------------------
|
|
2
|
+
# orb.cpp - R2TAO CORBA ORB support
|
|
3
|
+
#
|
|
4
|
+
# Author: Martin Corino
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can redistribute it and/or
|
|
7
|
+
# modify it under the terms of the R2CORBA LICENSE which is
|
|
8
|
+
# included with this program.
|
|
9
|
+
#
|
|
10
|
+
# Copyright (c) Remedy IT Expertise BV
|
|
11
|
+
# Chamber of commerce Rotterdam nr.276339, The Netherlands
|
|
12
|
+
#------------------------------------------------------------------*/
|
|
13
|
+
|
|
14
|
+
#include "orb.h"
|
|
15
|
+
#include "exception.h"
|
|
16
|
+
#include "object.h"
|
|
17
|
+
#include "typecode.h"
|
|
18
|
+
#include "values.h"
|
|
19
|
+
#include "tao/corba.h"
|
|
20
|
+
#include "tao/ORB_Core.h"
|
|
21
|
+
#include "ace/Reactor.h"
|
|
22
|
+
#include "ace/Signal.h"
|
|
23
|
+
#include "ace/Sig_Handler.h"
|
|
24
|
+
#include "ace/Auto_Ptr.h"
|
|
25
|
+
|
|
26
|
+
#define RUBY_INVOKE_FUNC RUBY_ALLOC_FUNC
|
|
27
|
+
|
|
28
|
+
R2TAO_EXPORT VALUE r2corba_cORB = 0;
|
|
29
|
+
R2TAO_EXPORT VALUE r2tao_cORB = 0;
|
|
30
|
+
VALUE r2tao_nsPolicy = 0;
|
|
31
|
+
|
|
32
|
+
extern VALUE r2tao_cValueFactoryBase;
|
|
33
|
+
|
|
34
|
+
/* ruby */
|
|
35
|
+
static VALUE r2tao_ORB_hash(VALUE self);
|
|
36
|
+
static VALUE r2tao_ORB_eql(VALUE self, VALUE that);
|
|
37
|
+
|
|
38
|
+
/* orb.h */
|
|
39
|
+
static VALUE rCORBA_ORB_init(int _argc, VALUE *_argv0, VALUE klass);
|
|
40
|
+
static VALUE rCORBA_ORB_object_to_string(VALUE self, VALUE obj);
|
|
41
|
+
static VALUE rCORBA_ORB_string_to_object(VALUE self, VALUE str);
|
|
42
|
+
static VALUE rCORBA_ORB_get_service_information(VALUE self, VALUE service_type);
|
|
43
|
+
static VALUE rCORBA_ORB_get_current(VALUE self);
|
|
44
|
+
static VALUE rCORBA_ORB_list_initial_services(VALUE self);
|
|
45
|
+
static VALUE rCORBA_ORB_resolve_initial_references(VALUE self, VALUE identifier);
|
|
46
|
+
static VALUE rCORBA_ORB_register_initial_reference(VALUE self, VALUE identifier, VALUE obj);
|
|
47
|
+
|
|
48
|
+
static VALUE rCORBA_ORB_work_pending(int _argc, VALUE *_argv, VALUE self);
|
|
49
|
+
static VALUE rCORBA_ORB_perform_work(int _argc, VALUE *_argv, VALUE self);
|
|
50
|
+
static VALUE rCORBA_ORB_run(int _argc, VALUE *_argv, VALUE self);
|
|
51
|
+
static VALUE rCORBA_ORB_shutdown(int _argc, VALUE *_argv, VALUE self);
|
|
52
|
+
static VALUE rCORBA_ORB_destroy(VALUE self);
|
|
53
|
+
|
|
54
|
+
static VALUE rCORBA_ORB_register_value_factory(VALUE self, VALUE id, VALUE factory);
|
|
55
|
+
static VALUE rCORBA_ORB_unregister_value_factory(VALUE self, VALUE id);
|
|
56
|
+
static VALUE rCORBA_ORB_lookup_value_factory(VALUE self, VALUE id);
|
|
57
|
+
|
|
58
|
+
class R2CSigGuard : public ACE_Event_Handler
|
|
59
|
+
{
|
|
60
|
+
public:
|
|
61
|
+
R2CSigGuard(CORBA::ORB_ptr orb, bool signal_reactor = true);
|
|
62
|
+
virtual ~R2CSigGuard();
|
|
63
|
+
|
|
64
|
+
virtual int handle_signal (int signum,
|
|
65
|
+
siginfo_t * = 0,
|
|
66
|
+
ucontext_t * = 0);
|
|
67
|
+
|
|
68
|
+
bool has_caught_signal () { return this->m_signal_caught; }
|
|
69
|
+
|
|
70
|
+
private:
|
|
71
|
+
class Signal : public ACE_Event_Handler
|
|
72
|
+
{
|
|
73
|
+
public:
|
|
74
|
+
Signal(int signum) : m_signum (signum) {}
|
|
75
|
+
virtual ~Signal() {}
|
|
76
|
+
|
|
77
|
+
virtual int handle_exception (ACE_HANDLE fd = ACE_INVALID_HANDLE);
|
|
78
|
+
|
|
79
|
+
private:
|
|
80
|
+
int inner_handler ();
|
|
81
|
+
|
|
82
|
+
static void* thread_safe_invoke (void * arg);
|
|
83
|
+
|
|
84
|
+
int m_signum;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
static VALUE c_signums;
|
|
88
|
+
static int c_nsig;
|
|
89
|
+
static ACE_Auto_Ptr<ACE_SIGACTION> c_sa;
|
|
90
|
+
|
|
91
|
+
static void init_ ();
|
|
92
|
+
|
|
93
|
+
CORBA::ORB_var m_orb;
|
|
94
|
+
bool m_signal_reactor;
|
|
95
|
+
ACE_Sig_Handler m_sig_handler;
|
|
96
|
+
ACE_Auto_Ptr<Signal> m_signal;
|
|
97
|
+
bool m_signal_caught;
|
|
98
|
+
#if defined (WIN32)
|
|
99
|
+
R2CSigGuard* m_prev_guard;
|
|
100
|
+
|
|
101
|
+
public:
|
|
102
|
+
static R2CSigGuard* c_sig_guard;
|
|
103
|
+
#endif
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
#if defined (WIN32)
|
|
107
|
+
R2CSigGuard* R2CSigGuard::c_sig_guard = 0;
|
|
108
|
+
|
|
109
|
+
BOOL WINAPI CtrlHandlerRoutine (DWORD /*dwCtrlType*/)
|
|
110
|
+
{
|
|
111
|
+
if (R2CSigGuard::c_sig_guard)
|
|
112
|
+
{
|
|
113
|
+
R2CSigGuard::c_sig_guard->handle_signal (SIGINT);
|
|
114
|
+
}
|
|
115
|
+
return TRUE;
|
|
116
|
+
}
|
|
117
|
+
#endif
|
|
118
|
+
|
|
119
|
+
static void
|
|
120
|
+
_orb_free(void *ptr)
|
|
121
|
+
{
|
|
122
|
+
CORBA::release ((CORBA::ORB_ptr)ptr);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
R2TAO_EXPORT VALUE
|
|
126
|
+
r2tao_ORB_t2r(CORBA::ORB_ptr obj)
|
|
127
|
+
{
|
|
128
|
+
VALUE ret;
|
|
129
|
+
CORBA::ORB_ptr _orb;
|
|
130
|
+
|
|
131
|
+
_orb = CORBA::ORB::_duplicate(obj);
|
|
132
|
+
ret = Data_Wrap_Struct(r2tao_cORB, 0, _orb_free, _orb);
|
|
133
|
+
|
|
134
|
+
return ret;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
R2TAO_EXPORT CORBA::ORB_ptr
|
|
138
|
+
r2tao_ORB_r2t(VALUE obj)
|
|
139
|
+
{
|
|
140
|
+
CORBA::ORB_ptr ret;
|
|
141
|
+
|
|
142
|
+
r2tao_check_type(obj, r2tao_cORB);
|
|
143
|
+
Data_Get_Struct(obj, CORBA::ORB, ret);
|
|
144
|
+
return ret;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
R2TAO_EXPORT VALUE
|
|
148
|
+
r2corba_ORB_t2r(CORBA::ORB_ptr obj)
|
|
149
|
+
{
|
|
150
|
+
static ID wrap_native_ID = rb_intern ("_wrap_native");
|
|
151
|
+
|
|
152
|
+
return rb_funcall (r2corba_cORB, wrap_native_ID, 1 , r2tao_ORB_t2r (obj));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
R2TAO_EXPORT CORBA::ORB_ptr
|
|
156
|
+
r2corba_ORB_r2t(VALUE obj)
|
|
157
|
+
{
|
|
158
|
+
static ID orb_ID = rb_intern ("orb_");
|
|
159
|
+
|
|
160
|
+
r2tao_check_type(obj, r2corba_cORB);
|
|
161
|
+
return r2tao_ORB_r2t (rb_funcall (obj, orb_ID, 0));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
void
|
|
165
|
+
r2tao_Init_ORB()
|
|
166
|
+
{
|
|
167
|
+
VALUE klass;
|
|
168
|
+
|
|
169
|
+
if (r2tao_cORB) return;
|
|
170
|
+
r2tao_Init_Object();
|
|
171
|
+
|
|
172
|
+
// CORBA::ORB
|
|
173
|
+
r2corba_cORB = rb_eval_string ("::R2CORBA::CORBA::ORB");
|
|
174
|
+
// CORBA::Native::ORB
|
|
175
|
+
klass = r2tao_cORB =
|
|
176
|
+
rb_define_class_under (r2tao_nsCORBA_Native, "ORB", rb_cObject);
|
|
177
|
+
|
|
178
|
+
rb_define_method(klass, "==", RUBY_METHOD_FUNC(r2tao_ORB_eql), 1);
|
|
179
|
+
rb_define_method(klass, "hash", RUBY_METHOD_FUNC(r2tao_ORB_hash), 0);
|
|
180
|
+
rb_define_method(klass, "eql?", RUBY_METHOD_FUNC(r2tao_ORB_eql), 1);
|
|
181
|
+
|
|
182
|
+
rb_define_singleton_method(klass, "init", RUBY_METHOD_FUNC(rCORBA_ORB_init), -1);
|
|
183
|
+
|
|
184
|
+
#define DEF_METHOD(NAME, NUM)\
|
|
185
|
+
rb_define_method(klass, #NAME, RUBY_METHOD_FUNC( rCORBA_ORB_ ## NAME ), NUM);
|
|
186
|
+
|
|
187
|
+
DEF_METHOD(object_to_string, 1);
|
|
188
|
+
DEF_METHOD(string_to_object, 1);
|
|
189
|
+
DEF_METHOD(get_service_information, 1);
|
|
190
|
+
DEF_METHOD(get_current, 0);
|
|
191
|
+
DEF_METHOD(list_initial_services, 0);
|
|
192
|
+
DEF_METHOD(resolve_initial_references, 1);
|
|
193
|
+
DEF_METHOD(register_initial_reference, 2);
|
|
194
|
+
DEF_METHOD(work_pending, -1);
|
|
195
|
+
DEF_METHOD(perform_work, -1);
|
|
196
|
+
DEF_METHOD(shutdown, -1);
|
|
197
|
+
DEF_METHOD(run, -1);
|
|
198
|
+
DEF_METHOD(destroy, 0);
|
|
199
|
+
DEF_METHOD(register_value_factory, 2);
|
|
200
|
+
DEF_METHOD(unregister_value_factory, 1);
|
|
201
|
+
DEF_METHOD(lookup_value_factory, 1);
|
|
202
|
+
#undef DEF_METHOD
|
|
203
|
+
|
|
204
|
+
#if defined (WIN32)
|
|
205
|
+
if (!::SetConsoleCtrlHandler(CtrlHandlerRoutine, TRUE))
|
|
206
|
+
{
|
|
207
|
+
ACE_DEBUG ((LM_ERROR, ACE_TEXT ("Failed to set Console Ctrl handler!\n")));
|
|
208
|
+
}
|
|
209
|
+
#endif
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
//-------------------------------------------------------------------
|
|
213
|
+
// CORBA ORB methods
|
|
214
|
+
//
|
|
215
|
+
//===================================================================
|
|
216
|
+
|
|
217
|
+
static
|
|
218
|
+
VALUE r2tao_ORB_hash(VALUE self)
|
|
219
|
+
{
|
|
220
|
+
return ULONG2NUM((unsigned long)self);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
static
|
|
224
|
+
VALUE r2tao_ORB_eql(VALUE self, VALUE _other)
|
|
225
|
+
{
|
|
226
|
+
CORBA::ORB_ptr other, obj;
|
|
227
|
+
|
|
228
|
+
obj = r2tao_ORB_r2t (self);
|
|
229
|
+
r2tao_check_type (_other, r2tao_cORB);
|
|
230
|
+
other = r2tao_ORB_r2t (_other);
|
|
231
|
+
|
|
232
|
+
if (obj == other)
|
|
233
|
+
return Qtrue;
|
|
234
|
+
else
|
|
235
|
+
return Qfalse;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
static
|
|
239
|
+
VALUE rCORBA_ORB_init(int _argc, VALUE *_argv, VALUE /*klass*/) {
|
|
240
|
+
VALUE v0,v1, args0, id0;
|
|
241
|
+
char *id;
|
|
242
|
+
int argc;
|
|
243
|
+
char **argv;
|
|
244
|
+
int i;
|
|
245
|
+
CORBA::ORB_var orb;
|
|
246
|
+
ACE_Auto_Basic_Ptr<char*> argv_safe;
|
|
247
|
+
|
|
248
|
+
rb_scan_args(_argc, _argv, "02", &v0, &v1);
|
|
249
|
+
|
|
250
|
+
args0 = Qnil;
|
|
251
|
+
id0 = Qnil;
|
|
252
|
+
if (NIL_P(v0)) /* ORB.init() */
|
|
253
|
+
{
|
|
254
|
+
;
|
|
255
|
+
}
|
|
256
|
+
else /* ORB.init(args [, orb_identifier]) */
|
|
257
|
+
{
|
|
258
|
+
Check_Type(v0, T_ARRAY);
|
|
259
|
+
if (!NIL_P(v1))
|
|
260
|
+
{
|
|
261
|
+
Check_Type(v1, T_STRING);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
args0 = v0;
|
|
265
|
+
id0 = v1;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (NIL_P(id0))
|
|
269
|
+
{
|
|
270
|
+
id = 0;
|
|
271
|
+
}
|
|
272
|
+
else
|
|
273
|
+
{
|
|
274
|
+
id = StringValuePtr (id0);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (NIL_P(args0))
|
|
278
|
+
{
|
|
279
|
+
argc = 1;
|
|
280
|
+
argv = new char*[argc];
|
|
281
|
+
argv_safe.reset (argv); /* make sure memory gets clean up */
|
|
282
|
+
argv[0] = RSTRING_PTR (rb_argv0); /* rb_argv0 is program name */
|
|
283
|
+
}
|
|
284
|
+
else
|
|
285
|
+
{
|
|
286
|
+
argc = RARRAY_LEN (args0) + 1;
|
|
287
|
+
argv = new char*[argc];
|
|
288
|
+
argv_safe.reset (argv); /* make sure memory gets clean up */
|
|
289
|
+
argv[0] = (RSTRING_PTR (rb_argv0)); /* rb_argv0 is program name */
|
|
290
|
+
for (i=1; i<argc; i++)
|
|
291
|
+
{
|
|
292
|
+
VALUE av = RARRAY_PTR (args0)[i-1];
|
|
293
|
+
av = rb_check_convert_type(av, T_STRING, "String", "to_s");
|
|
294
|
+
argv[i] = StringValueCStr(av);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
R2TAO_TRY
|
|
299
|
+
{
|
|
300
|
+
orb = CORBA::ORB_init(argc, argv, id);
|
|
301
|
+
}
|
|
302
|
+
R2TAO_CATCH;
|
|
303
|
+
|
|
304
|
+
return r2tao_ORB_t2r(orb.in ());
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
static
|
|
308
|
+
VALUE rCORBA_ORB_object_to_string(VALUE self, VALUE _obj)
|
|
309
|
+
{
|
|
310
|
+
CORBA::Object_ptr obj;
|
|
311
|
+
char *str=0;
|
|
312
|
+
CORBA::ORB_ptr orb;
|
|
313
|
+
|
|
314
|
+
orb = r2tao_ORB_r2t (self);
|
|
315
|
+
obj = r2tao_Object_r2t (_obj);
|
|
316
|
+
|
|
317
|
+
if (obj->_is_local ())
|
|
318
|
+
{
|
|
319
|
+
rb_raise (r2tao_cMARSHAL, "local object");
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
R2TAO_TRY
|
|
323
|
+
{
|
|
324
|
+
str = orb->object_to_string (obj);
|
|
325
|
+
}
|
|
326
|
+
R2TAO_CATCH;
|
|
327
|
+
|
|
328
|
+
return rb_str_new2(str);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
static
|
|
332
|
+
VALUE rCORBA_ORB_string_to_object(VALUE self, VALUE _str)
|
|
333
|
+
{
|
|
334
|
+
CORBA::Object_var obj;
|
|
335
|
+
char *str=0;
|
|
336
|
+
CORBA::ORB_ptr orb;
|
|
337
|
+
|
|
338
|
+
orb = r2tao_ORB_r2t (self);
|
|
339
|
+
Check_Type(_str, T_STRING);
|
|
340
|
+
str = RSTRING_PTR (_str);
|
|
341
|
+
|
|
342
|
+
R2TAO_TRY
|
|
343
|
+
{
|
|
344
|
+
obj = orb->string_to_object (str);
|
|
345
|
+
}
|
|
346
|
+
R2TAO_CATCH;
|
|
347
|
+
|
|
348
|
+
return r2tao_Object_t2r(obj.in ());
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
static
|
|
352
|
+
VALUE rCORBA_ORB_get_service_information(VALUE /*self*/, VALUE /*service_type*/)
|
|
353
|
+
{
|
|
354
|
+
X_CORBA(NO_IMPLEMENT);
|
|
355
|
+
return Qnil;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
static
|
|
359
|
+
VALUE rCORBA_ORB_get_current(VALUE /*self*/)
|
|
360
|
+
{
|
|
361
|
+
X_CORBA(NO_IMPLEMENT);
|
|
362
|
+
return Qnil;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
static
|
|
366
|
+
VALUE rCORBA_ORB_list_initial_services(VALUE self)
|
|
367
|
+
{
|
|
368
|
+
CORBA::ULong i;
|
|
369
|
+
VALUE ary;
|
|
370
|
+
CORBA::ORB::ObjectIdList_var list;
|
|
371
|
+
CORBA::ORB_ptr orb;
|
|
372
|
+
|
|
373
|
+
orb = r2tao_ORB_r2t (self);
|
|
374
|
+
|
|
375
|
+
R2TAO_TRY
|
|
376
|
+
{
|
|
377
|
+
list = orb->orb_core ()->list_initial_references ();
|
|
378
|
+
}
|
|
379
|
+
R2TAO_CATCH;
|
|
380
|
+
|
|
381
|
+
ary = rb_ary_new2(list->length ());
|
|
382
|
+
for (i=0; i<list->length (); i++)
|
|
383
|
+
{
|
|
384
|
+
char const * id = list[i];
|
|
385
|
+
rb_ary_push (ary, rb_str_new2 (id));
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return ary;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
static
|
|
392
|
+
VALUE rCORBA_ORB_resolve_initial_references(VALUE self, VALUE _id)
|
|
393
|
+
{
|
|
394
|
+
CORBA::Object_var obj;
|
|
395
|
+
char *id;
|
|
396
|
+
CORBA::ORB_ptr orb;
|
|
397
|
+
|
|
398
|
+
orb = r2tao_ORB_r2t (self);
|
|
399
|
+
|
|
400
|
+
Check_Type(_id, T_STRING);
|
|
401
|
+
id = RSTRING_PTR (_id);
|
|
402
|
+
|
|
403
|
+
R2TAO_TRY
|
|
404
|
+
{
|
|
405
|
+
try
|
|
406
|
+
{
|
|
407
|
+
obj = orb->resolve_initial_references(id);
|
|
408
|
+
}
|
|
409
|
+
catch (const CORBA::ORB::InvalidName& ex)
|
|
410
|
+
{
|
|
411
|
+
rb_exc_raise (rb_class_new_instance (0, 0, rb_const_get (r2corba_cORB, rb_intern ("InvalidName"))));
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
R2TAO_CATCH;
|
|
415
|
+
|
|
416
|
+
return r2tao_Object_t2r (obj.in ());
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
static
|
|
420
|
+
VALUE rCORBA_ORB_register_initial_reference(VALUE self, VALUE _id, VALUE _obj)
|
|
421
|
+
{
|
|
422
|
+
CORBA::Object_var obj;
|
|
423
|
+
char *id;
|
|
424
|
+
CORBA::ORB_ptr orb;
|
|
425
|
+
|
|
426
|
+
orb = r2tao_ORB_r2t (self);
|
|
427
|
+
|
|
428
|
+
Check_Type(_id, T_STRING);
|
|
429
|
+
id = RSTRING_PTR (_id);
|
|
430
|
+
obj = r2tao_Object_r2t(_obj);
|
|
431
|
+
|
|
432
|
+
R2TAO_TRY
|
|
433
|
+
{
|
|
434
|
+
try
|
|
435
|
+
{
|
|
436
|
+
orb->register_initial_reference(id, obj.in ());
|
|
437
|
+
}
|
|
438
|
+
catch (const CORBA::ORB::InvalidName& ex)
|
|
439
|
+
{
|
|
440
|
+
rb_exc_raise (rb_class_new_instance (0, 0, rb_const_get (r2corba_cORB, rb_intern ("InvalidName"))));
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
R2TAO_CATCH;
|
|
444
|
+
|
|
445
|
+
return Qnil;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
class R2TAO_ORB_BlockedRegionCaller
|
|
449
|
+
{
|
|
450
|
+
public:
|
|
451
|
+
R2TAO_ORB_BlockedRegionCaller (CORBA::ORB_ptr orb)
|
|
452
|
+
: orb_ (orb),
|
|
453
|
+
timeout_ (0),
|
|
454
|
+
exception_ (false),
|
|
455
|
+
corba_ex_ (0) {}
|
|
456
|
+
R2TAO_ORB_BlockedRegionCaller (CORBA::ORB_ptr orb, ACE_Time_Value& to)
|
|
457
|
+
: orb_ (orb),
|
|
458
|
+
timeout_ (&to),
|
|
459
|
+
exception_ (false),
|
|
460
|
+
corba_ex_ (0) {}
|
|
461
|
+
virtual ~R2TAO_ORB_BlockedRegionCaller ();
|
|
462
|
+
|
|
463
|
+
VALUE call (bool with_unblock=true);
|
|
464
|
+
|
|
465
|
+
static VALUE blocking_func_exec (void *arg);
|
|
466
|
+
static void unblock_func_exec (void *arg);
|
|
467
|
+
|
|
468
|
+
protected:
|
|
469
|
+
VALUE execute ();
|
|
470
|
+
|
|
471
|
+
void shutdown ();
|
|
472
|
+
|
|
473
|
+
virtual VALUE do_exec () = 0;
|
|
474
|
+
|
|
475
|
+
CORBA::ORB_ptr orb_;
|
|
476
|
+
ACE_Time_Value* timeout_;
|
|
477
|
+
bool exception_;
|
|
478
|
+
CORBA::Exception* corba_ex_;
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
R2TAO_ORB_BlockedRegionCaller::~R2TAO_ORB_BlockedRegionCaller()
|
|
482
|
+
{
|
|
483
|
+
if (this->exception_)
|
|
484
|
+
{
|
|
485
|
+
if (corba_ex_)
|
|
486
|
+
{
|
|
487
|
+
ACE_Auto_Basic_Ptr<CORBA::Exception> e_ptr(corba_ex_);
|
|
488
|
+
corba_ex_->_raise ();
|
|
489
|
+
}
|
|
490
|
+
else
|
|
491
|
+
{
|
|
492
|
+
throw ::CORBA::UNKNOWN ();
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
VALUE R2TAO_ORB_BlockedRegionCaller::call (bool with_unblock)
|
|
498
|
+
{
|
|
499
|
+
if (with_unblock)
|
|
500
|
+
return r2tao_blocking_call_ex (R2TAO_ORB_BlockedRegionCaller::blocking_func_exec, this,
|
|
501
|
+
R2TAO_ORB_BlockedRegionCaller::unblock_func_exec, this);
|
|
502
|
+
else
|
|
503
|
+
return r2tao_blocking_call (R2TAO_ORB_BlockedRegionCaller::blocking_func_exec, this);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
VALUE R2TAO_ORB_BlockedRegionCaller::blocking_func_exec (void *arg)
|
|
507
|
+
{
|
|
508
|
+
R2TAO_ORB_BlockedRegionCaller* call_obj =
|
|
509
|
+
reinterpret_cast<R2TAO_ORB_BlockedRegionCaller*> (arg);
|
|
510
|
+
|
|
511
|
+
return call_obj->execute ();
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
void R2TAO_ORB_BlockedRegionCaller::unblock_func_exec (void *arg)
|
|
515
|
+
{
|
|
516
|
+
R2TAO_ORB_BlockedRegionCaller* call_obj =
|
|
517
|
+
reinterpret_cast<R2TAO_ORB_BlockedRegionCaller*> (arg);
|
|
518
|
+
|
|
519
|
+
call_obj->shutdown ();
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
VALUE R2TAO_ORB_BlockedRegionCaller::execute ()
|
|
523
|
+
{
|
|
524
|
+
try {
|
|
525
|
+
return this->do_exec ();
|
|
526
|
+
}
|
|
527
|
+
catch (const CORBA::Exception& ex) {
|
|
528
|
+
this->exception_ = true;
|
|
529
|
+
this->corba_ex_ = ex._tao_duplicate ();
|
|
530
|
+
return Qfalse;
|
|
531
|
+
}
|
|
532
|
+
catch(...) {
|
|
533
|
+
this->exception_ = true;
|
|
534
|
+
return Qfalse;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
void R2TAO_ORB_BlockedRegionCaller::shutdown ()
|
|
539
|
+
{
|
|
540
|
+
this->orb_->shutdown (false);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
class R2TAO_ORB_BlockedRun : public R2TAO_ORB_BlockedRegionCaller
|
|
544
|
+
{
|
|
545
|
+
public:
|
|
546
|
+
R2TAO_ORB_BlockedRun (CORBA::ORB_ptr orb)
|
|
547
|
+
: R2TAO_ORB_BlockedRegionCaller (orb) {}
|
|
548
|
+
R2TAO_ORB_BlockedRun (CORBA::ORB_ptr orb, ACE_Time_Value& to)
|
|
549
|
+
: R2TAO_ORB_BlockedRegionCaller (orb, to) {}
|
|
550
|
+
virtual ~R2TAO_ORB_BlockedRun () {}
|
|
551
|
+
|
|
552
|
+
protected:
|
|
553
|
+
virtual VALUE do_exec ();
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
VALUE R2TAO_ORB_BlockedRun::do_exec ()
|
|
557
|
+
{
|
|
558
|
+
if (this->timeout_ != 0)
|
|
559
|
+
this->orb_->run (*this->timeout_);
|
|
560
|
+
else
|
|
561
|
+
this->orb_->run ();
|
|
562
|
+
return Qnil;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
class R2TAO_ORB_BlockedWorkPending : public R2TAO_ORB_BlockedRegionCaller
|
|
566
|
+
{
|
|
567
|
+
public:
|
|
568
|
+
R2TAO_ORB_BlockedWorkPending (R2CSigGuard& sg, CORBA::ORB_ptr orb)
|
|
569
|
+
: R2TAO_ORB_BlockedRegionCaller (orb), sg_(sg) {}
|
|
570
|
+
R2TAO_ORB_BlockedWorkPending (R2CSigGuard& sg, CORBA::ORB_ptr orb, ACE_Time_Value& to)
|
|
571
|
+
: R2TAO_ORB_BlockedRegionCaller (orb, to), sg_(sg) {}
|
|
572
|
+
virtual ~R2TAO_ORB_BlockedWorkPending ();
|
|
573
|
+
|
|
574
|
+
protected:
|
|
575
|
+
virtual VALUE do_exec ();
|
|
576
|
+
|
|
577
|
+
private:
|
|
578
|
+
R2CSigGuard& sg_;
|
|
579
|
+
};
|
|
580
|
+
|
|
581
|
+
R2TAO_ORB_BlockedWorkPending::~R2TAO_ORB_BlockedWorkPending()
|
|
582
|
+
{
|
|
583
|
+
if (this->exception_)
|
|
584
|
+
{
|
|
585
|
+
this->exception_ = false; // reset for base destructor
|
|
586
|
+
try {
|
|
587
|
+
if (corba_ex_)
|
|
588
|
+
{
|
|
589
|
+
ACE_Auto_Basic_Ptr<CORBA::Exception> e_ptr(corba_ex_);
|
|
590
|
+
corba_ex_->_raise ();
|
|
591
|
+
}
|
|
592
|
+
else
|
|
593
|
+
{
|
|
594
|
+
throw ::CORBA::UNKNOWN ();
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
catch (const CORBA::INTERNAL& ex) {
|
|
598
|
+
// Fix; TAO throws CORBA::INTERNAL when work_pending
|
|
599
|
+
// returns with an EINTR error
|
|
600
|
+
if (!this->sg_.has_caught_signal ())
|
|
601
|
+
{
|
|
602
|
+
// propagate exception if no signal caught
|
|
603
|
+
throw;
|
|
604
|
+
}
|
|
605
|
+
// else ignore exception
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
VALUE R2TAO_ORB_BlockedWorkPending::do_exec ()
|
|
611
|
+
{
|
|
612
|
+
CORBA::Boolean rc = false;
|
|
613
|
+
if (this->timeout_ != 0)
|
|
614
|
+
rc = this->orb_->work_pending (*this->timeout_);
|
|
615
|
+
else
|
|
616
|
+
rc = this->orb_->work_pending ();
|
|
617
|
+
return rc ? Qtrue : Qfalse;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
class R2TAO_ORB_BlockedPerformWork : public R2TAO_ORB_BlockedRegionCaller
|
|
621
|
+
{
|
|
622
|
+
public:
|
|
623
|
+
R2TAO_ORB_BlockedPerformWork (CORBA::ORB_ptr orb)
|
|
624
|
+
: R2TAO_ORB_BlockedRegionCaller (orb) {}
|
|
625
|
+
R2TAO_ORB_BlockedPerformWork (CORBA::ORB_ptr orb, ACE_Time_Value& to)
|
|
626
|
+
: R2TAO_ORB_BlockedRegionCaller (orb, to) {}
|
|
627
|
+
virtual ~R2TAO_ORB_BlockedPerformWork () {}
|
|
628
|
+
|
|
629
|
+
protected:
|
|
630
|
+
virtual VALUE do_exec ();
|
|
631
|
+
};
|
|
632
|
+
|
|
633
|
+
VALUE R2TAO_ORB_BlockedPerformWork::do_exec ()
|
|
634
|
+
{
|
|
635
|
+
if (this->timeout_ != 0)
|
|
636
|
+
this->orb_->perform_work (*this->timeout_);
|
|
637
|
+
else
|
|
638
|
+
this->orb_->perform_work ();
|
|
639
|
+
return Qnil;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
class R2TAO_ORB_BlockedShutdown : public R2TAO_ORB_BlockedRegionCaller
|
|
643
|
+
{
|
|
644
|
+
public:
|
|
645
|
+
R2TAO_ORB_BlockedShutdown (CORBA::ORB_ptr orb, bool wait=false)
|
|
646
|
+
: R2TAO_ORB_BlockedRegionCaller (orb),
|
|
647
|
+
wait_ (wait) {}
|
|
648
|
+
virtual ~R2TAO_ORB_BlockedShutdown () {}
|
|
649
|
+
|
|
650
|
+
protected:
|
|
651
|
+
virtual VALUE do_exec ();
|
|
652
|
+
|
|
653
|
+
private:
|
|
654
|
+
bool wait_;
|
|
655
|
+
};
|
|
656
|
+
|
|
657
|
+
VALUE R2TAO_ORB_BlockedShutdown::do_exec ()
|
|
658
|
+
{
|
|
659
|
+
this->orb_->shutdown (this->wait_);
|
|
660
|
+
return Qnil;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
static
|
|
664
|
+
VALUE rCORBA_ORB_run(int _argc, VALUE *_argv, VALUE self)
|
|
665
|
+
{
|
|
666
|
+
CORBA::ORB_ptr orb;
|
|
667
|
+
VALUE rtimeout = Qnil;
|
|
668
|
+
ACE_Time_Value timeout;
|
|
669
|
+
double tmleft=0.0;
|
|
670
|
+
|
|
671
|
+
rb_scan_args(_argc, _argv, "01", &rtimeout);
|
|
672
|
+
if (!NIL_P (rtimeout))
|
|
673
|
+
{
|
|
674
|
+
if (rb_type (rtimeout) == T_FLOAT)
|
|
675
|
+
{
|
|
676
|
+
timeout.set (RFLOAT_VALUE (rtimeout));
|
|
677
|
+
}
|
|
678
|
+
else
|
|
679
|
+
{
|
|
680
|
+
unsigned long sec = NUM2ULONG (rtimeout);
|
|
681
|
+
timeout.set (static_cast<time_t> (sec));
|
|
682
|
+
}
|
|
683
|
+
// convert to ACE_Time_Value
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
orb = r2tao_ORB_r2t (self);
|
|
687
|
+
|
|
688
|
+
R2TAO_TRY
|
|
689
|
+
{
|
|
690
|
+
R2CSigGuard sg(orb);
|
|
691
|
+
|
|
692
|
+
if (NIL_P (rtimeout))
|
|
693
|
+
{
|
|
694
|
+
R2TAO_ORB_BlockedRun blocked_exec (orb);
|
|
695
|
+
|
|
696
|
+
blocked_exec.call ();
|
|
697
|
+
}
|
|
698
|
+
else
|
|
699
|
+
{
|
|
700
|
+
R2TAO_ORB_BlockedRun blocked_exec (orb, timeout);
|
|
701
|
+
|
|
702
|
+
blocked_exec.call ();
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
R2TAO_CATCH;
|
|
706
|
+
if (!NIL_P (rtimeout))
|
|
707
|
+
{
|
|
708
|
+
tmleft = (double)timeout.usec ();
|
|
709
|
+
tmleft /= 1000000;
|
|
710
|
+
tmleft += timeout.sec ();
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
return NIL_P (rtimeout) ? Qnil : rb_float_new (tmleft);
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
static
|
|
717
|
+
VALUE rCORBA_ORB_work_pending(int _argc, VALUE *_argv, VALUE self)
|
|
718
|
+
{
|
|
719
|
+
CORBA::ORB_ptr orb;
|
|
720
|
+
VALUE rtimeout = Qnil;
|
|
721
|
+
ACE_Time_Value timeout;
|
|
722
|
+
double tmleft=0.0;
|
|
723
|
+
|
|
724
|
+
rb_scan_args(_argc, _argv, "01", &rtimeout);
|
|
725
|
+
if (!NIL_P (rtimeout))
|
|
726
|
+
{
|
|
727
|
+
if (rb_type (rtimeout) == T_FLOAT)
|
|
728
|
+
{
|
|
729
|
+
timeout.set (RFLOAT_VALUE (rtimeout));
|
|
730
|
+
}
|
|
731
|
+
else
|
|
732
|
+
{
|
|
733
|
+
unsigned long sec = NUM2ULONG (rtimeout);
|
|
734
|
+
timeout.set (static_cast<time_t> (sec));
|
|
735
|
+
}
|
|
736
|
+
// convert to ACE_Time_Value
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
orb = r2tao_ORB_r2t (self);
|
|
740
|
+
|
|
741
|
+
VALUE _rc = Qfalse;
|
|
742
|
+
|
|
743
|
+
R2TAO_TRY
|
|
744
|
+
{
|
|
745
|
+
R2CSigGuard sg(orb, false);
|
|
746
|
+
|
|
747
|
+
if (NIL_P (rtimeout))
|
|
748
|
+
{
|
|
749
|
+
R2TAO_ORB_BlockedWorkPending blocked_exec (sg, orb);
|
|
750
|
+
|
|
751
|
+
_rc = blocked_exec.call ();
|
|
752
|
+
}
|
|
753
|
+
else
|
|
754
|
+
{
|
|
755
|
+
R2TAO_ORB_BlockedWorkPending blocked_exec (sg, orb, timeout);
|
|
756
|
+
|
|
757
|
+
_rc = blocked_exec.call ();
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
R2TAO_CATCH;
|
|
761
|
+
|
|
762
|
+
if (NIL_P (rtimeout))
|
|
763
|
+
{
|
|
764
|
+
return _rc;
|
|
765
|
+
}
|
|
766
|
+
else
|
|
767
|
+
{
|
|
768
|
+
VALUE rcarr = rb_ary_new2 (2);
|
|
769
|
+
rb_ary_push (rcarr, _rc);
|
|
770
|
+
tmleft = (double)timeout.usec ();
|
|
771
|
+
tmleft /= 1000000;
|
|
772
|
+
tmleft += timeout.sec ();
|
|
773
|
+
rb_ary_push (rcarr, rb_float_new (tmleft));
|
|
774
|
+
return rcarr;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
static
|
|
779
|
+
VALUE rCORBA_ORB_perform_work(int _argc, VALUE *_argv, VALUE self)
|
|
780
|
+
{
|
|
781
|
+
CORBA::ORB_ptr orb;
|
|
782
|
+
VALUE rtimeout = Qnil;
|
|
783
|
+
ACE_Time_Value timeout;
|
|
784
|
+
double tmleft=0.0;
|
|
785
|
+
|
|
786
|
+
rb_scan_args(_argc, _argv, "01", &rtimeout);
|
|
787
|
+
if (!NIL_P (rtimeout))
|
|
788
|
+
{
|
|
789
|
+
if (rb_type (rtimeout) == T_FLOAT)
|
|
790
|
+
{
|
|
791
|
+
timeout.set (RFLOAT_VALUE (rtimeout));
|
|
792
|
+
}
|
|
793
|
+
else
|
|
794
|
+
{
|
|
795
|
+
unsigned long sec = NUM2ULONG (rtimeout);
|
|
796
|
+
timeout.set (static_cast<time_t> (sec));
|
|
797
|
+
}
|
|
798
|
+
// convert to ACE_Time_Value
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
orb = r2tao_ORB_r2t (self);
|
|
802
|
+
|
|
803
|
+
R2TAO_TRY
|
|
804
|
+
{
|
|
805
|
+
R2CSigGuard sg(orb);
|
|
806
|
+
|
|
807
|
+
if (NIL_P (rtimeout))
|
|
808
|
+
{
|
|
809
|
+
R2TAO_ORB_BlockedPerformWork blocked_exec (orb);
|
|
810
|
+
|
|
811
|
+
blocked_exec.call ();
|
|
812
|
+
}
|
|
813
|
+
else
|
|
814
|
+
{
|
|
815
|
+
R2TAO_ORB_BlockedPerformWork blocked_exec (orb, timeout);
|
|
816
|
+
|
|
817
|
+
blocked_exec.call ();
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
R2TAO_CATCH;
|
|
821
|
+
if (!NIL_P (rtimeout))
|
|
822
|
+
{
|
|
823
|
+
tmleft = (double)timeout.usec ();
|
|
824
|
+
tmleft /= 1000000;
|
|
825
|
+
tmleft += timeout.sec ();
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
return NIL_P (rtimeout) ? Qnil : rb_float_new (tmleft);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
static
|
|
832
|
+
VALUE rCORBA_ORB_shutdown(int _argc, VALUE *_argv, VALUE self)
|
|
833
|
+
{
|
|
834
|
+
CORBA::ORB_ptr orb;
|
|
835
|
+
VALUE rwait;
|
|
836
|
+
bool wait = false;
|
|
837
|
+
|
|
838
|
+
rb_scan_args(_argc, _argv, "01", &rwait);
|
|
839
|
+
if (rwait == Qtrue)
|
|
840
|
+
wait = true;
|
|
841
|
+
|
|
842
|
+
orb = r2tao_ORB_r2t (self);
|
|
843
|
+
|
|
844
|
+
R2TAO_TRY
|
|
845
|
+
{
|
|
846
|
+
R2CSigGuard sg(orb);
|
|
847
|
+
|
|
848
|
+
{
|
|
849
|
+
R2TAO_ORB_BlockedShutdown blocked_exec (orb, wait);
|
|
850
|
+
|
|
851
|
+
blocked_exec.call (false);
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
R2TAO_CATCH;
|
|
855
|
+
|
|
856
|
+
return Qnil;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
static
|
|
860
|
+
VALUE rCORBA_ORB_destroy(VALUE self)
|
|
861
|
+
{
|
|
862
|
+
CORBA::ORB_ptr orb;
|
|
863
|
+
orb = r2tao_ORB_r2t (self);
|
|
864
|
+
R2TAO_TRY
|
|
865
|
+
{
|
|
866
|
+
orb->destroy ();
|
|
867
|
+
}
|
|
868
|
+
R2TAO_CATCH;
|
|
869
|
+
|
|
870
|
+
return Qnil;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
static
|
|
874
|
+
VALUE rCORBA_ORB_register_value_factory(VALUE /*self*/, VALUE id, VALUE rfact)
|
|
875
|
+
{
|
|
876
|
+
return r2tao_VFB_register_value_factory(Qnil, id, rfact);
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
static
|
|
880
|
+
VALUE rCORBA_ORB_unregister_value_factory(VALUE /*self*/, VALUE id)
|
|
881
|
+
{
|
|
882
|
+
return r2tao_VFB_unregister_value_factory(Qnil, id);;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
static
|
|
886
|
+
VALUE rCORBA_ORB_lookup_value_factory(VALUE /*self*/, VALUE id)
|
|
887
|
+
{
|
|
888
|
+
return r2tao_VFB_lookup_value_factory(Qnil, id);
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
//-------------------------------------------------------------------
|
|
892
|
+
// Signal handling class/methods
|
|
893
|
+
//
|
|
894
|
+
//===================================================================
|
|
895
|
+
|
|
896
|
+
VALUE R2CSigGuard::c_signums = Qnil;
|
|
897
|
+
int R2CSigGuard::c_nsig = 0;
|
|
898
|
+
ACE_Auto_Ptr<ACE_SIGACTION> R2CSigGuard::c_sa;
|
|
899
|
+
|
|
900
|
+
void R2CSigGuard::init_ ()
|
|
901
|
+
{
|
|
902
|
+
if (NIL_P(R2CSigGuard::c_signums))
|
|
903
|
+
{
|
|
904
|
+
R2CSigGuard::c_signums = rb_funcall (r2tao_nsCORBA, rb_intern("signal_numbers"), 0);
|
|
905
|
+
// prevent GC as long as app lives
|
|
906
|
+
rb_gc_register_address (&R2CSigGuard::c_signums);
|
|
907
|
+
|
|
908
|
+
// signum count
|
|
909
|
+
R2CSigGuard::c_nsig = RARRAY_LEN (R2CSigGuard::c_signums);
|
|
910
|
+
// backup storage space
|
|
911
|
+
R2CSigGuard::c_sa.reset (new ACE_SIGACTION[R2CSigGuard::c_nsig]);
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
R2CSigGuard::R2CSigGuard(CORBA::ORB_ptr orb, bool signal_reactor)
|
|
916
|
+
: m_orb (CORBA::ORB::_duplicate (orb)),
|
|
917
|
+
m_signal_reactor (signal_reactor),
|
|
918
|
+
m_signal_caught (false)
|
|
919
|
+
{
|
|
920
|
+
// make sure initialization is done
|
|
921
|
+
R2CSigGuard::init_ ();
|
|
922
|
+
|
|
923
|
+
// initialize sigaction to set all signals to default (recording current handlers)
|
|
924
|
+
ACE_SIGACTION sa_;
|
|
925
|
+
sa_.sa_handler = SIG_DFL;
|
|
926
|
+
ACE_OS::sigemptyset (&sa_.sa_mask);
|
|
927
|
+
sa_.sa_flags = 0;
|
|
928
|
+
|
|
929
|
+
// reset and backup all current signal handlers
|
|
930
|
+
for (int i=0; i<R2CSigGuard::c_nsig ;++i)
|
|
931
|
+
{
|
|
932
|
+
int signum = NUM2INT (rb_ary_entry (R2CSigGuard::c_signums, i));
|
|
933
|
+
ACE_SIGACTION* sa = &(R2CSigGuard::c_sa.get ()[i]);
|
|
934
|
+
ACE_OS::sigaction (signum, &sa_, sa);
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
// get array with signal numbers to handle (not DEFAULT)
|
|
938
|
+
VALUE signum_arr = rb_funcall (r2tao_nsCORBA, rb_intern("handled_signals"), 0);
|
|
939
|
+
// signum count
|
|
940
|
+
int nsig = RARRAY_LEN (signum_arr);
|
|
941
|
+
// set signal handler for handled signals
|
|
942
|
+
bool fINT = false;
|
|
943
|
+
for (int i=0; i<nsig ;++i)
|
|
944
|
+
{
|
|
945
|
+
int signum = NUM2INT (rb_ary_entry (signum_arr, i));
|
|
946
|
+
fINT = fINT || (signum == SIGINT);
|
|
947
|
+
m_sig_handler.register_handler (signum, this);
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
#if defined (WIN32)
|
|
951
|
+
m_prev_guard = c_sig_guard;
|
|
952
|
+
c_sig_guard = fINT ? this : 0;
|
|
953
|
+
#endif
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
R2CSigGuard::~R2CSigGuard()
|
|
957
|
+
{
|
|
958
|
+
if (this->m_signal.get ()!=0 )
|
|
959
|
+
{
|
|
960
|
+
// delayed signal handling for cases like ORB#perform_work()
|
|
961
|
+
m_signal->handle_exception ();
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
#if defined (WIN32)
|
|
965
|
+
c_sig_guard = m_prev_guard;
|
|
966
|
+
#endif
|
|
967
|
+
|
|
968
|
+
// invalidate ORB
|
|
969
|
+
m_orb = CORBA::ORB::_nil ();
|
|
970
|
+
|
|
971
|
+
// restore signal handlers
|
|
972
|
+
for (int i=0; i<R2CSigGuard::c_nsig ;++i)
|
|
973
|
+
{
|
|
974
|
+
int signum = NUM2INT (rb_ary_entry (R2CSigGuard::c_signums, i));
|
|
975
|
+
ACE_SIGACTION* sa = &(R2CSigGuard::c_sa.get ()[i]);
|
|
976
|
+
ACE_OS::sigaction (signum, sa, 0);
|
|
977
|
+
}
|
|
978
|
+
// clean up
|
|
979
|
+
ACE_OS::memset (R2CSigGuard::c_sa.get (), 0, R2CSigGuard::c_nsig * sizeof(ACE_SIGACTION));
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
int R2CSigGuard::handle_signal (int signum,
|
|
983
|
+
siginfo_t *,
|
|
984
|
+
ucontext_t *)
|
|
985
|
+
{
|
|
986
|
+
this->m_signal_caught = true;
|
|
987
|
+
if (this->m_signal_reactor && !CORBA::is_nil (m_orb))
|
|
988
|
+
{
|
|
989
|
+
// do not handle signal here but reroute as notification to ORB reactor
|
|
990
|
+
m_orb->orb_core ()->reactor ()->notify (new Signal (signum));
|
|
991
|
+
}
|
|
992
|
+
else
|
|
993
|
+
{
|
|
994
|
+
m_signal.reset (new Signal (signum));
|
|
995
|
+
}
|
|
996
|
+
return 0;
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
int R2CSigGuard::Signal::handle_exception (ACE_HANDLE)
|
|
1000
|
+
{
|
|
1001
|
+
r2tao_call_thread_safe (R2CSigGuard::Signal::thread_safe_invoke, this);
|
|
1002
|
+
return 0;
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
// invocation helper for threadsafe calling of Ruby code
|
|
1006
|
+
void* R2CSigGuard::Signal::thread_safe_invoke (void * arg)
|
|
1007
|
+
{
|
|
1008
|
+
R2CSigGuard::Signal* sig = reinterpret_cast<R2CSigGuard::Signal*> (arg);
|
|
1009
|
+
|
|
1010
|
+
sig->inner_handler ();
|
|
1011
|
+
return 0;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
int R2CSigGuard::Signal::inner_handler ()
|
|
1015
|
+
{
|
|
1016
|
+
static R2TAO_RBFuncall FN_handle_signal ("handle_signal", false);
|
|
1017
|
+
|
|
1018
|
+
VALUE rargs = rb_ary_new2 (1);
|
|
1019
|
+
rb_ary_push (rargs, INT2NUM(m_signum));
|
|
1020
|
+
FN_handle_signal.invoke (r2tao_nsCORBA, rargs);
|
|
1021
|
+
if (FN_handle_signal.has_caught_exception ())
|
|
1022
|
+
{
|
|
1023
|
+
rb_eval_string ("STDERR.puts $!.to_s+\"\\n\"+$!.backtrace.join(\"\\n\")");
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
return 0;
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
// end of orb.cpp
|