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,36 @@
1
+ /*--------------------------------------------------------------------
2
+ # orb.h - 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
+ #ifndef __R2TAO_ORB_H
14
+ #define __R2TAO_ORB_H
15
+
16
+ #include "required.h"
17
+ #include "tao/ORB.h"
18
+
19
+ extern void r2tao_Init_ORB();
20
+
21
+ // Ruby CORBA::Native::ORB
22
+ extern R2TAO_EXPORT VALUE r2corba_cORB;
23
+ // Ruby CORBA::ORB
24
+ extern R2TAO_EXPORT VALUE r2tao_cORB;
25
+
26
+ // wraps TAO CORBA::ORB in Ruby CORBA::Native::ORB
27
+ extern R2TAO_EXPORT VALUE r2tao_ORB_t2r(CORBA::ORB_ptr obj);
28
+ // unwraps TAO CORBA::ORB from Ruby CORBA::Native::ORB
29
+ extern R2TAO_EXPORT CORBA::ORB_ptr r2tao_ORB_r2t(VALUE obj);
30
+
31
+ // wraps TAO CORBA::ORB as Ruby CORBA::Native::ORB in CORBA::ORB
32
+ extern R2TAO_EXPORT VALUE r2corba_ORB_t2r(CORBA::ORB_ptr obj);
33
+ // unwraps TAO CORBA::ORB from Ruby CORBA::Native::ORB in CORBA::ORB
34
+ extern R2TAO_EXPORT CORBA::ORB_ptr r2corba_ORB_r2t(VALUE obj);
35
+
36
+ #endif
@@ -0,0 +1,45 @@
1
+ // -*- C++ -*-
2
+ /*--------------------------------------------------------------------
3
+ # r2tao_ext.h - R2TAO CORBA basic support
4
+ #
5
+ # Author: Martin Corino
6
+ #
7
+ # This program is free software; you can redistribute it and/or
8
+ # modify it under the terms of the R2CORBA LICENSE which is
9
+ # included with this program.
10
+ #
11
+ # Copyright (c) Remedy IT Expertise BV
12
+ # Chamber of commerce Rotterdam nr.276339, The Netherlands
13
+ #------------------------------------------------------------------*/
14
+ #ifndef R2TAO_EXPORT_H
15
+ #define R2TAO_EXPORT_H
16
+
17
+ #include "ace/config-all.h"
18
+
19
+ #if defined (ACE_AS_STATIC_LIBS) && !defined (R2TAO_HAS_DLL)
20
+ # define R2TAO_HAS_DLL 0
21
+ #endif /* ACE_AS_STATIC_LIBS && R2TAO_HAS_DLL */
22
+
23
+ #if !defined (R2TAO_HAS_DLL)
24
+ # define R2TAO_HAS_DLL 1
25
+ #endif /* ! R2TAO_HAS_DLL */
26
+
27
+ #if defined (R2TAO_HAS_DLL) && (R2TAO_HAS_DLL == 1)
28
+ # if defined (R2TAO_BUILD_DLL)
29
+ # define R2TAO_EXPORT ACE_Proper_Export_Flag
30
+ # define R2TAO_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T)
31
+ # define R2TAO_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
32
+ # else /* R2TAO_BUILD_DLL */
33
+ # define R2TAO_EXPORT ACE_Proper_Import_Flag
34
+ # define R2TAO_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T)
35
+ # define R2TAO_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
36
+ # endif /* R2TAO_BUILD_DLL */
37
+ #else /* R2TAO_HAS_DLL == 1 */
38
+ # define R2TAO_EXPORT
39
+ # define R2TAO_SINGLETON_DECLARATION(T)
40
+ # define R2TAO_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK)
41
+ #endif /* R2TAO_HAS_DLL == 1 */
42
+
43
+ #endif /* R2TAO_EXPORT_H */
44
+
45
+ // End of auto generated file.
@@ -0,0 +1,38 @@
1
+ /*--------------------------------------------------------------------
2
+ # r2tao_ext.h - R2TAO CORBA basic 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
+ #ifndef __R2TAO_EXT_H
14
+ #define __R2TAO_EXT_H
15
+
16
+ #if defined (__cplusplus)
17
+ };
18
+ #endif
19
+
20
+ #if defined (OLD_MSC_VER)
21
+ // un-fudge the version macro here that was fudged
22
+ // in required.h otherwise ACE will complain
23
+ #undef _MSC_VER
24
+ #define _MSC_VER OLD_MSC_VER
25
+ #endif
26
+
27
+ #include <ace/pre.h>
28
+
29
+ #include <ace/config-all.h>
30
+
31
+ #include <ace/post.h>
32
+
33
+ #if defined (__cplusplus)
34
+ extern "C" {
35
+ #endif
36
+
37
+ #endif
38
+
@@ -0,0 +1,463 @@
1
+ /*--------------------------------------------------------------------
2
+ # required.h - R2TAO CORBA basic 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 "required.h"
15
+ #include "exception.h"
16
+ #include "typecode.h"
17
+ #include "ace/Env_Value_T.h"
18
+ #include "ace/Null_Mutex.h"
19
+ #include "ace/Singleton.h"
20
+ #include "ace/TSS_T.h"
21
+ #include "tao/AnyTypeCode/Any.h"
22
+ #include "tao/DynamicInterface/Unknown_User_Exception.h"
23
+ #include "tao/debug.h"
24
+
25
+ #define RUBY_INVOKE_FUNC RUBY_ALLOC_FUNC
26
+
27
+ R2TAO_EXPORT VALUE r2tao_nsCORBA = 0;
28
+ R2TAO_EXPORT VALUE r2tao_nsCORBA_Native = 0;
29
+
30
+ extern void r2tao_Init_Exception();
31
+ extern void r2tao_Init_Object();
32
+ extern void r2tao_Init_ORB();
33
+ extern void r2tao_Init_Typecode();
34
+ extern void r2tao_init_Values();
35
+
36
+ class R2TAO_ObjectRegistry
37
+ {
38
+ friend class ACE_Singleton<R2TAO_ObjectRegistry, ACE_Null_Mutex>;
39
+ private:
40
+ R2TAO_ObjectRegistry()
41
+ : registry_ (Qnil)
42
+ {
43
+ // create an anchoring object
44
+ R2TAO_ObjectRegistry::registry_anchor_ = Data_Wrap_Struct (rb_cObject, 0, R2TAO_ObjectRegistry::registry_free, this);
45
+ // prevent GC while Ruby lives
46
+ rb_gc_register_address (&R2TAO_ObjectRegistry::registry_anchor_);
47
+ // create registry Hash
48
+ this->registry_ = rb_hash_new ();
49
+ // create an instance variable to hold registry (prevents GC since anchor is registered)
50
+ rb_ivar_set (R2TAO_ObjectRegistry::registry_anchor_, rb_intern ("@registry_"), this->registry_);
51
+ R2TAO_ObjectRegistry::has_singleton_ = true;
52
+ }
53
+
54
+ static VALUE registry_anchor_;
55
+ static bool has_singleton_;
56
+
57
+ public:
58
+ ~R2TAO_ObjectRegistry()
59
+ {
60
+ // no need to unregister; as we live as long as Ruby does
61
+ // we had better let Ruby take care of cleaning up otherwise
62
+ // we may end up in a race condition
63
+ // Just mark the registry as destroyed
64
+ R2TAO_ObjectRegistry::has_singleton_ = false;
65
+ this->registry_ = Qnil;
66
+ }
67
+
68
+ void register_object (VALUE rbobj)
69
+ {
70
+ if (TAO_debug_level > 9)
71
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - R2TAO_ObjectRegistry::register_object(%@) - reg=%@\n", rbobj, this->registry_));
72
+
73
+ if (!NIL_P(this->registry_))
74
+ {
75
+ rb_hash_aset (this->registry_, rbobj, rbobj);
76
+ }
77
+ else
78
+ {
79
+ if (TAO_debug_level > 1)
80
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - R2TAO_ObjectRegistry::register_object(%@) - "
81
+ "not registring since registry is nil\n", rbobj));
82
+ }
83
+ }
84
+
85
+ void unregister_object (VALUE rbobj)
86
+ {
87
+ if (TAO_debug_level > 9)
88
+ ACE_DEBUG ((LM_INFO, "R2TAO (%P|%t) - R2TAO_ObjectRegistry::unregister_object(%@) - reg=%@\n", rbobj, this->registry_));
89
+
90
+ if (!NIL_P(this->registry_))
91
+ {
92
+ rb_hash_delete (this->registry_, rbobj);
93
+ }
94
+ }
95
+
96
+ static bool has_singleton ();
97
+
98
+ private:
99
+ VALUE registry_;
100
+
101
+ void clear_registry ()
102
+ {
103
+ this->registry_ = Qnil;
104
+ }
105
+
106
+ static void registry_free(void *ptr)
107
+ {
108
+ // what came first? is registry singleton still there?
109
+ if (R2TAO_ObjectRegistry::has_singleton ())
110
+ {
111
+ // registry anchor is being GC-ed so clean up to prevent illegal access
112
+ R2TAO_ObjectRegistry* objreg = reinterpret_cast<R2TAO_ObjectRegistry*> (ptr);
113
+ objreg->clear_registry ();
114
+ }
115
+ }
116
+
117
+ };
118
+
119
+ VALUE R2TAO_ObjectRegistry::registry_anchor_ = Qnil;
120
+ bool R2TAO_ObjectRegistry::has_singleton_ = false;
121
+
122
+ bool R2TAO_ObjectRegistry::has_singleton ()
123
+ {
124
+ return R2TAO_ObjectRegistry::has_singleton_;
125
+ }
126
+
127
+ typedef ACE_Singleton<R2TAO_ObjectRegistry, ACE_Null_Mutex> R2TAO_OBJECTREGISTRY;
128
+
129
+ #if defined(WIN32) && defined(_DEBUG)
130
+ extern "C" R2TAO_EXPORT void Init_libr2taod()
131
+ #else
132
+ extern "C" R2TAO_EXPORT void Init_libr2tao()
133
+ #endif
134
+ {
135
+ rb_eval_string("puts 'Init_libr2tao start' if $VERBOSE");
136
+
137
+ if (r2tao_nsCORBA) return;
138
+
139
+ // TAO itself only does this when an ORB is initialized; we want it sooner
140
+ if (TAO_debug_level <= 0)
141
+ TAO_debug_level = ACE_Env_Value<u_int> ("TAO_ORB_DEBUG", 0);
142
+
143
+ rb_eval_string("puts 'Init_libr2tao 2' if $VERBOSE");
144
+
145
+ VALUE klass = rb_define_module_under (rb_eval_string ("::R2CORBA"), "TAO");
146
+ rb_define_const (klass, "MAJOR_VERSION", INT2NUM (TAO_MAJOR_VERSION));
147
+ rb_define_const (klass, "MINOR_VERSION", INT2NUM (TAO_MINOR_VERSION));
148
+ rb_define_const (klass, "BETA_VERSION", INT2NUM (TAO_BETA_VERSION));
149
+ rb_define_const (klass, "VERSION", rb_str_new2 (TAO_VERSION));
150
+ rb_define_const (klass, "RUBY_THREAD_SUPPORT",
151
+ #ifdef R2TAO_THREAD_SAFE
152
+ Qtrue
153
+ #else
154
+ Qfalse
155
+ #endif
156
+ );
157
+
158
+ r2tao_nsCORBA = rb_eval_string("::R2CORBA::CORBA");
159
+
160
+ r2tao_nsCORBA_Native = rb_define_module_under (r2tao_nsCORBA, "Native");
161
+
162
+ rb_eval_string("puts 'Init_libr2tao r2tao_Init_Exception' if $VERBOSE");
163
+
164
+ r2tao_Init_Exception();
165
+
166
+ rb_eval_string("puts 'Init_libr2tao r2tao_Init_Object' if $VERBOSE");
167
+
168
+ r2tao_Init_Object();
169
+
170
+ rb_eval_string("puts 'Init_libr2tao r2tao_Init_ORB' if $VERBOSE");
171
+
172
+ r2tao_Init_ORB();
173
+
174
+ rb_eval_string("puts 'Init_libr2tao r2tao_Init_Typecode' if $VERBOSE");
175
+
176
+ r2tao_Init_Typecode();
177
+
178
+ rb_eval_string("puts 'Init_libr2tao r2tao_Init_Values' if $VERBOSE");
179
+
180
+ r2tao_init_Values();
181
+ }
182
+
183
+ R2TAO_EXPORT void r2tao_check_type(VALUE x, VALUE t)
184
+ {
185
+ if (rb_obj_is_kind_of(x, t) != Qtrue)
186
+ {
187
+ VALUE rb_dump = rb_funcall (x, rb_intern ("inspect"), 0);
188
+ rb_raise(r2tao_cBAD_PARAM, "wrong argument type %s (expected %s)\n",
189
+ RSTRING_PTR(rb_dump), rb_class2name(t));
190
+ }
191
+ }
192
+
193
+ R2TAO_EXPORT void r2tao_register_object(VALUE rbobj)
194
+ {
195
+ R2TAO_OBJECTREGISTRY::instance ()->register_object (rbobj);
196
+ }
197
+
198
+ R2TAO_EXPORT void r2tao_unregister_object(VALUE rbobj)
199
+ {
200
+ if (R2TAO_ObjectRegistry::has_singleton ())
201
+ {
202
+ R2TAO_OBJECTREGISTRY::instance ()->unregister_object (rbobj);
203
+ }
204
+ }
205
+
206
+ #if defined (R2TAO_THREAD_SAFE)
207
+
208
+ class R2TAO_GVLGuard
209
+ {
210
+ public:
211
+ R2TAO_GVLGuard (bool lock=true) : lock_(lock) { TSSManager::set_indicator (this->lock_); }
212
+ ~R2TAO_GVLGuard () { TSSManager::set_indicator (!this->lock_); }
213
+
214
+ static bool gvl_locked (bool start_locked=false)
215
+ {
216
+ if (start_locked && !TSSManager::has_indicator ())
217
+ {
218
+ TSSManager::set_indicator (start_locked);
219
+ }
220
+ return TSSManager::indicator ();
221
+ }
222
+ private:
223
+ bool lock_;
224
+
225
+ class TSSManager
226
+ {
227
+ public:
228
+ TSSManager ()
229
+ {
230
+ gvl_indicator_ = new ACE_TSS< ACE_TSS_Type_Adapter<u_int> > ();
231
+ }
232
+ ~TSSManager ()
233
+ {
234
+ delete gvl_indicator_;
235
+ gvl_indicator_ = 0;
236
+ }
237
+
238
+ static void set_indicator (bool val)
239
+ {
240
+ if (gvl_indicator_)
241
+ (*gvl_indicator_)->operator u_int & () = (val ? 1 : 0);
242
+ }
243
+
244
+ static bool has_indicator ()
245
+ {
246
+ return (gvl_indicator_ && (*gvl_indicator_).ts_object ());
247
+ }
248
+
249
+ static bool indicator ()
250
+ {
251
+ // if the TSS storage has alredy been destroyed we're in the exit procedure and the
252
+ // GVL is always locked
253
+ return (gvl_indicator_ == 0 || (*gvl_indicator_)->operator u_int () == 1);
254
+ }
255
+
256
+ private:
257
+ static ACE_TSS< ACE_TSS_Type_Adapter<u_int> >* gvl_indicator_;
258
+ };
259
+
260
+ static TSSManager tss_gvl_flag_;
261
+ };
262
+
263
+ ACE_TSS< ACE_TSS_Type_Adapter<u_int> >* R2TAO_GVLGuard::TSSManager::gvl_indicator_;
264
+ R2TAO_GVLGuard::TSSManager R2TAO_GVLGuard::tss_gvl_flag_;
265
+
266
+ template <typename FTYPE>
267
+ struct r2tao_gvl_call_arg
268
+ {
269
+ r2tao_gvl_call_arg (FTYPE func, void* data)
270
+ : func_ (func), data_ (data) {}
271
+ FTYPE func_;
272
+ void* data_;
273
+ };
274
+
275
+ void* r2tao_call_with_gvl (void *data)
276
+ {
277
+ R2TAO_GVLGuard gvl_guard_;
278
+ r2tao_gvl_call_arg<void*(*)(void*)>& arg = *reinterpret_cast<r2tao_gvl_call_arg<void*(*)(void*)>*> (data);
279
+ return (*arg.func_) (arg.data_);
280
+ }
281
+
282
+ # if RUBY_VER_MAJOR < 2
283
+ VALUE r2tao_call_without_gvl (void *data)
284
+ {
285
+ R2TAO_GVLGuard gvl_guard_ (false);
286
+ r2tao_gvl_call_arg<VALUE(*)(void*)>& arg = *reinterpret_cast<r2tao_gvl_call_arg<VALUE(*)(void*)>*> (data);
287
+ return (*arg.func_) (arg.data_);
288
+ }
289
+ # else
290
+ void* r2tao_call_without_gvl (void *data)
291
+ {
292
+ R2TAO_GVLGuard gvl_guard_ (false);
293
+ r2tao_gvl_call_arg<void*(*)(void*)>& arg = *reinterpret_cast<r2tao_gvl_call_arg<void*(*)(void*)>*> (data);
294
+ return (*arg.func_) (arg.data_);
295
+ }
296
+ # endif
297
+ #endif
298
+
299
+ R2TAO_EXPORT void* r2tao_call_thread_safe (void *(*func)(void *), void *data)
300
+ {
301
+ #if defined (R2TAO_THREAD_SAFE)
302
+ if (!R2TAO_GVLGuard::gvl_locked ())
303
+ {
304
+ r2tao_gvl_call_arg<void*(*)(void*)> arg(func, data);
305
+ return rb_thread_call_with_gvl(r2tao_call_with_gvl, &arg);
306
+ }
307
+ #endif
308
+ return (*func) (data);
309
+ }
310
+
311
+ R2TAO_EXPORT VALUE r2tao_blocking_call (VALUE (*func)(void*), void*data)
312
+ {
313
+ #if defined (R2TAO_THREAD_SAFE)
314
+ if (R2TAO_GVLGuard::gvl_locked (true))
315
+ {
316
+ r2tao_gvl_call_arg<VALUE(*)(void*)> arg(func, data);
317
+ # if RUBY_VER_MAJOR < 2
318
+ return rb_thread_call_without_gvl(r2tao_call_without_gvl, &arg, RUBY_UBF_IO, 0);
319
+ # else
320
+ void *rc = rb_thread_call_without_gvl(r2tao_call_without_gvl, &arg, RUBY_UBF_IO, 0);
321
+ return reinterpret_cast<VALUE> (rc);
322
+ # endif
323
+ }
324
+ #endif
325
+ return (*func) (data);
326
+ }
327
+
328
+ R2TAO_EXPORT VALUE r2tao_blocking_call_ex (VALUE (*func)(void*), void*data,
329
+ void (*unblock_func)(void*), void*unblock_data)
330
+ {
331
+ #if defined (R2TAO_THREAD_SAFE)
332
+ if (R2TAO_GVLGuard::gvl_locked (true))
333
+ {
334
+ r2tao_gvl_call_arg<VALUE(*)(void*)> arg(func, data);
335
+ # if RUBY_VER_MAJOR < 2
336
+ return rb_thread_call_without_gvl(r2tao_call_without_gvl, &arg,
337
+ unblock_func, unblock_data);
338
+ # else
339
+ void *rc = rb_thread_call_without_gvl(r2tao_call_without_gvl, &arg,
340
+ unblock_func, unblock_data);
341
+ return reinterpret_cast<VALUE> (rc);
342
+ # endif
343
+ }
344
+ #else
345
+ ACE_UNUSED_ARG(unblock_func);
346
+ ACE_UNUSED_ARG(unblock_data);
347
+ #endif
348
+ return (*func) (data);
349
+ }
350
+
351
+ R2TAO_RBFuncall::R2TAO_RBFuncall (ID fnid, bool throw_on_ex)
352
+ : fn_id_ (fnid),
353
+ throw_on_ex_ (throw_on_ex),
354
+ ex_caught_ (false)
355
+ {
356
+ }
357
+
358
+ R2TAO_RBFuncall::R2TAO_RBFuncall (const char* fn, bool throw_on_ex)
359
+ : fn_id_ (rb_intern (fn)),
360
+ throw_on_ex_ (throw_on_ex),
361
+ ex_caught_ (false)
362
+ {
363
+ }
364
+
365
+ R2TAO_RBFuncall::~R2TAO_RBFuncall ()
366
+ {
367
+ }
368
+
369
+ VALUE R2TAO_RBFuncall::invoke (VALUE rcvr, VALUE args)
370
+ {
371
+ return this->_invoke (FuncArgArray (rcvr, args));
372
+ }
373
+
374
+ VALUE R2TAO_RBFuncall::invoke (VALUE rcvr, int argc, VALUE *args)
375
+ {
376
+ return this->_invoke (FuncArgList (rcvr, argc, args));
377
+ }
378
+
379
+ VALUE R2TAO_RBFuncall::invoke (VALUE rcvr)
380
+ {
381
+ return this->_invoke (FuncArgList (rcvr, 0, 0));
382
+ }
383
+
384
+ VALUE R2TAO_RBFuncall::_invoke (const FuncArgs& fa)
385
+ {
386
+ static ID interface_repository_id_ID = rb_intern ("_interface_repository_id");;
387
+
388
+ this->ex_caught_ = false; // reset
389
+
390
+ int invoke_state = 0;
391
+ HelperArgs ha (*this, fa);
392
+ VALUE result = rb_protect (RUBY_INVOKE_FUNC (R2TAO_RBFuncall::invoke_helper),
393
+ (VALUE)&ha,
394
+ &invoke_state);
395
+ if (invoke_state)
396
+ {
397
+ if (this->throw_on_ex_)
398
+ {
399
+ // handle exception
400
+ VALUE rexc = rb_gv_get ("$!");
401
+ if (rb_obj_is_kind_of(rexc, r2tao_cUserException) == Qtrue)
402
+ {
403
+ VALUE rextc = rb_eval_string ("R2CORBA::CORBA::Any.typecode_for_any ($!)");
404
+ if (rextc != Qnil)
405
+ {
406
+ CORBA::Any _xval;
407
+ CORBA::TypeCode_ptr _xtc = r2corba_TypeCode_r2t (rextc);
408
+ r2tao_Ruby2Any(_xval, _xtc, rexc);
409
+ throw ::CORBA::UnknownUserException (_xval);
410
+ }
411
+ }
412
+
413
+ if (rb_obj_is_kind_of(rexc, r2tao_cSystemException) == Qtrue)
414
+ {
415
+ VALUE rid = rb_funcall (rexc, interface_repository_id_ID, 0);
416
+ CORBA::SystemException* _exc = TAO::create_system_exception (RSTRING_PTR (rid));
417
+
418
+ _exc->minor (
419
+ static_cast<CORBA::ULong> (NUM2ULONG (rb_iv_get (rexc, "@minor"))));
420
+ _exc->completed (
421
+ static_cast<CORBA::CompletionStatus> (NUM2ULONG (rb_iv_get (rexc, "@completed"))));
422
+
423
+ ACE_Auto_Basic_Ptr<CORBA::SystemException> e_ptr(_exc);
424
+ _exc->_raise ();
425
+ }
426
+ else
427
+ {
428
+ rb_eval_string ("STDERR.puts $!.to_s+\"\\n\"+$!.backtrace.join(\"\\n\")");
429
+ throw ::CORBA::UNKNOWN (0, CORBA::COMPLETED_MAYBE);
430
+ }
431
+ }
432
+ else
433
+ {
434
+ this->ex_caught_ = true;
435
+ }
436
+ }
437
+ else
438
+ {
439
+ return result;
440
+ }
441
+ return Qnil;
442
+ }
443
+
444
+ VALUE R2TAO_RBFuncall::FuncArgArray::rb_invoke (ID fnid) const
445
+ {
446
+ return rb_apply (this->receiver_, fnid, this->args_);
447
+ }
448
+
449
+ VALUE R2TAO_RBFuncall::FuncArgList::rb_invoke (ID fnid) const
450
+ {
451
+ return rb_funcall2 (this->receiver_, fnid, this->argc_, this->args_);
452
+ }
453
+
454
+ VALUE R2TAO_RBFuncall::invoke_inner (const FuncArgs& fnargs)
455
+ {
456
+ return fnargs.rb_invoke (this->fn_id_);
457
+ }
458
+
459
+ VALUE R2TAO_RBFuncall::invoke_helper (VALUE arg)
460
+ {
461
+ HelperArgs* ha = reinterpret_cast<HelperArgs*> (arg);
462
+ return ha->caller_.invoke_inner (ha->fnargs_);
463
+ }