transactd 1.2.0 → 2.0.0

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 (306) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA +46 -67
  3. data/BUILD_WIN-JA +106 -63
  4. data/CMakeLists.txt +40 -15
  5. data/README +219 -75
  6. data/README-JA +207 -76
  7. data/README_ORMSRCGEN +118 -0
  8. data/README_ORMSRCGEN-JA +115 -0
  9. data/bin/common/tdclc_32_2_0.dll +0 -0
  10. data/bin/common/tdclc_64_2_0.dll +0 -0
  11. data/build/common/check_for_link_iconv.cmake +18 -14
  12. data/build/common/create_symlink.cmake.in +25 -0
  13. data/build/common/get_boost_libs.cmake +23 -23
  14. data/build/common/options.cmake +0 -66
  15. data/build/common/smart_install.cmake +3 -3
  16. data/build/common/transactd.rc.in +15 -5
  17. data/build/common/transactd_cl_common.cmake +37 -18
  18. data/build/common/transactd_cl_output.cmake +55 -13
  19. data/build/common/transactd_common.cmake +108 -31
  20. data/build/swig/php/generate.cmake.in +15 -17
  21. data/build/swig/php/generate.cmd.in +15 -9
  22. data/build/swig/php/php.swg +124 -82
  23. data/build/swig/php/transactd.no_yield.php +4494 -0
  24. data/build/swig/php/transactd.no_yield.php.git.patch +685 -0
  25. data/build/swig/php/transactd.no_yield.php.patch +685 -0
  26. data/build/swig/php/transactd.yield.php +4461 -0
  27. data/build/swig/php/transactd.yield.php.git.patch +652 -0
  28. data/build/swig/php/transactd.yield.php.patch +652 -0
  29. data/build/swig/referencecounter.h +79 -0
  30. data/build/swig/ruby/ruby.swg +226 -76
  31. data/build/swig/ruby/threadBlockRegionWrapper.h +71 -0
  32. data/build/swig/ruby/without_gvl.swg +87 -0
  33. data/build/swig/tdcl.i +659 -170
  34. data/build/swig/validatablepointer.h +91 -0
  35. data/build/tdclc/CMakeLists.txt +49 -34
  36. data/build/tdclc/{tdclc_64.cbproj → tdclc.cbproj} +65 -20
  37. data/build/tdclc/tdclc.rc +0 -0
  38. data/build/tdclcpp/CMakeLists.txt +84 -20
  39. data/build/tdclcpp/tdclcpp.rc +0 -0
  40. data/build/tdclcpp/{tdclcpp_bcb_64.cbproj → tdclcpp_bc.cbproj} +168 -44
  41. data/build/tdclrb/CMakeLists.txt +84 -66
  42. data/build/tdclrb/bldgem/extconf.rb +28 -3
  43. data/build/tdclrb/gem/helper.rb +11 -1
  44. data/build/tdclrb/gem_output.cmake +20 -16
  45. data/index_ja.html +15 -0
  46. data/source/bzs/db/IBlobBuffer.h +15 -17
  47. data/source/bzs/db/blobBuffer.h +186 -140
  48. data/source/bzs/db/blobStructs.h +37 -37
  49. data/source/bzs/db/engine/mysql/IReadRecords.h +34 -34
  50. data/source/bzs/db/engine/mysql/bookmark.h +150 -147
  51. data/source/bzs/db/engine/mysql/database.cpp +1721 -1526
  52. data/source/bzs/db/engine/mysql/database.h +608 -370
  53. data/source/bzs/db/engine/mysql/dbManager.cpp +213 -201
  54. data/source/bzs/db/engine/mysql/dbManager.h +115 -104
  55. data/source/bzs/db/engine/mysql/errorMessage.cpp +49 -50
  56. data/source/bzs/db/engine/mysql/errorMessage.h +25 -26
  57. data/source/bzs/db/engine/mysql/fieldAccess.h +55 -61
  58. data/source/bzs/db/engine/mysql/mydebuglog.cpp +326 -292
  59. data/source/bzs/db/engine/mysql/mydebuglog.h +63 -55
  60. data/source/bzs/db/engine/mysql/mysqlInternal.h +182 -125
  61. data/source/bzs/db/engine/mysql/mysqlThd.cpp +121 -121
  62. data/source/bzs/db/engine/mysql/mysqlThd.h +20 -20
  63. data/source/bzs/db/engine/mysql/percentageKey.h +241 -228
  64. data/source/bzs/db/protocol/ICommandExecuter.h +18 -17
  65. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +543 -514
  66. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +155 -158
  67. data/source/bzs/db/protocol/tdap/btrDate.cpp +213 -180
  68. data/source/bzs/db/protocol/tdap/btrDate.h +39 -37
  69. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +173 -0
  70. data/source/bzs/db/protocol/tdap/client/activeTable.h +165 -0
  71. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +370 -0
  72. data/source/bzs/db/protocol/tdap/client/bulkInsert.h +13 -23
  73. data/source/bzs/db/protocol/tdap/client/client.cpp +81 -68
  74. data/source/bzs/db/protocol/tdap/client/client.h +361 -320
  75. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +17 -22
  76. data/source/bzs/db/protocol/tdap/client/connMgr.h +17 -19
  77. data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +243 -0
  78. data/source/bzs/db/protocol/tdap/client/connectionPool.h +109 -0
  79. data/source/bzs/db/protocol/tdap/client/database.cpp +327 -219
  80. data/source/bzs/db/protocol/tdap/client/database.h +141 -118
  81. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +60 -62
  82. data/source/bzs/db/protocol/tdap/client/databaseManager.h +255 -0
  83. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +315 -202
  84. data/source/bzs/db/protocol/tdap/client/dbDef.h +40 -32
  85. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +390 -371
  86. data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +148 -56
  87. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +149 -57
  88. data/source/bzs/db/protocol/tdap/client/export.h +35 -0
  89. data/source/bzs/db/protocol/tdap/client/field.cpp +1985 -0
  90. data/source/bzs/db/protocol/tdap/client/field.h +393 -0
  91. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +14 -14
  92. data/source/bzs/db/protocol/tdap/client/fieldDDF.h +11 -14
  93. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +123 -0
  94. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +58 -0
  95. data/source/bzs/db/protocol/tdap/client/fields.h +178 -0
  96. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +13 -16
  97. data/source/bzs/db/protocol/tdap/client/fileDDF.h +11 -17
  98. data/source/bzs/db/protocol/tdap/client/filter.h +423 -259
  99. data/source/bzs/db/protocol/tdap/client/groupComp.h +117 -0
  100. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +818 -0
  101. data/source/bzs/db/protocol/tdap/client/groupQuery.h +281 -0
  102. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +14 -17
  103. data/source/bzs/db/protocol/tdap/client/indexDDF.h +11 -14
  104. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +231 -0
  105. data/source/bzs/db/protocol/tdap/client/memRecord.h +145 -0
  106. data/source/bzs/db/protocol/tdap/client/memRecordset.cpp +448 -0
  107. data/source/bzs/db/protocol/tdap/client/memRecordset.h +159 -0
  108. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +300 -173
  109. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +53 -36
  110. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +171 -128
  111. data/source/bzs/db/protocol/tdap/client/nsTable.h +121 -87
  112. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +173 -0
  113. data/source/bzs/db/protocol/tdap/client/recordset.cpp +209 -0
  114. data/source/bzs/db/protocol/tdap/client/recordset.h +86 -0
  115. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +596 -0
  116. data/source/bzs/db/protocol/tdap/client/request.h +227 -170
  117. data/source/bzs/db/protocol/tdap/client/serializer.cpp +1288 -0
  118. data/source/bzs/db/protocol/tdap/client/serializer.h +295 -0
  119. data/source/bzs/db/protocol/tdap/client/sharedData.cpp +9 -12
  120. data/source/bzs/db/protocol/tdap/client/sharedData.h +18 -16
  121. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +494 -473
  122. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +51 -53
  123. data/source/bzs/db/protocol/tdap/client/stringConverter.h +214 -148
  124. data/source/bzs/db/protocol/tdap/client/table.cpp +929 -1665
  125. data/source/bzs/db/protocol/tdap/client/table.h +413 -87
  126. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +642 -534
  127. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +25 -40
  128. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +11 -15
  129. data/source/bzs/db/protocol/tdap/client/trdormapi.h +378 -437
  130. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -1
  131. data/source/bzs/db/protocol/tdap/fieldComp.h +127 -0
  132. data/source/bzs/db/protocol/tdap/myDateTime.cpp +352 -345
  133. data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +75 -78
  134. data/source/bzs/db/protocol/tdap/mysql/characterset.h +18 -19
  135. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +216 -199
  136. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +23 -14
  137. data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +354 -314
  138. data/source/bzs/db/protocol/tdap/mysql/debuglog.h +57 -47
  139. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +905 -739
  140. data/source/bzs/db/protocol/tdap/mysql/request.h +152 -159
  141. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1044 -879
  142. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +87 -81
  143. data/source/bzs/db/protocol/tdap/tdapRequest.h +162 -130
  144. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +368 -166
  145. data/source/bzs/db/protocol/tdap/tdapSchema.h +702 -566
  146. data/source/bzs/db/protocol/tdap/tdapcapi.h +387 -353
  147. data/source/bzs/db/transactd/appBuilderImple.h +21 -20
  148. data/source/bzs/db/transactd/appModule.cpp +350 -98
  149. data/source/bzs/db/transactd/appModule.h +31 -37
  150. data/source/bzs/db/transactd/connManager.cpp +138 -135
  151. data/source/bzs/db/transactd/connManager.h +28 -21
  152. data/source/bzs/db/transactd/connectionRecord.h +39 -39
  153. data/source/bzs/db/transactd/transactd.cpp +217 -203
  154. data/source/bzs/env/boost_bcb_link.h +131 -0
  155. data/source/bzs/env/compiler.h +136 -79
  156. data/source/bzs/env/crosscompile.cpp +57 -57
  157. data/source/bzs/env/crosscompile.h +130 -115
  158. data/source/bzs/env/fileopen.h +7 -8
  159. data/source/bzs/env/mbcswchrLinux.cpp +4 -9
  160. data/source/bzs/env/mbcswchrLinux.h +37 -34
  161. data/source/bzs/env/tcharMinGW.h +59 -0
  162. data/source/bzs/env/tstring.h +90 -95
  163. data/source/bzs/example/changeSchema.cpp +22 -23
  164. data/source/bzs/example/changeSchema_c.cpp +22 -24
  165. data/source/bzs/example/connection_pool_c.cpp +49 -104
  166. data/source/bzs/example/createDatabase.cpp +40 -47
  167. data/source/bzs/example/createDatabase_c.cpp +38 -43
  168. data/source/bzs/example/deleteRecords.cpp +10 -15
  169. data/source/bzs/example/deleteRecords_c.cpp +10 -14
  170. data/source/bzs/example/dropDatabase.cpp +3 -9
  171. data/source/bzs/example/dropDatabase_c.cpp +5 -6
  172. data/source/bzs/example/insertRecords.cpp +37 -29
  173. data/source/bzs/example/insertRecords_c.cpp +19 -25
  174. data/source/bzs/example/ormap_c.cpp +621 -0
  175. data/source/bzs/example/queryData.cpp +371 -0
  176. data/source/bzs/example/queryData.h +16 -0
  177. data/source/bzs/example/query_c.cpp +109 -0
  178. data/source/bzs/example/readRecords.cpp +27 -27
  179. data/source/bzs/example/readRecords_c.cpp +25 -23
  180. data/source/bzs/example/updateRecords.cpp +16 -21
  181. data/source/bzs/example/updateRecords_c.cpp +8 -12
  182. data/source/bzs/example/update_with_transaction.cpp +21 -24
  183. data/source/bzs/example/update_with_transaction_c.cpp +12 -15
  184. data/source/bzs/example/useORMRecord.cpp +177 -0
  185. data/source/bzs/netsvc/client/tcpClient.cpp +167 -156
  186. data/source/bzs/netsvc/client/tcpClient.h +541 -489
  187. data/source/bzs/netsvc/server/IAppModule.h +119 -32
  188. data/source/bzs/netsvc/server/iserver.h +21 -23
  189. data/source/bzs/netsvc/server/serverCpt.cpp +421 -391
  190. data/source/bzs/netsvc/server/serverCpt.h +41 -43
  191. data/source/bzs/netsvc/server/serverPipe.cpp +580 -565
  192. data/source/bzs/netsvc/server/serverPipe.h +44 -45
  193. data/source/bzs/netsvc/server/serverTpool.cpp +333 -303
  194. data/source/bzs/netsvc/server/serverTpool.h +38 -43
  195. data/source/bzs/rtl/benchmark.cpp +91 -31
  196. data/source/bzs/rtl/benchmark.h +76 -22
  197. data/source/bzs/rtl/datetime.cpp +231 -233
  198. data/source/bzs/rtl/datetime.h +16 -16
  199. data/source/bzs/rtl/debuglog.cpp +48 -51
  200. data/source/bzs/rtl/debuglog.h +55 -44
  201. data/source/bzs/rtl/exception.h +55 -48
  202. data/source/bzs/rtl/stl_uty.cpp +27 -28
  203. data/source/bzs/rtl/stl_uty.h +28 -29
  204. data/source/bzs/rtl/stringBuffers.cpp +8 -6
  205. data/source/bzs/rtl/stringBuffers.h +16 -9
  206. data/source/bzs/rtl/strtrim.cpp +90 -91
  207. data/source/bzs/rtl/strtrim.h +14 -16
  208. data/source/bzs/test/tdclatl/bench_query_atl.js +647 -0
  209. data/source/bzs/test/tdclatl/bench_tdclatl.js +303 -303
  210. data/source/bzs/test/tdclatl/test_query_atl.js +669 -0
  211. data/source/bzs/test/tdclphp/bench.php +357 -0
  212. data/source/bzs/test/tdclphp/transactd_Test.php +907 -303
  213. data/source/bzs/test/tdclphp/transactd_blob_Test.php +21 -49
  214. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +41 -75
  215. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +23 -37
  216. data/source/bzs/test/tdclphp/transactd_pool_Test.php +120 -0
  217. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +4 -6
  218. data/source/bzs/test/tdclrb/prepare.rb +15 -12
  219. data/source/bzs/test/tdclrb/transactd_blob_spec.rb +29 -32
  220. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -29
  221. data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +18 -19
  222. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +107 -0
  223. data/source/bzs/test/tdclrb/transactd_spec.rb +734 -142
  224. data/source/bzs/test/transactdBench/query_bench.cpp +156 -0
  225. data/source/bzs/test/transactdBench/scaling_bench.cpp +265 -0
  226. data/source/bzs/test/transactdBench/transactdBench.cpp +107 -83
  227. data/source/bzs/test/transactdBench/transactdBench2.cpp +122 -83
  228. data/source/bzs/test/transactdBench/workerBase.cpp +5 -0
  229. data/source/bzs/test/transactdBench/workerBase.h +88 -0
  230. data/source/bzs/test/transactdBench/workerMySQLImple.h +333 -0
  231. data/source/bzs/test/transactdBench/workerTransactdImple.h +201 -0
  232. data/source/bzs/test/trdclengn/test_blob.cpp +121 -73
  233. data/source/bzs/test/trdclengn/test_trdclengn.cpp +1244 -426
  234. data/source/global/ormsrcgen/confParam.h +80 -0
  235. data/source/global/ormsrcgen/fieldName.cpp +77 -0
  236. data/source/global/ormsrcgen/fieldName.h +43 -0
  237. data/source/global/ormsrcgen/main.cpp +196 -0
  238. data/source/global/ormsrcgen/srcgen.cpp +763 -0
  239. data/source/global/ormsrcgen/srcgen.h +72 -0
  240. data/source/global/ormsrcgen/template/fieldNameList_sample.txt +2 -0
  241. data/source/global/ormsrcgen/template/ormDataClass_template.cpp +48 -0
  242. data/source/global/ormsrcgen/template/ormDataClass_template.h +34 -0
  243. data/source/global/ormsrcgen/template/ormMapClass_template.cpp +51 -0
  244. data/source/global/ormsrcgen/template/ormMapClass_template.h +62 -0
  245. data/source/global/ormsrcgen/template/template.cnf +38 -0
  246. data/source/global/querystmts/querystmts.cpp +237 -0
  247. data/source/global/tdclatl/ConnectParams.cpp +77 -0
  248. data/source/global/tdclatl/ConnectParams.h +70 -0
  249. data/source/global/tdclatl/Database.cpp +132 -128
  250. data/source/global/tdclatl/Database.h +60 -49
  251. data/source/global/tdclatl/DbDef.cpp +68 -64
  252. data/source/global/tdclatl/DbDef.h +36 -36
  253. data/source/global/tdclatl/Field.cpp +12 -17
  254. data/source/global/tdclatl/Field.h +15 -12
  255. data/source/global/tdclatl/FieldDef.cpp +75 -36
  256. data/source/global/tdclatl/FieldDef.h +38 -19
  257. data/source/global/tdclatl/FieldDefs.cpp +74 -0
  258. data/source/global/tdclatl/FieldDefs.h +56 -0
  259. data/source/global/tdclatl/FieldNames.cpp +99 -0
  260. data/source/global/tdclatl/FieldNames.h +66 -0
  261. data/source/global/tdclatl/Flags.cpp +75 -37
  262. data/source/global/tdclatl/Flags.h +13 -12
  263. data/source/global/tdclatl/GroupQuery.cpp +119 -0
  264. data/source/global/tdclatl/GroupQuery.h +65 -0
  265. data/source/global/tdclatl/KeyDef.cpp +15 -14
  266. data/source/global/tdclatl/KeyDef.h +20 -17
  267. data/source/global/tdclatl/KeySegment.cpp +13 -12
  268. data/source/global/tdclatl/PooledDbManager.cpp +223 -0
  269. data/source/global/tdclatl/PooledDbManager.h +76 -0
  270. data/source/global/tdclatl/QueryBase.cpp +206 -127
  271. data/source/global/tdclatl/QueryBase.h +55 -59
  272. data/source/global/tdclatl/Record.cpp +214 -0
  273. data/source/global/tdclatl/Record.h +96 -0
  274. data/source/global/tdclatl/Recordset.cpp +278 -0
  275. data/source/global/tdclatl/Recordset.h +83 -0
  276. data/source/global/tdclatl/RecordsetQuery.cpp +118 -0
  277. data/source/global/tdclatl/RecordsetQuery.h +126 -0
  278. data/source/global/tdclatl/Table.cpp +57 -60
  279. data/source/global/tdclatl/Table.h +32 -29
  280. data/source/global/tdclatl/TableDef.cpp +63 -62
  281. data/source/global/tdclatl/TableDef.h +20 -22
  282. data/source/global/tdclatl/TdVersion.cpp +3 -3
  283. data/source/global/tdclatl/TdVersion.h +15 -11
  284. data/source/global/tdclatl/_IDatabaseEvents_CP.h +99 -92
  285. data/source/global/tdclatl/activeTable.cpp +355 -0
  286. data/source/global/tdclatl/activeTable.h +79 -0
  287. data/source/global/tdclatl/dllmain.cpp +4 -3
  288. data/source/global/tdclatl/dllmain.h +7 -6
  289. data/source/global/tdclatl/keySegment.h +22 -18
  290. data/source/global/tdclatl/resource.h +0 -0
  291. data/source/global/tdclatl/stdafx.h +6 -4
  292. data/source/global/tdclatl/targetver.h +0 -1
  293. data/source/global/tdclatl/tdclatl.cpp +10 -5
  294. data/source/global/tdclatl/tdclatl.idl +530 -14
  295. data/source/linux/charsetConvert.h +78 -79
  296. data/source/linux/linuxTypes.h +9 -12
  297. data/source/linux/tchar.h +168 -166
  298. data/transactd.gemspec +24 -16
  299. metadata +98 -12
  300. data/bin/common/tdclc_32_1_2.dll +0 -0
  301. data/bin/common/tdclc_64_1_2.dll +0 -0
  302. data/build/tdclc/tdclc_32.cbproj +0 -173
  303. data/build/tdclcpp/tdclcpp_bcb_32.cbproj +0 -232
  304. data/build/tdclrb/GEM_VERSION +0 -3
  305. data/source/bzs/db/protocol/tdap/client/filter.cpp +0 -43
  306. data/source/bzs/example/useORM.cpp +0 -585
@@ -12,8 +12,8 @@
12
12
  GNU General Public License for more details.
13
13
 
14
14
  You should have received a copy of the GNU General Public License
15
- along with this program; if not, write to the Free Software
16
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
17
  02111-1307, USA.
18
18
  =================================================================*/
19
19
  #include "serverTpool.h"
@@ -22,7 +22,7 @@
22
22
  #include <boost/shared_ptr.hpp>
23
23
  #include <boost/scoped_array.hpp>
24
24
  #include <boost/thread.hpp>
25
- #include <boost/asio/write.hpp>
25
+ #include <boost/asio/write.hpp>
26
26
  #include <boost/thread/xtime.hpp>
27
27
  #include <algorithm>
28
28
  #include <boost/enable_shared_from_this.hpp>
@@ -35,16 +35,14 @@ using namespace boost;
35
35
  using namespace boost::asio;
36
36
  using namespace boost::asio::ip;
37
37
 
38
-
39
-
40
38
  #define READBUF_SIZE 66000
41
39
  #define WRITEBUF_SIZE 66000
42
40
 
43
- namespace bzs
41
+ namespace bzs
44
42
  {
45
- namespace netsvc
43
+ namespace netsvc
46
44
  {
47
- namespace server
45
+ namespace server
48
46
  {
49
47
  namespace tpool
50
48
  {
@@ -57,195 +55,219 @@ unsigned int g_connections = 0;
57
55
 
58
56
  /** Asynchronous thread pool server
59
57
  * In transaction then use one thread. that like connection per thread.
60
- *
58
+ *
61
59
  */
62
60
  class connection : public boost::enable_shared_from_this<connection>,
63
- public iconnection, private boost::noncopyable
61
+ public iconnection,
62
+ private boost::noncopyable
64
63
  {
65
- static mutex m_mutex;
66
- io_service& m_ios;
67
- boost::asio::ip::tcp::socket m_socket;
68
- shared_ptr<IAppModule> m_module;
69
- std::vector<char> m_buffer;
70
- std::vector<char> m_result;
71
- buffers m_optionalBuffes;
72
-
73
- size_t m_readLen;
74
- char* m_statck;
75
-
76
- bool syncReadWrite()
77
- {
78
- bool complete = false;
79
- boost::system::error_code e;
80
- m_readLen = 0;
81
- while (1)
82
- {
83
- m_readLen += boost::asio::read(m_socket, boost::asio::buffer(&m_buffer[m_readLen], m_buffer.size()-m_readLen)
84
- ,boost::asio::transfer_at_least(4), e);
85
- if (e) return false;
86
-
87
- size_t n = m_module->onRead((const char*)&m_buffer[0], m_readLen, complete);
88
- if (!complete)
89
- {
90
- if (n > m_buffer.size()) m_buffer.resize(n);
91
- m_readLen += boost::asio::read(m_socket, boost::asio::buffer(&m_buffer[m_readLen], n-m_readLen)
92
- , boost::asio::transfer_all(), e);
93
- if (e) return false;
94
- n = m_module->onRead((const char*)&m_buffer[0], m_readLen, complete);
95
- }
96
- if (complete)
97
- {
98
- m_readLen = 0;
99
- size_t size=0;
100
- m_optionalBuffes.clear();
101
- int ret = m_module->execute(&m_result[0], size, &m_optionalBuffes);
102
-
103
- if (ret == EXECUTE_RESULT_QUIT)
104
- return false;
105
- m_optionalBuffes.insert(m_optionalBuffes.begin(), buffer(&m_result[0], size));
106
- if (ret == EXECUTE_RESULT_FORCSE_ASYNC)
107
- return true;
108
- else
109
- {
110
- m_readLen = 0;
111
- DEBUG_PROFILE_START(1)
112
-
113
- boost::asio::write(m_socket, m_optionalBuffes, boost::asio::transfer_all(), e);
114
- if (e) return false;
115
- }
116
- }
117
- }
118
- }
119
-
120
- void handle_read(const boost::system::error_code& e, std::size_t bytes_transferred)
121
- {
122
- DEBUG_PROFILE_START(m_readLen==0)
123
- if (!e)
124
- {
125
- bool complete = false;
126
-
127
- if (bytes_transferred==0)
128
- return ;
129
- m_readLen += bytes_transferred;
130
- size_t n = m_module->onRead(&m_buffer[0], m_readLen, complete);
131
- if (complete)
132
- {
133
- DEBUG_PROFILE_END(1, "handle_read")
134
- size_t size=0;
135
- m_optionalBuffes.clear();
136
- int ret = m_module->execute(&m_result[0], size, &m_optionalBuffes);
137
-
138
- if (ret == EXECUTE_RESULT_QUIT)
139
- return ;
140
-
141
- m_optionalBuffes.insert(m_optionalBuffes.begin(), buffer(&m_result[0], size));
142
- if (ret == EXECUTE_RESULT_FORCSE_SYNC)
143
- {
144
- boost::system::error_code ec;
145
- boost::asio::write(m_socket, m_optionalBuffes, boost::asio::transfer_all(), ec);
146
- if (ec) return ;
147
- syncReadWrite();
148
- }
149
- DEBUG_PROFILE_START(1)
150
- async_write(m_socket, m_optionalBuffes, boost::bind(&connection::handle_write, shared_from_this(),
151
- boost::asio::placeholders::error));
152
-
153
- return;
154
- }
155
-
156
- if (n > m_buffer.size())
157
- m_buffer.resize(n);
158
- m_socket.async_read_some(buffer(&m_buffer[m_readLen], m_buffer.size()-m_readLen),
159
- boost::bind(&connection::handle_read, shared_from_this(),
160
- boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
161
- }
162
- }
163
-
164
- void handle_write(const boost::system::error_code& e)
165
- {
166
- if (!e)
167
- {
168
- DEBUG_PROFILE_END(1, "write")
169
- if (m_module->isShutDown())
170
- return;
171
- start();
172
- }
173
- }
174
-
175
-
176
- public:
177
- explicit connection(io_service& ios):m_socket(ios),m_ios(ios)
178
- {
179
- m_buffer.resize(READBUF_SIZE);
180
- m_result.resize(WRITEBUF_SIZE);
181
-
182
- mutex::scoped_lock lck(m_mutex);
183
- connections.push_back(this);
184
- ++g_connections;
185
-
186
-
187
- }
188
-
189
- ~connection()
190
- {
191
- if (connections.size())
192
- {
193
- mutex::scoped_lock lck(m_mutex);
194
- std::vector<connection*>::iterator it = find(connections.begin(), connections.end(), this);
195
- if (it != connections.end())
196
- {
197
- connections.erase( it);
198
- --g_connections;
199
- }
200
- }
201
- }
202
-
203
- boost::asio::ip::tcp::socket& socket(){return m_socket;}
204
-
205
- void sendConnectAccept()
206
- {
207
- size_t n = m_module->onAccept(&m_result[0], WRITEBUF_SIZE);
208
- if (n)
209
- boost::asio::write(m_socket, buffer(&m_result[0], n), boost::asio::transfer_all());
210
- }
211
-
212
- void start()
213
- {
214
- m_readLen = 0;
215
- m_socket.async_read_some(buffer(&m_buffer[0], m_buffer.size()),
216
- bind(&connection::handle_read, shared_from_this(), placeholders::error,
217
- placeholders::bytes_transferred));
218
- }
219
-
220
- void setModule(boost::shared_ptr<IAppModule> p)
221
- {
222
- m_module = p;
223
- }
224
-
225
- void close()
226
- {
227
- m_ios.post(boost::bind(&connection::doClose, this));
228
- }
229
-
230
- void doClose()
231
- {
232
- boost::system::error_code ec;
233
- m_socket.close(ec);
234
- }
235
-
236
- static std::vector<connection* > connections;
237
-
238
- static void stop()
239
- {
240
- mutex::scoped_lock lck(m_mutex);
241
- boost::system::error_code ec;
242
- for (size_t i=0;i<connections.size();i++)
243
- connections[i]->socket().close(ec);
244
- }
64
+ static mutex m_mutex;
65
+ io_service& m_ios;
66
+ boost::asio::ip::tcp::socket m_socket;
67
+ shared_ptr<IAppModule> m_module;
68
+ vector_buffer m_buffer;
69
+ vector_buffer m_result;
70
+ buffers m_optionalBuffes;
71
+
72
+ size_t m_readLen;
73
+ char* m_statck;
74
+
75
+ bool syncReadWrite()
76
+ {
77
+ bool complete = false;
78
+ boost::system::error_code e;
79
+ m_readLen = 0;
80
+ while (1)
81
+ {
82
+ m_readLen += boost::asio::read(
83
+ m_socket, boost::asio::buffer(&m_buffer[m_readLen],
84
+ m_buffer.size() - m_readLen),
85
+ boost::asio::transfer_at_least(4), e);
86
+ if (e)
87
+ return false;
88
+
89
+ size_t n = m_module->onRead((const char*)&m_buffer[0], m_readLen,
90
+ complete);
91
+ if (!complete)
92
+ {
93
+ if (n > m_buffer.size())
94
+ m_buffer.resize(n);
95
+ m_readLen += boost::asio::read(
96
+ m_socket,
97
+ boost::asio::buffer(&m_buffer[m_readLen], n - m_readLen),
98
+ boost::asio::transfer_all(), e);
99
+ if (e)
100
+ return false;
101
+ n = m_module->onRead((const char*)&m_buffer[0], m_readLen,
102
+ complete);
103
+ }
104
+ if (complete)
105
+ {
106
+ m_readLen = 0;
107
+ size_t size = 0;
108
+ m_optionalBuffes.clear();
109
+ vecBuffer vbuf(m_result);
110
+ bzs::netsvc::server::IResultBuffer& buf = vbuf;
111
+ int ret = m_module->execute(buf, size, &m_optionalBuffes);
112
+
113
+ if (ret == EXECUTE_RESULT_QUIT)
114
+ return false;
115
+ m_optionalBuffes.insert(m_optionalBuffes.begin(),
116
+ buffer(&m_result[0], size));
117
+ if (ret == EXECUTE_RESULT_FORCSE_ASYNC)
118
+ return true;
119
+ else
120
+ {
121
+ m_readLen = 0;
122
+ DEBUG_PROFILE_START(1)
123
+
124
+ boost::asio::write(m_socket, m_optionalBuffes,
125
+ boost::asio::transfer_all(), e);
126
+ if (e)
127
+ return false;
128
+ }
129
+ }
130
+ }
131
+ }
132
+
133
+ void handle_read(const boost::system::error_code& e,
134
+ std::size_t bytes_transferred)
135
+ {
136
+ DEBUG_PROFILE_START(m_readLen == 0)
137
+ if (!e)
138
+ {
139
+ bool complete = false;
140
+
141
+ if (bytes_transferred == 0)
142
+ return;
143
+ m_readLen += bytes_transferred;
144
+ size_t n = m_module->onRead(&m_buffer[0], m_readLen, complete);
145
+ if (complete)
146
+ {
147
+ DEBUG_PROFILE_END(1, "handle_read")
148
+ size_t size = 0;
149
+ m_optionalBuffes.clear();
150
+ vecBuffer vbuf(m_result);
151
+ bzs::netsvc::server::IResultBuffer& buf = vbuf;
152
+ int ret = m_module->execute(buf, size, &m_optionalBuffes);
153
+
154
+ if (ret == EXECUTE_RESULT_QUIT)
155
+ return;
156
+
157
+ m_optionalBuffes.insert(m_optionalBuffes.begin(),
158
+ buffer(&m_result[0], size));
159
+ if (ret == EXECUTE_RESULT_FORCSE_SYNC)
160
+ {
161
+ boost::system::error_code ec;
162
+ boost::asio::write(m_socket, m_optionalBuffes,
163
+ boost::asio::transfer_all(), ec);
164
+ if (ec)
165
+ return;
166
+ syncReadWrite();
167
+ }
168
+ DEBUG_PROFILE_START(1)
169
+ async_write(m_socket, m_optionalBuffes,
170
+ boost::bind(&connection::handle_write,
171
+ shared_from_this(),
172
+ boost::asio::placeholders::error));
173
+
174
+ return;
175
+ }
176
+
177
+ if (n > m_buffer.size())
178
+ m_buffer.resize(n);
179
+ m_socket.async_read_some(
180
+ buffer(&m_buffer[m_readLen], m_buffer.size() - m_readLen),
181
+ boost::bind(&connection::handle_read, shared_from_this(),
182
+ boost::asio::placeholders::error,
183
+ boost::asio::placeholders::bytes_transferred));
184
+ }
185
+ }
186
+
187
+ void handle_write(const boost::system::error_code& e)
188
+ {
189
+ if (!e)
190
+ {
191
+ DEBUG_PROFILE_END(1, "write")
192
+ if (m_module->isShutDown())
193
+ return;
194
+ start();
195
+ }
196
+ }
245
197
 
198
+ public:
199
+ explicit connection(io_service& ios) : m_ios(ios), m_socket(ios)
200
+ {
201
+ m_buffer.resize(READBUF_SIZE);
202
+ m_result.resize(WRITEBUF_SIZE);
203
+
204
+ mutex::scoped_lock lck(m_mutex);
205
+ connections.push_back(this);
206
+ ++g_connections;
207
+ }
208
+
209
+ ~connection()
210
+ {
211
+ if (connections.size())
212
+ {
213
+ mutex::scoped_lock lck(m_mutex);
214
+ std::vector<connection*>::iterator it =
215
+ find(connections.begin(), connections.end(), this);
216
+ if (it != connections.end())
217
+ {
218
+ connections.erase(it);
219
+ --g_connections;
220
+ }
221
+ }
222
+ }
223
+
224
+ boost::asio::ip::tcp::socket& socket() { return m_socket; }
225
+
226
+ void asyncWrite(const char* p, unsigned int size)
227
+ {
228
+ boost::asio::write(m_socket, buffer(p, size),
229
+ boost::asio::transfer_all());
230
+ }
231
+
232
+ void sendConnectAccept()
233
+ {
234
+ size_t n = m_module->onAccept(&m_result[0], WRITEBUF_SIZE);
235
+ if (n)
236
+ boost::asio::write(m_socket, buffer(&m_result[0], n),
237
+ boost::asio::transfer_all());
238
+ }
239
+
240
+ void start()
241
+ {
242
+ m_readLen = 0;
243
+ m_socket.async_read_some(buffer(&m_buffer[0], m_buffer.size()),
244
+ bind(&connection::handle_read,
245
+ shared_from_this(), placeholders::error,
246
+ placeholders::bytes_transferred));
247
+ }
248
+
249
+ void setModule(boost::shared_ptr<IAppModule> p) { m_module = p; }
250
+
251
+ void close() { m_ios.post(boost::bind(&connection::doClose, this)); }
252
+
253
+ void doClose()
254
+ {
255
+ boost::system::error_code ec;
256
+ m_socket.close(ec);
257
+ }
258
+
259
+ static std::vector<connection*> connections;
260
+
261
+ static void stop()
262
+ {
263
+ mutex::scoped_lock lck(m_mutex);
264
+ boost::system::error_code ec;
265
+ for (size_t i = 0; i < connections.size(); i++)
266
+ connections[i]->socket().close(ec);
267
+ }
246
268
  };
247
269
 
248
- std::vector<connection* > connection::connections;
270
+ std::vector<connection*> connection::connections;
249
271
  mutex connection::m_mutex;
250
272
 
251
273
  // ---------------------------------------------------------------------------
@@ -254,86 +276,93 @@ mutex connection::m_mutex;
254
276
 
255
277
  class listener
256
278
  {
257
- boost::shared_ptr<IAppModuleBuilder> m_app;
258
- boost::asio::ip::tcp::acceptor m_acceptor;
259
- boost::shared_ptr<connection> m_newConnection;
260
- server* m_srv;
279
+ boost::shared_ptr<IAppModuleBuilder> m_app;
280
+ boost::asio::ip::tcp::acceptor m_acceptor;
281
+ boost::shared_ptr<connection> m_newConnection;
282
+ server* m_srv;
283
+
261
284
  public:
262
- listener(server* srv,
263
- shared_ptr<IAppModuleBuilder> app, const std::string& address, const std::string& port)
264
- :m_srv(srv), m_app(app),m_acceptor(srv->ios()),m_newConnection(new connection(srv->ios()))
265
- {
266
- tcp::resolver resolver(srv->ios());
267
- tcp::resolver::query query(address, port, resolver_query_base::numeric_service);
268
- tcp::endpoint endpoint = *resolver.resolve(query);
269
-
270
- m_acceptor.open(endpoint.protocol());
271
- m_acceptor.set_option(tcp::acceptor::reuse_address(true));
272
- m_acceptor.bind(endpoint);
273
- m_acceptor.listen();
274
- m_acceptor.async_accept(m_newConnection->socket()
275
- , bind(&listener::handle_accept, this, placeholders::error));
276
- }
277
-
278
- void handle_accept(const boost::system::error_code& e)
279
- {
280
- if (!e)
281
- {
282
- const boost::asio::ip::tcp::no_delay nodelay(true);
283
- m_newConnection->socket().set_option(nodelay);
284
- boost::system::error_code ec;
285
- tcp::endpoint endpoint = m_newConnection->socket().remote_endpoint(ec);
286
- boost::shared_ptr<IAppModule> mod(m_app->createSessionModule(endpoint,m_newConnection.get(), SERVER_TYPE_TPOOL));
287
- m_newConnection->setModule(mod);
288
- if (mod->checkHost(m_srv->hostCheckName()))
289
- {
290
- m_newConnection->sendConnectAccept();
291
- m_newConnection->start();
292
- }
293
- m_newConnection.reset(new connection(m_srv->ios()));
294
- m_acceptor.async_accept(m_newConnection->socket(), boost::bind(&listener::handle_accept, this,
295
- boost::asio::placeholders::error));
296
- }
297
- }
298
-
299
- void cancel()
300
- {
301
- boost::system::error_code ec;
302
- m_acceptor.cancel(ec);
303
- }
285
+ listener(server* srv, shared_ptr<IAppModuleBuilder> app,
286
+ const std::string& address, const std::string& port)
287
+ : m_app(app), m_acceptor(srv->ios()),
288
+ m_newConnection(new connection(srv->ios())), m_srv(srv)
289
+ {
290
+ tcp::resolver resolver(srv->ios());
291
+ tcp::resolver::query query(address, port,
292
+ resolver_query_base::numeric_service);
293
+ tcp::endpoint endpoint = *resolver.resolve(query);
294
+
295
+ m_acceptor.open(endpoint.protocol());
296
+ m_acceptor.set_option(tcp::acceptor::reuse_address(true));
297
+ m_acceptor.bind(endpoint);
298
+ m_acceptor.listen();
299
+ m_acceptor.async_accept(
300
+ m_newConnection->socket(),
301
+ bind(&listener::handle_accept, this, placeholders::error));
302
+ }
303
+
304
+ void handle_accept(const boost::system::error_code& e)
305
+ {
306
+ if (!e)
307
+ {
308
+ const boost::asio::ip::tcp::no_delay nodelay(true);
309
+ m_newConnection->socket().set_option(nodelay);
310
+ boost::system::error_code ec;
311
+ tcp::endpoint endpoint =
312
+ m_newConnection->socket().remote_endpoint(ec);
313
+ boost::shared_ptr<IAppModule> mod(m_app->createSessionModule(
314
+ endpoint, m_newConnection.get(), SERVER_TYPE_TPOOL));
315
+ m_newConnection->setModule(mod);
316
+ if (mod->checkHost(m_srv->hostCheckName()))
317
+ {
318
+ m_newConnection->sendConnectAccept();
319
+ m_newConnection->start();
320
+ }
321
+ m_newConnection.reset(new connection(m_srv->ios()));
322
+ m_acceptor.async_accept(
323
+ m_newConnection->socket(),
324
+ boost::bind(&listener::handle_accept, this,
325
+ boost::asio::placeholders::error));
326
+ }
327
+ }
328
+
329
+ void cancel()
330
+ {
331
+ boost::system::error_code ec;
332
+ m_acceptor.cancel(ec);
333
+ }
304
334
  };
305
335
 
306
-
307
336
  // ---------------------------------------------------------------------------
308
337
  // server
309
338
  // ---------------------------------------------------------------------------
310
339
 
311
340
  static boost::shared_ptr<boost::thread> serverThread;
312
341
  unsigned int server::m_threadPoolSize;
313
- inotifyHandler* server::erh=NULL;
342
+ inotifyHandler* server::erh = NULL;
314
343
  server::server(unsigned int thread_pool_size, const char* hostCheckName)
315
- :m_timer(m_ios),m_hostCheckName(hostCheckName),m_stopping(0)
344
+ : m_timer(m_ios), m_hostCheckName(hostCheckName), m_stopping(0)
316
345
  {
317
- m_threadPoolSize = thread_pool_size;
318
-
346
+ m_threadPoolSize = thread_pool_size;
319
347
  }
320
348
 
321
349
  server::~server()
322
350
  {
323
- m_listeners.clear();
351
+ m_listeners.clear();
324
352
  }
325
353
 
326
- void server::addApplication(boost::shared_ptr<IAppModuleBuilder> app, const std::string& address
327
- , const std::string& port)
354
+ void server::addApplication(boost::shared_ptr<IAppModuleBuilder> app,
355
+ const std::string& address, const std::string& port)
328
356
  {
329
- m_listeners.push_back(boost::shared_ptr<listener>(new listener(this, app, address, port)));
357
+ m_listeners.push_back(
358
+ boost::shared_ptr<listener>(new listener(this, app, address, port)));
330
359
  }
331
360
 
332
361
  void server::startTimer()
333
362
  {
334
- m_timer.expires_from_now(posix_time::seconds(10));
335
- m_timer.async_wait(bind(&server::onCheckInternlShutdown, this, placeholders::error));
336
-
363
+ m_timer.expires_from_now(posix_time::seconds(10));
364
+ m_timer.async_wait(
365
+ bind(&server::onCheckInternlShutdown, this, placeholders::error));
337
366
  }
338
367
 
339
368
  /* check shutdown flags
@@ -341,76 +370,77 @@ void server::startTimer()
341
370
  */
342
371
  void server::onCheckInternlShutdown(const boost::system::error_code& e)
343
372
  {
344
- bool shutdown = false;
345
- {
346
- mutex::scoped_lock lck(modulesMutex);
347
- for (size_t i=0;i<modules.size();i++)
348
- {
349
- IAppModule* mod = modules[i];
350
- if (mod->isShutDown())
351
- {
352
- shutdown = true;
353
- break;
354
- }
355
- }
356
- }
357
- if (shutdown)
358
- stop();
359
- else
360
- startTimer();
373
+ bool shutdown = false;
374
+ {
375
+ mutex::scoped_lock lck(modulesMutex);
376
+ for (size_t i = 0; i < modules.size(); i++)
377
+ {
378
+ IAppModule* mod = modules[i];
379
+ if (mod->isShutDown())
380
+ {
381
+ shutdown = true;
382
+ break;
383
+ }
384
+ }
385
+ }
386
+ if (shutdown)
387
+ stop();
388
+ else
389
+ startTimer();
361
390
  }
362
391
 
363
392
  void start1(io_service* p)
364
393
  {
365
- try
366
- {
367
- p->run();
368
- }
369
- catch(...){};
394
+ try
395
+ {
396
+ p->run();
397
+ }
398
+ catch (...)
399
+ {
400
+ };
370
401
  }
371
402
 
372
- /** crete server thread and return immediately.
403
+ /** crete server thread and return immediately.
373
404
  */
374
405
  void server::start()
375
406
  {
376
- serverThread.reset(new boost::thread(bind(&server::run, this)));
407
+ serverThread.reset(new boost::thread(bind(&server::run, this)));
377
408
  }
378
409
 
379
410
  void server::run()
380
411
  {
381
- if (erh)
382
- erh->printInfo("Start Tpool server.");
383
- startTimer();
384
- std::vector<boost::shared_ptr<boost:: thread> >threads;
385
- thread::attributes attr;
386
- attr.set_stack_size( 125 * 1024);
387
- for (std::size_t i = 0; i < m_threadPoolSize; ++i)
388
- {
389
- thread *t = new thread(attr, bind(&start1, &m_ios));
390
- shared_ptr<thread> thread(t);
391
- threads.push_back(thread);
392
- }
393
- for (std::size_t i = 0; i < threads.size(); ++i)
394
- threads[i]->join();
395
-
412
+ if (erh)
413
+ erh->printInfo("Start Tpool server.");
414
+ startTimer();
415
+ std::vector<boost::shared_ptr<boost::thread> > threads;
416
+ thread::attributes attr;
417
+ attr.set_stack_size(125 * 1024);
418
+ for (std::size_t i = 0; i < m_threadPoolSize; ++i)
419
+ {
420
+ thread* t = new thread(attr, bind(&start1, &m_ios));
421
+ shared_ptr<thread> thread(t);
422
+ threads.push_back(thread);
423
+ }
424
+ for (std::size_t i = 0; i < threads.size(); ++i)
425
+ threads[i]->join();
396
426
  }
397
427
 
398
428
  void server::stop()
399
429
  {
400
- if (m_stopping) return;
401
- m_stopping = true;
402
- if (erh)
403
- erh->printInfo("Stopping Tpool server ...");
404
- for (size_t i = 0;i < m_listeners.size();i++)
405
- m_listeners[i]->cancel();
406
- connection::stop(); // Connection is not closed if io_service is stopped.
407
- m_ios.stop();
408
- serverThread->join();
409
- m_ios.reset();
410
-
430
+ if (m_stopping)
431
+ return;
432
+ m_stopping = true;
433
+ if (erh)
434
+ erh->printInfo("Stopping Tpool server ...");
435
+ for (size_t i = 0; i < m_listeners.size(); i++)
436
+ m_listeners[i]->cancel();
437
+ connection::stop(); // Connection is not closed if io_service is stopped.
438
+ m_ios.stop();
439
+ serverThread->join();
440
+ m_ios.reset();
411
441
  }
412
442
 
413
- }//namespace tpool
414
- }//namespace sever
415
- }//namespace netsvc
416
- }//namespace bzs
443
+ } // namespace tpool
444
+ } // namespace sever
445
+ } // namespace netsvc
446
+ } // namespace bzs