r2corba 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (254) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +159 -0
  3. data/LICENSE +59 -0
  4. data/README +62 -0
  5. data/THANKS +52 -0
  6. data/bin/r2corba +8 -0
  7. data/bin/ridlc +11 -0
  8. data/bin/rins +7 -0
  9. data/ext/ext.mwc +6 -0
  10. data/ext/extload/extload.c +60 -0
  11. data/ext/libr2tao/any.cpp +1543 -0
  12. data/ext/libr2tao/exception.cpp +202 -0
  13. data/ext/libr2tao/exception.h +104 -0
  14. data/ext/libr2tao/longdouble.cpp +173 -0
  15. data/ext/libr2tao/longdouble.h +31 -0
  16. data/ext/libr2tao/object.cpp +1150 -0
  17. data/ext/libr2tao/object.h +38 -0
  18. data/ext/libr2tao/orb.cpp +1029 -0
  19. data/ext/libr2tao/orb.h +36 -0
  20. data/ext/libr2tao/r2tao_export.h +45 -0
  21. data/ext/libr2tao/r2tao_ext.h +38 -0
  22. data/ext/libr2tao/required.cpp +463 -0
  23. data/ext/libr2tao/required.h +187 -0
  24. data/ext/libr2tao/typecode.cpp +888 -0
  25. data/ext/libr2tao/typecode.h +45 -0
  26. data/ext/libr2tao/values.cpp +2938 -0
  27. data/ext/libr2tao/values.h +396 -0
  28. data/ext/librpoa/iortable.cpp +250 -0
  29. data/ext/librpoa/poa.cpp +1076 -0
  30. data/ext/librpoa/poa.h +24 -0
  31. data/ext/librpoa/rpoa_export.h +44 -0
  32. data/ext/librpoa/servant.cpp +1338 -0
  33. data/ext/librpoa/servant.h +116 -0
  34. data/ext/librpoa/srvreq_fix.cpp +283 -0
  35. data/ext/librpoa/srvreq_fix.h +149 -0
  36. data/ext/librpol/policies.cpp +763 -0
  37. data/ext/librpol/policies.h +15 -0
  38. data/ext/librpol/rpol_export.h +44 -0
  39. data/lib/corba/cbase/IORMap.rb +33 -0
  40. data/lib/corba/cbase/ORB.rb +231 -0
  41. data/lib/corba/cbase/Request.rb +134 -0
  42. data/lib/corba/cbase/Streams.rb +129 -0
  43. data/lib/corba/cbase/Stub.rb +19 -0
  44. data/lib/corba/cbase/Typecode.rb +441 -0
  45. data/lib/corba/cbase/Values.rb +129 -0
  46. data/lib/corba/cbase/exception.rb +66 -0
  47. data/lib/corba/cbase/poa.rb +23 -0
  48. data/lib/corba/cbase/policies.rb +78 -0
  49. data/lib/corba/cbase/post_require.rb +14 -0
  50. data/lib/corba/cbase/require.rb +28 -0
  51. data/lib/corba/cmds/base.rb +85 -0
  52. data/lib/corba/cmds/test.rb +30 -0
  53. data/lib/corba/common/Any.rb +91 -0
  54. data/lib/corba/common/IDL.rb +104 -0
  55. data/lib/corba/common/ORB.rb +368 -0
  56. data/lib/corba/common/Object.rb +208 -0
  57. data/lib/corba/common/Request.rb +20 -0
  58. data/lib/corba/common/Servant.rb +108 -0
  59. data/lib/corba/common/Struct.rb +22 -0
  60. data/lib/corba/common/Stub.rb +79 -0
  61. data/lib/corba/common/Typecode.rb +1121 -0
  62. data/lib/corba/common/Union.rb +56 -0
  63. data/lib/corba/common/Values.rb +92 -0
  64. data/lib/corba/common/const.rb +22 -0
  65. data/lib/corba/common/exception.rb +68 -0
  66. data/lib/corba/common/require.rb +27 -0
  67. data/lib/corba/common/version.rb +22 -0
  68. data/lib/corba/idl/IDL.rb +21 -0
  69. data/lib/corba/idl/IORTable.pidl +62 -0
  70. data/lib/corba/idl/TAO_Ext.pidl +46 -0
  71. data/lib/corba/idl/require.rb +20 -0
  72. data/lib/corba/jbase/Any.rb +273 -0
  73. data/lib/corba/jbase/IORMap.rb +36 -0
  74. data/lib/corba/jbase/ORB.rb +99 -0
  75. data/lib/corba/jbase/Object.rb +98 -0
  76. data/lib/corba/jbase/Request.rb +226 -0
  77. data/lib/corba/jbase/Servant.rb +247 -0
  78. data/lib/corba/jbase/ServerRequest.rb +128 -0
  79. data/lib/corba/jbase/Streams.rb +671 -0
  80. data/lib/corba/jbase/Stub.rb +38 -0
  81. data/lib/corba/jbase/Typecode.rb +520 -0
  82. data/lib/corba/jbase/Values.rb +173 -0
  83. data/lib/corba/jbase/exception.rb +106 -0
  84. data/lib/corba/jbase/poa.rb +229 -0
  85. data/lib/corba/jbase/policies.rb +300 -0
  86. data/lib/corba/jbase/post_require.rb +14 -0
  87. data/lib/corba/jbase/require.rb +86 -0
  88. data/lib/corba/naming.rb +14 -0
  89. data/lib/corba/naming_service.rb +15 -0
  90. data/lib/corba/poa.rb +15 -0
  91. data/lib/corba/policies.rb +18 -0
  92. data/lib/corba/require.rb +17 -0
  93. data/lib/corba/svcs/ins/cos_naming.rb +426 -0
  94. data/lib/corba/svcs/ins/ins.rb +526 -0
  95. data/lib/corba/svcs/ins/naming_service.rb +119 -0
  96. data/lib/corba.rb +16 -0
  97. data/lib/ridlbe/ruby/config.rb +336 -0
  98. data/lib/ridlbe/ruby/require.rb +16 -0
  99. data/lib/ridlbe/ruby/walker.rb +1582 -0
  100. data/mkrf_conf_srcgem.rb +186 -0
  101. data/rakelib/bin.rake +80 -0
  102. data/rakelib/bin.rb +146 -0
  103. data/rakelib/build.rake +87 -0
  104. data/rakelib/config.rake +52 -0
  105. data/rakelib/config.rb +450 -0
  106. data/rakelib/ext.rake +242 -0
  107. data/rakelib/ext.rb +308 -0
  108. data/rakelib/ext_r2tao.rb +232 -0
  109. data/rakelib/gem.rake +212 -0
  110. data/rakelib/gem.rb +146 -0
  111. data/rakelib/package.rake +26 -0
  112. data/rakelib/test.rake +23 -0
  113. data/test/BiDirectional/Test.idl +34 -0
  114. data/test/BiDirectional/client.rb +132 -0
  115. data/test/BiDirectional/run_test.rb +68 -0
  116. data/test/BiDirectional/server.rb +169 -0
  117. data/test/CORBA_Services/Naming/BindingIterator/Test.idl +27 -0
  118. data/test/CORBA_Services/Naming/BindingIterator/client.rb +121 -0
  119. data/test/CORBA_Services/Naming/BindingIterator/run_test.rb +82 -0
  120. data/test/CORBA_Services/Naming/BindingIterator/server.rb +109 -0
  121. data/test/CORBA_Services/Naming/Corbaname/Test.idl +27 -0
  122. data/test/CORBA_Services/Naming/Corbaname/client.rb +85 -0
  123. data/test/CORBA_Services/Naming/Corbaname/run_test.rb +88 -0
  124. data/test/CORBA_Services/Naming/Corbaname/server.rb +135 -0
  125. data/test/CORBA_Services/Naming/Simple/Test.idl +27 -0
  126. data/test/CORBA_Services/Naming/Simple/client.rb +84 -0
  127. data/test/CORBA_Services/Naming/Simple/run_test.rb +82 -0
  128. data/test/CORBA_Services/Naming/Simple/server.rb +109 -0
  129. data/test/Collocation/Diamond.idl +39 -0
  130. data/test/Collocation/run_test.rb +52 -0
  131. data/test/Collocation/test.rb +195 -0
  132. data/test/Connect_Timeout/Test.idl +27 -0
  133. data/test/Connect_Timeout/client.rb +111 -0
  134. data/test/Connect_Timeout/run_test.rb +52 -0
  135. data/test/DII/Test.idl +27 -0
  136. data/test/DII/client.rb +115 -0
  137. data/test/DII/run_test.rb +69 -0
  138. data/test/DII/server.rb +95 -0
  139. data/test/DSI/Test.idl +27 -0
  140. data/test/DSI/client.rb +66 -0
  141. data/test/DSI/run_test.rb +69 -0
  142. data/test/DSI/server.rb +106 -0
  143. data/test/Exceptions/Test.idl +48 -0
  144. data/test/Exceptions/client.rb +118 -0
  145. data/test/Exceptions/run_test.rb +69 -0
  146. data/test/Exceptions/server.rb +131 -0
  147. data/test/Hello/Test.idl +27 -0
  148. data/test/Hello/client.rb +78 -0
  149. data/test/Hello/run_test.rb +71 -0
  150. data/test/Hello/server.rb +95 -0
  151. data/test/IDL_Test/Test.idl +113 -0
  152. data/test/IDL_Test/Test_inc.idl +17 -0
  153. data/test/IDL_Test/client.rb +102 -0
  154. data/test/IDL_Test/run_test.rb +69 -0
  155. data/test/IDL_Test/server.rb +99 -0
  156. data/test/IORMap/Test.idl +27 -0
  157. data/test/IORMap/client.rb +73 -0
  158. data/test/IORMap/run_test.rb +69 -0
  159. data/test/IORMap/server.rb +114 -0
  160. data/test/IORTable/Test.idl +27 -0
  161. data/test/IORTable/client.rb +75 -0
  162. data/test/IORTable/run_test.rb +69 -0
  163. data/test/IORTable/server.rb +130 -0
  164. data/test/Implicit_Conversion/Test.idl +31 -0
  165. data/test/Implicit_Conversion/client.rb +110 -0
  166. data/test/Implicit_Conversion/run_test.rb +69 -0
  167. data/test/Implicit_Conversion/server.rb +99 -0
  168. data/test/Multi_Threading/Multiple_ORB/Test.idl +27 -0
  169. data/test/Multi_Threading/Multiple_ORB/client.rb +82 -0
  170. data/test/Multi_Threading/Multiple_ORB/run_test.rb +71 -0
  171. data/test/Multi_Threading/Multiple_ORB/server.rb +108 -0
  172. data/test/Multi_Threading/Simple/Test.idl +27 -0
  173. data/test/Multi_Threading/Simple/client.rb +88 -0
  174. data/test/Multi_Threading/Simple/run_test.rb +69 -0
  175. data/test/Multi_Threading/Simple/server.rb +118 -0
  176. data/test/Multi_Threading/Threads/Test.idl +31 -0
  177. data/test/Multi_Threading/Threads/client.rb +80 -0
  178. data/test/Multi_Threading/Threads/run_test.rb +76 -0
  179. data/test/Multi_Threading/Threads/server.rb +119 -0
  180. data/test/Multi_Threading/Threads/watchdog.rb +87 -0
  181. data/test/Multiple_Servant_Interfaces/Test.idl +34 -0
  182. data/test/Multiple_Servant_Interfaces/client.rb +70 -0
  183. data/test/Multiple_Servant_Interfaces/run_test.rb +69 -0
  184. data/test/Multiple_Servant_Interfaces/server.rb +102 -0
  185. data/test/Nil/Test.idl +27 -0
  186. data/test/Nil/run_test.rb +52 -0
  187. data/test/Nil/test.rb +78 -0
  188. data/test/OBV/AbstractInterface/client.rb +179 -0
  189. data/test/OBV/AbstractInterface/run_test.rb +69 -0
  190. data/test/OBV/AbstractInterface/server.rb +149 -0
  191. data/test/OBV/AbstractInterface/test.idl +53 -0
  192. data/test/OBV/Custom/OBV.idl +18 -0
  193. data/test/OBV/Custom/OBV_impl.rb +40 -0
  194. data/test/OBV/Custom/client.rb +86 -0
  195. data/test/OBV/Custom/run_test.rb +69 -0
  196. data/test/OBV/Custom/server.rb +100 -0
  197. data/test/OBV/Simple/OBV.idl +15 -0
  198. data/test/OBV/Simple/OBV_impl.rb +26 -0
  199. data/test/OBV/Simple/client.rb +86 -0
  200. data/test/OBV/Simple/run_test.rb +69 -0
  201. data/test/OBV/Simple/server.rb +100 -0
  202. data/test/OBV/Simple_Event/Event.idl +15 -0
  203. data/test/OBV/Simple_Event/Event_impl.rb +26 -0
  204. data/test/OBV/Simple_Event/client.rb +86 -0
  205. data/test/OBV/Simple_Event/run_test.rb +69 -0
  206. data/test/OBV/Simple_Event/server.rb +100 -0
  207. data/test/OBV/Supports/client.rb +116 -0
  208. data/test/OBV/Supports/run_test.rb +69 -0
  209. data/test/OBV/Supports/server.rb +103 -0
  210. data/test/OBV/Supports/supports.idl +33 -0
  211. data/test/OBV/Supports/supports_impl.rb +57 -0
  212. data/test/OBV/Tree/client.rb +116 -0
  213. data/test/OBV/Tree/run_test.rb +69 -0
  214. data/test/OBV/Tree/server.rb +117 -0
  215. data/test/OBV/Tree/test.idl +32 -0
  216. data/test/OBV/Truncatable/Extra.idl +27 -0
  217. data/test/OBV/Truncatable/Truncatable.idl +105 -0
  218. data/test/OBV/Truncatable/Truncatable_impl.rb +86 -0
  219. data/test/OBV/Truncatable/client.rb +279 -0
  220. data/test/OBV/Truncatable/run_test.rb +69 -0
  221. data/test/OBV/Truncatable/server.rb +89 -0
  222. data/test/OBV/ValueBox/client.rb +497 -0
  223. data/test/OBV/ValueBox/run_test.rb +69 -0
  224. data/test/OBV/ValueBox/server.rb +271 -0
  225. data/test/OBV/ValueBox/valuebox.idl +101 -0
  226. data/test/OBV/ValueBox/vb_basic.idl +75 -0
  227. data/test/OBV/ValueBox/vb_struct.idl +68 -0
  228. data/test/OBV/ValueBox/vb_union.idl +21 -0
  229. data/test/Object/Test.idl +27 -0
  230. data/test/Object/client.rb +103 -0
  231. data/test/Object/run_test.rb +69 -0
  232. data/test/Object/server.rb +126 -0
  233. data/test/POA/Test.idl +27 -0
  234. data/test/POA/run_test.rb +52 -0
  235. data/test/POA/test.rb +112 -0
  236. data/test/Param_Test/Test.idl +182 -0
  237. data/test/Param_Test/client.rb +277 -0
  238. data/test/Param_Test/run_test.rb +69 -0
  239. data/test/Param_Test/server.rb +296 -0
  240. data/test/Performance/Simple/Test.idl +27 -0
  241. data/test/Performance/Simple/client.rb +90 -0
  242. data/test/Performance/Simple/run_test.rb +69 -0
  243. data/test/Performance/Simple/server.rb +95 -0
  244. data/test/Policies/Test.idl +27 -0
  245. data/test/Policies/run_test.rb +52 -0
  246. data/test/Policies/test.rb +144 -0
  247. data/test/Timeout/client.rb +207 -0
  248. data/test/Timeout/run_test.rb +69 -0
  249. data/test/Timeout/server.rb +109 -0
  250. data/test/Timeout/test.idl +19 -0
  251. data/test/lib/assert.rb +43 -0
  252. data/test/lib/test.rb +542 -0
  253. data/test/test_runner.rb +193 -0
  254. 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