transactd 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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