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
 
@@ -23,441 +23,450 @@
23
23
  #include <boost/shared_ptr.hpp>
24
24
  #include <boost/scoped_array.hpp>
25
25
  #include <boost/thread.hpp>
26
- #include <boost/asio/write.hpp>
26
+ #include <boost/asio/write.hpp>
27
27
  #include <boost/thread/xtime.hpp>
28
28
  #include <algorithm>
29
29
  #include <boost/enable_shared_from_this.hpp>
30
30
  #include "IAppModule.h"
31
31
  #include <bzs/rtl/exception.h>
32
32
 
33
-
34
-
35
33
  using namespace boost;
36
34
  using namespace boost::asio;
37
35
  using namespace boost::asio::ip;
38
36
 
39
-
40
-
41
- char* getWindowsErrMsg( DWORD ErrorCode)
37
+ char* getWindowsErrMsg(DWORD ErrorCode)
42
38
  {
43
- LPVOID lpMsgBuf;
44
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
45
- NULL, ErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
46
- (LPSTR) &lpMsgBuf, 0, NULL);
47
- return (char*)lpMsgBuf;
48
- }
39
+ LPVOID lpMsgBuf;
40
+ FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
41
+ NULL, ErrorCode,
42
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
43
+ (LPSTR)&lpMsgBuf, 0, NULL);
44
+ return (char*)lpMsgBuf;
45
+ }
49
46
 
50
47
  #define PIPE_EOF_ERROR_CODE boost::system::windows_error::broken_pipe
51
48
  #define BUFSIZE 0
52
49
 
53
-
54
- namespace bzs
50
+ namespace bzs
55
51
  {
56
- namespace netsvc
52
+ namespace netsvc
57
53
  {
58
- namespace server
54
+ namespace server
59
55
  {
60
56
  namespace pipe
61
57
  {
62
58
 
63
59
  void getSecurityAttribute(SECURITY_ATTRIBUTES& sa, SECURITY_DESCRIPTOR& sd)
64
60
  {
65
-
66
- InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
67
- SetSecurityDescriptorDacl(&sd,TRUE, NULL,FALSE);
68
- sa.nLength = sizeof(SECURITY_ATTRIBUTES);
69
- sa.bInheritHandle = TRUE;
70
- sa.lpSecurityDescriptor = &sd;
61
+
62
+ InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
63
+ SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);
64
+ sa.nLength = sizeof(SECURITY_ATTRIBUTES);
65
+ sa.bInheritHandle = TRUE;
66
+ sa.lpSecurityDescriptor = &sd;
71
67
  }
72
68
 
73
- acceptor::acceptor():m_fd(0),m_cancel(false)
69
+ acceptor::acceptor() : m_fd(0), m_cancel(false)
74
70
  {
75
-
76
71
  }
77
72
 
78
73
  void acceptor::open(const std::string& pipeName)
79
74
  {
80
- m_pipeName = pipeName;
75
+ m_pipeName = pipeName;
81
76
  }
82
77
 
83
78
  void acceptor::cancel()
84
79
  {
85
- m_cancel = true;
80
+ m_cancel = true;
86
81
  }
87
82
 
88
83
  void acceptor::accept(platform_stream& pipe)
89
84
  {
90
- m_fd=NULL;
91
- SECURITY_DESCRIPTOR sd;
92
- SECURITY_ATTRIBUTES sa;
93
- getSecurityAttribute(sa, sd);
94
-
95
- char pipeName[100];
96
- sprintf_s(pipeName, 100, "\\\\.\\pipe\\%s", m_pipeName.c_str());
97
- m_fd = CreateNamedPipe( pipeName, // pipe name
98
- PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED
99
- ,PIPE_TYPE_BYTE |PIPE_READMODE_BYTE |PIPE_WAIT
100
- ,PIPE_UNLIMITED_INSTANCES // max. instances
101
- ,BUFSIZE // output buffer size
102
- ,BUFSIZE // input buffer size
103
- ,0 // client time-out
104
- ,&sa); // default security attribute
105
- if (m_fd == INVALID_HANDLE_VALUE)
106
- THROW_BZS_ERROR_WITH_MSG(getWindowsErrMsg(GetLastError()));
107
- OVERLAPPED overlapped = {0};
108
- overlapped.hEvent = CreateEvent(0, TRUE, FALSE, 0);
109
- BOOL ret = ConnectNamedPipe(m_fd, &overlapped);
110
-
111
- //Connection may be completed by timing at this time.
112
- if ((ret==FALSE) && (GetLastError() == ERROR_PIPE_CONNECTED))
113
- {
114
- CloseHandle(overlapped.hEvent);
115
- pipe.assign(m_fd);
116
- return;
117
- }
118
- if ((ret != FALSE) || (GetLastError() != ERROR_IO_PENDING))
119
- {
120
- CloseHandle(overlapped.hEvent);
121
- CloseHandle(m_fd);
122
- THROW_BZS_ERROR_WITH_MSG("ConnectNamedPipe error");
123
- return ;
124
- }
125
-
126
- //A shutdown is supervised periodically.
127
- DWORD waitRes;
128
- while (1)
129
- {
130
- if (m_cancel)
131
- {
132
- CloseHandle(overlapped.hEvent);
133
- CloseHandle(m_fd);
134
- break;
135
- }
136
- waitRes = WaitForSingleObject(overlapped.hEvent, 5);
137
- if (waitRes == WAIT_OBJECT_0)
138
- {
139
- CloseHandle(overlapped.hEvent);
140
- pipe.assign(m_fd);
141
- break;
142
- }else if (waitRes == WAIT_TIMEOUT)
143
- ;
144
- else
145
- {
146
- CloseHandle(overlapped.hEvent);
147
- CloseHandle(m_fd);
148
- THROW_BZS_ERROR_WITH_MSG("WaitForSingleObject error");
149
- }
150
- }
85
+ m_fd = NULL;
86
+ SECURITY_DESCRIPTOR sd;
87
+ SECURITY_ATTRIBUTES sa;
88
+ getSecurityAttribute(sa, sd);
89
+
90
+ char pipeName[100];
91
+ sprintf_s(pipeName, 100, "\\\\.\\pipe\\%s", m_pipeName.c_str());
92
+ m_fd = CreateNamedPipe(pipeName, // pipe name
93
+ PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
94
+ PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
95
+ PIPE_UNLIMITED_INSTANCES // max. instances
96
+ ,
97
+ BUFSIZE // output buffer size
98
+ ,
99
+ BUFSIZE // input buffer size
100
+ ,
101
+ 0 // client time-out
102
+ ,
103
+ &sa); // default security attribute
104
+ if (m_fd == INVALID_HANDLE_VALUE)
105
+ THROW_BZS_ERROR_WITH_MSG(getWindowsErrMsg(GetLastError()));
106
+ OVERLAPPED overlapped = { 0 };
107
+ overlapped.hEvent = CreateEvent(0, TRUE, FALSE, 0);
108
+ BOOL ret = ConnectNamedPipe(m_fd, &overlapped);
109
+
110
+ // Connection may be completed by timing at this time.
111
+ if ((ret == FALSE) && (GetLastError() == ERROR_PIPE_CONNECTED))
112
+ {
113
+ CloseHandle(overlapped.hEvent);
114
+ pipe.assign(m_fd);
115
+ return;
116
+ }
117
+ if ((ret != FALSE) || (GetLastError() != ERROR_IO_PENDING))
118
+ {
119
+ CloseHandle(overlapped.hEvent);
120
+ CloseHandle(m_fd);
121
+ THROW_BZS_ERROR_WITH_MSG("ConnectNamedPipe error");
122
+ return;
123
+ }
124
+
125
+ // A shutdown is supervised periodically.
126
+ DWORD waitRes;
127
+ while (1)
128
+ {
129
+ if (m_cancel)
130
+ {
131
+ CloseHandle(overlapped.hEvent);
132
+ CloseHandle(m_fd);
133
+ break;
134
+ }
135
+ waitRes = WaitForSingleObject(overlapped.hEvent, 5);
136
+ if (waitRes == WAIT_OBJECT_0)
137
+ {
138
+ CloseHandle(overlapped.hEvent);
139
+ pipe.assign(m_fd);
140
+ break;
141
+ }
142
+ else if (waitRes == WAIT_TIMEOUT)
143
+ ;
144
+ else
145
+ {
146
+ CloseHandle(overlapped.hEvent);
147
+ CloseHandle(m_fd);
148
+ THROW_BZS_ERROR_WITH_MSG("WaitForSingleObject error");
149
+ }
150
+ }
151
151
  }
152
152
 
153
- unsigned int g_connections=0;
154
- unsigned int g_waitThread=0;
155
-
153
+ unsigned int g_connections = 0;
154
+ unsigned int g_waitThread = 0;
156
155
 
157
156
  // ---------------------------------------------------------------------------
158
157
  // connection
159
158
  // ---------------------------------------------------------------------------
160
159
 
161
-
162
-
163
160
  class IExitCheckHandler
164
161
  {
165
162
  public:
166
- virtual ~IExitCheckHandler(){};
167
- virtual bool isExit()=0;
163
+ virtual ~IExitCheckHandler(){};
164
+ virtual bool isExit() = 0;
168
165
  };
169
166
 
170
-
171
167
  class exitCheckHnadler : public IExitCheckHandler
172
168
  {
173
- HANDLE m_thread;
174
- bool m_cancel;
175
- IAppModule* m_module;
176
- public:
169
+ HANDLE m_procHandle;
170
+ bool m_cancel;
171
+ IAppModule* m_module;
177
172
 
178
- exitCheckHnadler(DWORD tid):m_cancel(false),m_module(NULL)
179
- {
180
- m_thread = OpenThread(THREAD_QUERY_LIMITED_INFORMATION /*THREAD_QUERY_INFORMATION*/, FALSE, tid);
181
- /*if (!m_thread)
182
- {
183
- char buf[1024];
184
- wsprintf(buf, "OpenThread error :id = %d %s", tid, getWindowsErrMsg(GetLastError()));
185
- THROW_BZS_ERROR_WITH_MSG(buf);
186
- }*/
187
- }
188
-
189
- ~exitCheckHnadler()
190
- {
191
- if (m_thread)
192
- CloseHandle(m_thread);
193
- }
194
-
195
- void setModule(IAppModule* p)
196
- {
197
- m_module = p;
198
- }
199
-
200
- bool isExit()
201
- {
202
- if (m_cancel)return true;
203
- DWORD ExitCode;
204
- if (m_thread && GetExitCodeThread(m_thread, &ExitCode))
205
- if (STILL_ACTIVE!=ExitCode) return true;
206
- if (m_module && m_module->isShutDown())
207
- return true;
208
- return false;
209
- }
210
-
211
- void setCancel(bool value){m_cancel=value;};
212
- bool cancel(){return m_cancel;}
173
+ public:
174
+ exitCheckHnadler(DWORD procId) : m_cancel(false), m_module(NULL)
175
+ {
176
+ m_procHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, procId);
177
+ }
178
+
179
+ ~exitCheckHnadler()
180
+ {
181
+ if (m_procHandle)
182
+ CloseHandle(m_procHandle);
183
+ }
184
+
185
+ void setModule(IAppModule* p) { m_module = p; }
186
+
187
+ bool isExit()
188
+ {
189
+ if (m_cancel)
190
+ return true;
191
+ DWORD ExitCode;
192
+ if (m_procHandle && GetExitCodeProcess(m_procHandle, &ExitCode))
193
+
194
+ if (STILL_ACTIVE != ExitCode)
195
+ return true;
196
+ if (m_module && m_module->isShutDown())
197
+ return true;
198
+ return false;
199
+ }
200
+
201
+ void setCancel(bool value) { m_cancel = value; };
202
+ bool cancel() { return m_cancel; }
213
203
  };
214
204
 
215
205
  class winEventComm
216
206
  {
217
- HANDLE m_recv;
218
- HANDLE m_send;
219
- bool m_sent;
220
- bool m_cancel;
221
- public:
207
+ HANDLE m_recv;
208
+ HANDLE m_send;
209
+ bool m_sent;
210
+ bool m_cancel;
222
211
 
223
- winEventComm(const char* rcvName, const char* sndName):m_cancel(false)
224
- {
225
- SECURITY_DESCRIPTOR sd;
226
- SECURITY_ATTRIBUTES sa;
227
- getSecurityAttribute(sa, sd);
228
- m_recv = CreateEvent(&sa, FALSE, FALSE, rcvName);
229
- if (!m_recv)
230
- THROW_BZS_ERROR_WITH_MSG(getWindowsErrMsg(GetLastError()));
231
- m_send = CreateEvent(&sa, FALSE, FALSE, sndName);
232
- if (!m_send)
233
- THROW_BZS_ERROR_WITH_MSG(getWindowsErrMsg(GetLastError()));
234
- }
235
-
236
- ~winEventComm()
237
- {
238
- if (!m_sent)SetEvent(m_send);
239
- if (m_recv)CloseHandle(m_recv);
240
- if (m_send)CloseHandle(m_send);
241
- }
242
-
243
- bool recv(int checkTimeSpan, IExitCheckHandler* handler)
244
- {
245
- DWORD wait;
246
- do{
247
- if (m_cancel || (handler && (handler->isExit())))
248
- return 0;
249
- }while(WAIT_OBJECT_0 != (wait = WaitForSingleObject(m_recv, checkTimeSpan)));
250
- m_sent = false;
251
- return true;
252
- }
253
-
254
- bool send()
255
- {
256
- if (SetEvent(m_send)==0)
257
- return false;
258
-
259
- m_sent = true;
260
- return true;
261
- }
262
-
263
- void chancel(){m_cancel = true;}
212
+ public:
213
+ winEventComm(const char* rcvName, const char* sndName) : m_cancel(false)
214
+ {
215
+ SECURITY_DESCRIPTOR sd;
216
+ SECURITY_ATTRIBUTES sa;
217
+ getSecurityAttribute(sa, sd);
218
+ m_recv = CreateEvent(&sa, FALSE, FALSE, rcvName);
219
+ if (!m_recv)
220
+ THROW_BZS_ERROR_WITH_MSG(getWindowsErrMsg(GetLastError()));
221
+ m_send = CreateEvent(&sa, FALSE, FALSE, sndName);
222
+ if (!m_send)
223
+ THROW_BZS_ERROR_WITH_MSG(getWindowsErrMsg(GetLastError()));
224
+ }
225
+
226
+ ~winEventComm()
227
+ {
228
+ if (!m_sent)
229
+ SetEvent(m_send);
230
+ if (m_recv)
231
+ CloseHandle(m_recv);
232
+ if (m_send)
233
+ CloseHandle(m_send);
234
+ }
235
+
236
+ bool recv(int checkTimeSpan, IExitCheckHandler* handler)
237
+ {
238
+ DWORD wait;
239
+ do
240
+ {
241
+ if (m_cancel || (handler && (handler->isExit())))
242
+ return 0;
243
+ } while (WAIT_OBJECT_0 !=
244
+ (wait = WaitForSingleObject(m_recv, checkTimeSpan)));
245
+ m_sent = false;
246
+ return true;
247
+ }
248
+
249
+ bool send()
250
+ {
251
+ if (SetEvent(m_send) == 0)
252
+ return false;
253
+
254
+ m_sent = true;
255
+ return true;
256
+ }
257
+
258
+ void chancel() { m_cancel = true; }
264
259
  };
265
260
 
266
261
  class sharedMem
267
262
  {
268
- HANDLE m_mapFile;
269
-
270
- char* m_readPtr;
271
- char* m_writePtr;
263
+ HANDLE m_mapFile;
264
+
265
+ char* m_readPtr;
266
+ char* m_writePtr;
267
+ DWORD m_size;
268
+
272
269
  public:
270
+ sharedMem(const char* name, unsigned int memsize)
271
+ {
272
+ SECURITY_DESCRIPTOR sd;
273
+ SECURITY_ATTRIBUTES sa;
274
+ getSecurityAttribute(sa, sd);
275
+
276
+ SYSTEM_INFO SystemInfo;
277
+ GetSystemInfo(&SystemInfo);
278
+ m_size = memsize / SystemInfo.dwAllocationGranularity + 1;
279
+ m_size = m_size * SystemInfo.dwAllocationGranularity;
280
+
281
+ m_mapFile = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE,
282
+ 0, m_size * 2, name);
283
+ if (m_mapFile == NULL)
284
+ THROW_BZS_ERROR_WITH_MSG("CreateFileMapping error");
285
+
286
+ m_readPtr =
287
+ (char*)MapViewOfFile(m_mapFile, FILE_MAP_ALL_ACCESS, 0, 0, m_size);
288
+ if (m_readPtr == NULL)
289
+ THROW_BZS_ERROR_WITH_MSG("MapViewOfFile R error");
290
+ m_writePtr = (char*)MapViewOfFile(m_mapFile, FILE_MAP_ALL_ACCESS, 0,
291
+ m_size, m_size);
292
+ if (m_writePtr == NULL)
293
+ THROW_BZS_ERROR_WITH_MSG("MapViewOfFile W error");
294
+ }
295
+
296
+ ~sharedMem()
297
+ {
298
+ if (m_mapFile)
299
+ {
300
+ UnmapViewOfFile(m_readPtr);
301
+ UnmapViewOfFile(m_writePtr);
302
+ CloseHandle(m_mapFile);
303
+ }
304
+ }
305
+ size_t size() const { return (size_t)m_size; }
306
+
307
+ char* readBuffer() { return m_readPtr; }
308
+
309
+ char* writeBuffer() { return m_writePtr; }
310
+ };
311
+
312
+ class sharedMemBuffer : public IResultBuffer
313
+ {
314
+ sharedMem& m_buf;
273
315
 
274
- sharedMem(const char* name, unsigned int memsize)
275
- {
276
- SECURITY_DESCRIPTOR sd;
277
- SECURITY_ATTRIBUTES sa;
278
- getSecurityAttribute(sa, sd);
279
-
280
- SYSTEM_INFO SystemInfo;
281
- GetSystemInfo(&SystemInfo);
282
- int size = memsize/SystemInfo.dwAllocationGranularity + 1;
283
- size = size*SystemInfo.dwAllocationGranularity;
284
-
285
-
286
- m_mapFile = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, size*2, name);
287
- if (m_mapFile == NULL)
288
- THROW_BZS_ERROR_WITH_MSG("CreateFileMapping error");
289
-
290
- m_readPtr = (char*)MapViewOfFile(m_mapFile, FILE_MAP_ALL_ACCESS, 0, 0, size);
291
- if (m_readPtr == NULL)
292
- THROW_BZS_ERROR_WITH_MSG("MapViewOfFile R error");
293
- m_writePtr = (char*)MapViewOfFile(m_mapFile, FILE_MAP_ALL_ACCESS, 0, size, size);
294
- if (m_writePtr == NULL)
295
- THROW_BZS_ERROR_WITH_MSG("MapViewOfFile W error");
296
- }
297
-
298
- ~sharedMem()
299
- {
300
- if (m_mapFile)
301
- {
302
- UnmapViewOfFile(m_readPtr) ;
303
- UnmapViewOfFile(m_writePtr) ;
304
- CloseHandle(m_mapFile);
305
- }
306
- }
307
-
308
- char* readBuffer()
309
- {
310
- return m_readPtr;
311
- }
312
-
313
- char* writeBuffer()
314
- {
315
- return m_writePtr;
316
- }
316
+ public:
317
+ sharedMemBuffer(sharedMem& v) : m_buf(v) {}
318
+ void resize(size_t v) {}
319
+ size_t size() const { return m_buf.size(); }
320
+ char* ptr() { return m_buf.writeBuffer(); }
317
321
  };
318
322
 
319
- class connection : public iconnection, private noncopyable
323
+ class connection : public iconnection, private noncopyable
320
324
  {
321
- mutable io_service m_ios;
322
- static mutex m_mutex;
323
- platform_stream m_socket;
324
-
325
- shared_ptr<winEventComm> m_comm;
326
- shared_ptr<exitCheckHnadler> m_exitHandler;
327
- shared_ptr<sharedMem> m_sharedMem;
328
- shared_ptr<IAppModule> m_module;
329
- size_t m_readLen;
330
-
331
- void run()
332
- {
333
- bool sentResult = true;
334
- while (sentResult)
335
- {
336
- if (m_comm->recv(3000, m_exitHandler.get())==false)
337
- return;
338
- bool complete = false;
339
- m_readLen = *((unsigned int*)m_sharedMem->readBuffer());
340
- if (m_readLen==0)
341
- return;
342
- m_module->onRead(m_sharedMem->readBuffer(), m_readLen, complete);
343
- if (complete)
344
- {
345
- size_t size=0;
346
- if (m_module->execute(m_sharedMem->writeBuffer(), size, NULL) == EXECUTE_RESULT_QUIT)
347
- return ;
348
- else
349
- m_readLen = 0;
350
-
351
- sentResult = m_comm->send();
352
- m_module->cleanup();
353
- }
354
- }
355
- }
356
-
357
- char* getUniqName(DWORD id,__int64 clientid, const char* name, char* buf, int size)
358
- {
359
- sprintf_s(buf, size, "%s_%lu_%Lu", name, id, clientid);
360
- return buf;
361
- }
362
-
325
+ mutable io_service m_ios;
326
+ static mutex m_mutex;
327
+ platform_stream m_socket;
328
+
329
+ shared_ptr<winEventComm> m_comm;
330
+ shared_ptr<exitCheckHnadler> m_exitHandler;
331
+ shared_ptr<sharedMem> m_sharedMem;
332
+ shared_ptr<IAppModule> m_module;
333
+ size_t m_readLen;
334
+
335
+ void run()
336
+ {
337
+ bool sentResult = true;
338
+ while (sentResult)
339
+ {
340
+ if (m_comm->recv(3000, m_exitHandler.get()) == false)
341
+ return;
342
+ bool complete = false;
343
+ m_readLen = *((unsigned int*)m_sharedMem->readBuffer());
344
+ if (m_readLen == 0)
345
+ return;
346
+ m_module->onRead(m_sharedMem->readBuffer(), m_readLen, complete);
347
+ if (complete)
348
+ {
349
+ size_t size = 0;
350
+ if (m_module->execute(sharedMemBuffer(*m_sharedMem), size,
351
+ NULL) == EXECUTE_RESULT_QUIT)
352
+ return;
353
+ else
354
+ m_readLen = 0;
355
+
356
+ sentResult = m_comm->send();
357
+ m_module->cleanup();
358
+ }
359
+ }
360
+ }
361
+
362
+ char* getUniqName(DWORD id, __int64 processid, const char* name, char* buf,
363
+ int size)
364
+ {
365
+ sprintf_s(buf, size, "%s_%lu_%Lu", name, id, processid);
366
+ return buf;
367
+ }
368
+
363
369
  public:
364
- static std::string m_pipeName;
365
- static unsigned int m_shareMemSize;
366
- connection(): m_socket(m_ios),m_readLen(0)
367
- {
368
- mutex::scoped_lock lck(m_mutex);
369
- connections.push_back(this);
370
- ++g_connections;
371
- }
372
-
373
- ~connection()
374
- {
375
- if (connections.size())
376
- {
377
- mutex::scoped_lock lck(m_mutex);
378
- std::vector<connection*>::iterator it = find(connections.begin(), connections.end(), this);
379
- if (it != connections.end())
380
- {
381
- connections.erase( it);
382
- --g_connections;
383
- }
384
- }
385
- m_exitHandler.reset();
386
- }
387
-
388
- void close()
389
- {
390
- m_comm->chancel();
391
- }
392
-
393
- io_service& ios()const{return m_ios;};
394
-
395
- platform_stream& socket(){return m_socket;}
396
-
397
- void setModule(shared_ptr<IAppModule> p)
398
- {
399
- m_module = p;
400
- if (m_exitHandler)
401
- m_exitHandler->setModule(p.get());
402
- }
403
-
404
- void start()
405
- {
406
- m_ios.reset();
407
-
408
- char buf[128];
409
- char buf2[50];
410
- char tmp[50];
411
- char tmp2[50];
412
- system::error_code e;
413
- std::size_t len = asio::read(m_socket, buffer(buf, 16), e);
414
- if (len!=16)
415
- THROW_BZS_ERROR_WITH_MSG("readThredID error");
416
-
417
- DWORD clinetThreadID= *((DWORD*)(buf+4));
418
- __int64 clientid = *((__int64*)(buf+8));
419
- sprintf_s(tmp, 50, "Global\\%s", m_pipeName.c_str());
420
- m_sharedMem.reset(new sharedMem(getUniqName(clinetThreadID, clientid, tmp , buf, 128), m_shareMemSize));
421
- sprintf_s(tmp, 50, "Global\\%sToSrv", m_pipeName.c_str());
422
- sprintf_s(tmp2, 50, "Global\\%sToClnt", m_pipeName.c_str());
423
- m_comm.reset(new winEventComm(getUniqName(clinetThreadID, clientid, tmp, buf, 128)
424
- , getUniqName(clinetThreadID, clientid, tmp2, buf2, 50)));
425
- m_exitHandler.reset(new exitCheckHnadler(clinetThreadID));
426
- if (m_module)
427
- m_exitHandler->setModule(m_module.get());
428
- m_module->onAccept(tmp, 50);
429
-
430
- strcpy(tmp, "OK");
431
- memcpy(tmp+3, &m_shareMemSize, 4);
432
- asio::write(m_socket, buffer(tmp, 7), e);
433
- run();
434
-
435
- }
436
-
437
- void cancel()
438
- {
439
- if (m_exitHandler)
440
- m_exitHandler->setCancel(true);
441
- ios().stop();
442
- socket().cancel();
443
- }
444
-
445
- static std::vector<connection* > connections;
446
-
447
- static void stop()
448
- {
449
- mutex::scoped_lock lck(m_mutex);
450
- try
451
- {
452
- for (size_t i=0;i<connections.size();i++)
453
- connections[i]->cancel();
454
- }
455
- catch(system::system_error &){};
456
- }
457
-
370
+ static std::string m_pipeName;
371
+ static unsigned int m_shareMemSize;
372
+ connection() : m_socket(m_ios), m_readLen(0)
373
+ {
374
+ mutex::scoped_lock lck(m_mutex);
375
+ connections.push_back(this);
376
+ ++g_connections;
377
+ }
378
+
379
+ ~connection()
380
+ {
381
+ if (connections.size())
382
+ {
383
+ mutex::scoped_lock lck(m_mutex);
384
+ std::vector<connection*>::iterator it =
385
+ find(connections.begin(), connections.end(), this);
386
+ if (it != connections.end())
387
+ {
388
+ connections.erase(it);
389
+ --g_connections;
390
+ }
391
+ }
392
+ m_exitHandler.reset();
393
+ }
394
+
395
+ void close() { m_comm->chancel(); }
396
+
397
+ void asyncWrite(const char* p, unsigned int size) {}
398
+
399
+ io_service& ios() const { return m_ios; };
400
+
401
+ platform_stream& socket() { return m_socket; }
402
+
403
+ void setModule(shared_ptr<IAppModule> p)
404
+ {
405
+ m_module = p;
406
+ if (m_exitHandler)
407
+ m_exitHandler->setModule(p.get());
408
+ }
409
+
410
+ void start()
411
+ {
412
+ m_ios.reset();
413
+
414
+ char buf[128];
415
+ char buf2[50];
416
+ char tmp[50];
417
+ char tmp2[50];
418
+ system::error_code e;
419
+ std::size_t len = asio::read(m_socket, buffer(buf, 16), e);
420
+ if (len != 16)
421
+ THROW_BZS_ERROR_WITH_MSG("readThredID error");
422
+
423
+ DWORD clinetProcessID = *((DWORD*)(buf + 4));
424
+ __int64 clientid = *((__int64*)(buf + 8));
425
+ sprintf_s(tmp, 50, "Global\\%s", m_pipeName.c_str());
426
+ m_sharedMem.reset(
427
+ new sharedMem(getUniqName(clinetProcessID, clientid, tmp, buf, 128),
428
+ m_shareMemSize));
429
+ sprintf_s(tmp, 50, "Global\\%sToSrv", m_pipeName.c_str());
430
+ sprintf_s(tmp2, 50, "Global\\%sToClnt", m_pipeName.c_str());
431
+ m_comm.reset(new winEventComm(
432
+ getUniqName(clinetProcessID, clientid, tmp, buf, 128),
433
+ getUniqName(clinetProcessID, clientid, tmp2, buf2, 50)));
434
+ m_exitHandler.reset(new exitCheckHnadler(clinetProcessID));
435
+ if (m_module)
436
+ m_exitHandler->setModule(m_module.get());
437
+ m_module->onAccept(tmp, 50);
438
+
439
+ strcpy(tmp, "OK");
440
+ memcpy(tmp + 3, &m_shareMemSize, 4);
441
+ asio::write(m_socket, buffer(tmp, 7), e);
442
+ run();
443
+ }
444
+
445
+ void cancel()
446
+ {
447
+ if (m_exitHandler)
448
+ m_exitHandler->setCancel(true);
449
+ ios().stop();
450
+ socket().cancel();
451
+ }
452
+
453
+ static std::vector<connection*> connections;
454
+
455
+ static void stop()
456
+ {
457
+ mutex::scoped_lock lck(m_mutex);
458
+ try
459
+ {
460
+ for (size_t i = 0; i < connections.size(); i++)
461
+ connections[i]->cancel();
462
+ }
463
+ catch (system::system_error&)
464
+ {
465
+ };
466
+ }
458
467
  };
459
468
 
460
- std::vector<connection* > connection::connections;
469
+ std::vector<connection*> connection::connections;
461
470
  mutex connection::m_mutex;
462
471
  std::string connection::m_pipeName;
463
472
  unsigned int connection::m_shareMemSize;
@@ -466,240 +475,246 @@ unsigned int connection::m_shareMemSize;
466
475
  // worker
467
476
  // ---------------------------------------------------------------------------
468
477
 
469
- class worker : private noncopyable
478
+ class worker : private noncopyable
470
479
  {
471
480
 
472
- static mutex m_mutex;
473
- static std::vector< shared_ptr<thread> > m_threads;
474
- static std::vector<worker*> m_workers; //used by Muliti thread.
475
- static worker* worker::findWaitThread()
476
- {
477
- mutex::scoped_lock lck(m_mutex);
478
- for (size_t i=0;i<m_workers.size();i++)
479
- if (m_workers[i]->m_connection==NULL)
480
- return m_workers[i];
481
- return NULL;
482
- }
483
-
484
- shared_ptr<connection> m_connection;
485
-
486
- bool resume(){return shutdown || m_connection;}
487
-
488
- ~worker()
489
- {
490
- mutex::scoped_lock lck(m_mutex);
491
- m_workers.erase( find(m_workers.begin(), m_workers.end(), this));
492
- }
493
-
494
- public:
495
- static bool shutdown;
496
- static const char* hostCheckName;
497
- static boost::condition_variable condition;
498
- static void worker::registThread(shared_ptr<thread> t)
499
- {
500
- mutex::scoped_lock lck(m_mutex);
501
- m_threads.push_back(t);
502
- }
503
-
504
- static void worker::join()
505
- {
506
- for (size_t i=0;i<m_threads.size();i++)
507
- m_threads[i]->join();
508
- m_threads.erase(m_threads.begin(), m_threads.end());
509
- }
510
-
511
- /** In search of an empty worker thread,
512
- * if there is nothing, it will create, perform and return.
513
- */
514
- static worker* worker::get(const IAppModuleBuilder* app)
515
- {
516
-
517
- worker* p = findWaitThread();
518
- if (p==NULL)
519
- {
520
- thread::attributes attr;
521
- attr.set_stack_size( 125 * 1024);
522
- p = new worker();
523
- shared_ptr<thread> t(new thread(attr, bind(&worker::run, p, app)));
524
- registThread(t);
525
- }
526
- return p;
527
- }
528
-
529
- /**
530
- * Call from accepter thread.
531
- */
532
- worker()
533
- {
534
- mutex::scoped_lock lck(m_mutex);
535
- m_workers.push_back(this);
536
- }
537
-
538
- void worker::setConnection(shared_ptr<connection> conn)
539
- {
540
- m_connection = conn;
541
- }
542
-
543
- void run(const IAppModuleBuilder* app)
544
- {
545
- try
546
- {
547
- while (!shutdown)
548
- {
549
- if (m_connection)
550
- {
551
- system::error_code ec;
552
- tcp::endpoint endpoint;
553
- endpoint.address(address(address_v4::from_string("127.0.0.1")));
554
- shared_ptr<IAppModule> mod(((IAppModuleBuilder*)app)->createSessionModule(endpoint, m_connection.get(), SERVER_TYPE_CPT));
555
- m_connection->setModule(mod);
556
- if (mod->checkHost(hostCheckName))
557
- m_connection->start(); //It does not return, unless a connection is close.
558
- m_connection.reset();
559
- }
560
-
561
- //TODO A used thread -- it is all held.
562
- //The number of maintenance is decided and it is made not to hold any more.
563
- mutex::scoped_lock lck(m_mutex);
564
- ++g_waitThread;
565
- condition.wait(lck, bind(&worker::resume, this));
566
- --g_waitThread;
567
-
568
- }
569
- }
570
- catch(bzs::rtl::exception &e)
571
- {
572
- if (server::erh)
573
- {
574
- if(const std::string *msg = getMsg(e))
575
- {
576
- std::string s = "Pipe server " + *msg;
577
- server::erh->printError(s.c_str());
578
- }else
579
- server::erh->printError(boost::diagnostic_information(e).c_str());
580
- }
581
- }
582
-
583
- catch(...)
584
- {
585
- if (server::erh)
586
- server::erh->printError("pipe server Unknown");
587
- }
588
- //An end of this thread will delete self.
589
- delete this;
590
- }
481
+ static mutex m_mutex;
482
+ static std::vector<shared_ptr<thread> > m_threads;
483
+ static std::vector<worker*> m_workers; // used by Muliti thread.
484
+ static worker* worker::findWaitThread()
485
+ {
486
+ mutex::scoped_lock lck(m_mutex);
487
+ for (size_t i = 0; i < m_workers.size(); i++)
488
+ if (m_workers[i]->m_connection == NULL)
489
+ return m_workers[i];
490
+ return NULL;
491
+ }
591
492
 
493
+ shared_ptr<connection> m_connection;
494
+
495
+ bool resume() { return shutdown || m_connection; }
496
+
497
+ ~worker()
498
+ {
499
+ mutex::scoped_lock lck(m_mutex);
500
+ m_workers.erase(find(m_workers.begin(), m_workers.end(), this));
501
+ }
502
+
503
+ public:
504
+ static bool shutdown;
505
+ static const char* hostCheckName;
506
+ static boost::condition_variable condition;
507
+ static void worker::registThread(shared_ptr<thread> t)
508
+ {
509
+ mutex::scoped_lock lck(m_mutex);
510
+ m_threads.push_back(t);
511
+ }
512
+
513
+ static void worker::join()
514
+ {
515
+ for (size_t i = 0; i < m_threads.size(); i++)
516
+ m_threads[i]->join();
517
+ m_threads.erase(m_threads.begin(), m_threads.end());
518
+ }
519
+
520
+ /** In search of an empty worker thread,
521
+ * if there is nothing, it will create, perform and return.
522
+ */
523
+ static worker* worker::get(const IAppModuleBuilder* app)
524
+ {
525
+
526
+ worker* p = findWaitThread();
527
+ if (p == NULL)
528
+ {
529
+ thread::attributes attr;
530
+ attr.set_stack_size(125 * 1024);
531
+ p = new worker();
532
+ shared_ptr<thread> t(new thread(attr, bind(&worker::run, p, app)));
533
+ registThread(t);
534
+ }
535
+ return p;
536
+ }
537
+
538
+ /**
539
+ * Call from accepter thread.
540
+ */
541
+ worker()
542
+ {
543
+ mutex::scoped_lock lck(m_mutex);
544
+ m_workers.push_back(this);
545
+ }
546
+
547
+ void worker::setConnection(shared_ptr<connection> conn)
548
+ {
549
+ m_connection = conn;
550
+ }
551
+
552
+ void run(const IAppModuleBuilder* app)
553
+ {
554
+ try
555
+ {
556
+ while (!shutdown)
557
+ {
558
+ if (m_connection)
559
+ {
560
+ system::error_code ec;
561
+ tcp::endpoint endpoint;
562
+ endpoint.address(
563
+ address(address_v4::from_string("127.0.0.1")));
564
+ shared_ptr<IAppModule> mod(
565
+ ((IAppModuleBuilder*)app)->createSessionModule(
566
+ endpoint, m_connection.get(), SERVER_TYPE_CPT));
567
+ m_connection->setModule(mod);
568
+ if (mod->checkHost(hostCheckName))
569
+ m_connection->start(); // It does not return, unless a
570
+ // connection is close.
571
+ m_connection.reset();
572
+ }
573
+
574
+ // TODO A used thread -- it is all held.
575
+ // The number of maintenance is decided and it is made not to
576
+ // hold any more.
577
+ mutex::scoped_lock lck(m_mutex);
578
+ ++g_waitThread;
579
+ condition.wait(lck, bind(&worker::resume, this));
580
+ --g_waitThread;
581
+ }
582
+ }
583
+ catch (bzs::rtl::exception& e)
584
+ {
585
+ if (server::erh)
586
+ {
587
+ if (const std::string* msg = getMsg(e))
588
+ {
589
+ std::string s = "Pipe server " + *msg;
590
+ server::erh->printError(s.c_str());
591
+ }
592
+ else
593
+ server::erh->printError(
594
+ boost::diagnostic_information(e).c_str());
595
+ }
596
+ }
597
+
598
+ catch (...)
599
+ {
600
+ if (server::erh)
601
+ server::erh->printError("pipe server Unknown");
602
+ }
603
+ // An end of this thread will delete self.
604
+ delete this;
605
+ }
592
606
  };
593
607
  bool worker::shutdown = false;
594
608
  const char* worker::hostCheckName;
595
609
  condition_variable worker::condition;
596
- mutex worker::m_mutex;
597
- std::vector< shared_ptr<thread> > worker::m_threads;
598
- std::vector<worker*> worker::m_workers;
599
-
610
+ mutex worker::m_mutex;
611
+ std::vector<shared_ptr<thread> > worker::m_threads;
612
+ std::vector<worker*> worker::m_workers;
600
613
 
601
614
  // ---------------------------------------------------------------------------
602
615
  // server
603
616
  // ---------------------------------------------------------------------------
604
- inotifyHandler* server::erh=NULL;
617
+ inotifyHandler* server::erh = NULL;
605
618
 
606
619
  /** server
607
- * If it starts, a server will create the exclusive thread for accpter
608
- * and will go into an infinite loop.
620
+ * If it starts, a server will create the exclusive thread for accpter
621
+ * and will go into an infinite loop.
609
622
  */
610
- server::server(shared_ptr<IAppModuleBuilder> app, const std::string& name
611
- , std::size_t max_connections, unsigned int shareMemSize,const char* hostCheckName)
612
- : m_app(app), m_maxConnections(max_connections),m_stopped(false)
613
-
623
+ server::server(shared_ptr<IAppModuleBuilder> app, const std::string& name,
624
+ std::size_t max_connections, unsigned int shareMemSize,
625
+ const char* hostCheckName)
626
+ : m_app(app), m_maxConnections(max_connections), m_stopped(false)
627
+
614
628
  {
615
- worker::hostCheckName = hostCheckName;
616
- m_newConnection.reset(new connection());
617
- connection::m_pipeName = name;
618
- connection::m_shareMemSize = shareMemSize;
619
- m_acceptor.open(name);
629
+ worker::hostCheckName = hostCheckName;
630
+ m_newConnection.reset(new connection());
631
+ connection::m_pipeName = name;
632
+ connection::m_shareMemSize = shareMemSize;
633
+ m_acceptor.open(name);
620
634
  }
621
635
 
622
636
  /** Start the server
623
637
  */
624
638
  void server::start()
625
639
  {
626
- shared_ptr<thread> t(new thread(bind(&server::run, this)));
627
- worker::registThread(t);
628
-
640
+ shared_ptr<thread> t(new thread(bind(&server::run, this)));
641
+ worker::registThread(t);
629
642
  }
630
643
 
631
644
  void server::run()
632
645
  {
633
- try
634
- {
635
- if (erh)
636
- erh->printInfo("Start Pipe server.");
637
- while (1)
638
- {
639
- if (m_stopped) return;
640
- while (connection::connections.size()>m_maxConnections)
641
- {
642
- Sleep(100);
643
- if (m_stopped)
644
- return;
645
- }
646
- //Time to await slight time and no pipe be exists.
647
- //A client is trying connection several times.
648
- m_acceptor.accept(m_newConnection->socket());
649
- if (m_stopped) return;
650
- system::error_code e;
651
- onAccept(e);
652
- }
653
- }
654
- catch(bzs::rtl::exception &e)
655
- {
656
- if (erh)
657
- {
658
- if(const std::string *msg = getMsg(e))
659
- {
660
- std::string s = "Pipe server accept " + *msg;
661
- erh->printError(s.c_str());
662
- }else
663
- erh->printError(boost::diagnostic_information(e).c_str());
664
- }
665
- stop();
666
- }
646
+ try
647
+ {
648
+ if (erh)
649
+ erh->printInfo("Start Pipe server.");
650
+ while (1)
651
+ {
652
+ if (m_stopped)
653
+ return;
654
+ while (connection::connections.size() > m_maxConnections)
655
+ {
656
+ Sleep(100);
657
+ if (m_stopped)
658
+ return;
659
+ }
660
+ // Time to await slight time and no pipe be exists.
661
+ // A client is trying connection several times.
662
+ m_acceptor.accept(m_newConnection->socket());
663
+ if (m_stopped)
664
+ return;
665
+ system::error_code e;
666
+ onAccept(e);
667
+ }
668
+ }
669
+ catch (bzs::rtl::exception& e)
670
+ {
671
+ if (erh)
672
+ {
673
+ if (const std::string* msg = getMsg(e))
674
+ {
675
+ std::string s = "Pipe server accept " + *msg;
676
+ erh->printError(s.c_str());
677
+ }
678
+ else
679
+ erh->printError(boost::diagnostic_information(e).c_str());
680
+ }
681
+ stop();
682
+ }
667
683
  }
668
684
 
669
685
  void server::onAccept(const system::error_code& e)
670
686
  {
671
- //connection is passed to a thread and it resumes.
672
- if (!e)
673
- {
674
- worker* w = worker::get(m_app.get());
675
- w->setConnection(m_newConnection);
676
- worker::condition.notify_all();
677
- m_newConnection.reset(new connection());
678
- }
687
+ // connection is passed to a thread and it resumes.
688
+ if (!e)
689
+ {
690
+ worker* w = worker::get(m_app.get());
691
+ w->setConnection(m_newConnection);
692
+ worker::condition.notify_all();
693
+ m_newConnection.reset(new connection());
694
+ }
679
695
  }
680
696
 
681
697
  void server::doStop()
682
698
  {
683
- if (!m_stopped)
684
- {
685
- m_stopped = true;
686
- if (erh)
687
- erh->printInfo("Stopping Pipe server ...");
688
- m_acceptor.cancel();
689
- worker::shutdown = true;
690
- connection::stop();
691
- worker::condition.notify_all();
692
- }
699
+ if (!m_stopped)
700
+ {
701
+ m_stopped = true;
702
+ if (erh)
703
+ erh->printInfo("Stopping Pipe server ...");
704
+ m_acceptor.cancel();
705
+ worker::shutdown = true;
706
+ connection::stop();
707
+ worker::condition.notify_all();
708
+ }
693
709
  }
694
710
 
695
711
  void server::stop()
696
712
  {
697
- doStop();
698
- worker::join();
713
+ doStop();
714
+ worker::join();
699
715
  }
700
716
 
701
- }//namespace pipe
702
- }//namespace server
703
- }//namespace netsvc
704
- }//namespace bzs
705
-
717
+ } // namespace pipe
718
+ } // namespace server
719
+ } // namespace netsvc
720
+ } // namespace bzs