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.
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