transactd 1.2.0 → 2.0.0

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