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.
- checksums.yaml +4 -4
- data/BUILD_UNIX-JA +46 -67
- data/BUILD_WIN-JA +106 -63
- data/CMakeLists.txt +40 -15
- data/README +219 -75
- data/README-JA +207 -76
- data/README_ORMSRCGEN +118 -0
- data/README_ORMSRCGEN-JA +115 -0
- data/bin/common/tdclc_32_2_0.dll +0 -0
- data/bin/common/tdclc_64_2_0.dll +0 -0
- data/build/common/check_for_link_iconv.cmake +18 -14
- data/build/common/create_symlink.cmake.in +25 -0
- data/build/common/get_boost_libs.cmake +23 -23
- data/build/common/options.cmake +0 -66
- data/build/common/smart_install.cmake +3 -3
- data/build/common/transactd.rc.in +15 -5
- data/build/common/transactd_cl_common.cmake +37 -18
- data/build/common/transactd_cl_output.cmake +55 -13
- data/build/common/transactd_common.cmake +108 -31
- data/build/swig/php/generate.cmake.in +15 -17
- data/build/swig/php/generate.cmd.in +15 -9
- data/build/swig/php/php.swg +124 -82
- data/build/swig/php/transactd.no_yield.php +4494 -0
- data/build/swig/php/transactd.no_yield.php.git.patch +685 -0
- data/build/swig/php/transactd.no_yield.php.patch +685 -0
- data/build/swig/php/transactd.yield.php +4461 -0
- data/build/swig/php/transactd.yield.php.git.patch +652 -0
- data/build/swig/php/transactd.yield.php.patch +652 -0
- data/build/swig/referencecounter.h +79 -0
- data/build/swig/ruby/ruby.swg +226 -76
- data/build/swig/ruby/threadBlockRegionWrapper.h +71 -0
- data/build/swig/ruby/without_gvl.swg +87 -0
- data/build/swig/tdcl.i +659 -170
- data/build/swig/validatablepointer.h +91 -0
- data/build/tdclc/CMakeLists.txt +49 -34
- data/build/tdclc/{tdclc_64.cbproj → tdclc.cbproj} +65 -20
- data/build/tdclc/tdclc.rc +0 -0
- data/build/tdclcpp/CMakeLists.txt +84 -20
- data/build/tdclcpp/tdclcpp.rc +0 -0
- data/build/tdclcpp/{tdclcpp_bcb_64.cbproj → tdclcpp_bc.cbproj} +168 -44
- data/build/tdclrb/CMakeLists.txt +84 -66
- data/build/tdclrb/bldgem/extconf.rb +28 -3
- data/build/tdclrb/gem/helper.rb +11 -1
- data/build/tdclrb/gem_output.cmake +20 -16
- data/index_ja.html +15 -0
- data/source/bzs/db/IBlobBuffer.h +15 -17
- data/source/bzs/db/blobBuffer.h +186 -140
- data/source/bzs/db/blobStructs.h +37 -37
- data/source/bzs/db/engine/mysql/IReadRecords.h +34 -34
- data/source/bzs/db/engine/mysql/bookmark.h +150 -147
- data/source/bzs/db/engine/mysql/database.cpp +1721 -1526
- data/source/bzs/db/engine/mysql/database.h +608 -370
- data/source/bzs/db/engine/mysql/dbManager.cpp +213 -201
- data/source/bzs/db/engine/mysql/dbManager.h +115 -104
- data/source/bzs/db/engine/mysql/errorMessage.cpp +49 -50
- data/source/bzs/db/engine/mysql/errorMessage.h +25 -26
- data/source/bzs/db/engine/mysql/fieldAccess.h +55 -61
- data/source/bzs/db/engine/mysql/mydebuglog.cpp +326 -292
- data/source/bzs/db/engine/mysql/mydebuglog.h +63 -55
- data/source/bzs/db/engine/mysql/mysqlInternal.h +182 -125
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +121 -121
- data/source/bzs/db/engine/mysql/mysqlThd.h +20 -20
- data/source/bzs/db/engine/mysql/percentageKey.h +241 -228
- data/source/bzs/db/protocol/ICommandExecuter.h +18 -17
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +543 -514
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +155 -158
- data/source/bzs/db/protocol/tdap/btrDate.cpp +213 -180
- data/source/bzs/db/protocol/tdap/btrDate.h +39 -37
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +173 -0
- data/source/bzs/db/protocol/tdap/client/activeTable.h +165 -0
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +370 -0
- data/source/bzs/db/protocol/tdap/client/bulkInsert.h +13 -23
- data/source/bzs/db/protocol/tdap/client/client.cpp +81 -68
- data/source/bzs/db/protocol/tdap/client/client.h +361 -320
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +17 -22
- data/source/bzs/db/protocol/tdap/client/connMgr.h +17 -19
- data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +243 -0
- data/source/bzs/db/protocol/tdap/client/connectionPool.h +109 -0
- data/source/bzs/db/protocol/tdap/client/database.cpp +327 -219
- data/source/bzs/db/protocol/tdap/client/database.h +141 -118
- data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +60 -62
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +255 -0
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +315 -202
- data/source/bzs/db/protocol/tdap/client/dbDef.h +40 -32
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +390 -371
- data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +148 -56
- data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +149 -57
- data/source/bzs/db/protocol/tdap/client/export.h +35 -0
- data/source/bzs/db/protocol/tdap/client/field.cpp +1985 -0
- data/source/bzs/db/protocol/tdap/client/field.h +393 -0
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +14 -14
- data/source/bzs/db/protocol/tdap/client/fieldDDF.h +11 -14
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +123 -0
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +58 -0
- data/source/bzs/db/protocol/tdap/client/fields.h +178 -0
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +13 -16
- data/source/bzs/db/protocol/tdap/client/fileDDF.h +11 -17
- data/source/bzs/db/protocol/tdap/client/filter.h +423 -259
- data/source/bzs/db/protocol/tdap/client/groupComp.h +117 -0
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +818 -0
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +281 -0
- data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +14 -17
- data/source/bzs/db/protocol/tdap/client/indexDDF.h +11 -14
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +231 -0
- data/source/bzs/db/protocol/tdap/client/memRecord.h +145 -0
- data/source/bzs/db/protocol/tdap/client/memRecordset.cpp +448 -0
- data/source/bzs/db/protocol/tdap/client/memRecordset.h +159 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +300 -173
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +53 -36
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +171 -128
- data/source/bzs/db/protocol/tdap/client/nsTable.h +121 -87
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +173 -0
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +209 -0
- data/source/bzs/db/protocol/tdap/client/recordset.h +86 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +596 -0
- data/source/bzs/db/protocol/tdap/client/request.h +227 -170
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +1288 -0
- data/source/bzs/db/protocol/tdap/client/serializer.h +295 -0
- data/source/bzs/db/protocol/tdap/client/sharedData.cpp +9 -12
- data/source/bzs/db/protocol/tdap/client/sharedData.h +18 -16
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +494 -473
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +51 -53
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +214 -148
- data/source/bzs/db/protocol/tdap/client/table.cpp +929 -1665
- data/source/bzs/db/protocol/tdap/client/table.h +413 -87
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +642 -534
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +25 -40
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +11 -15
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +378 -437
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +127 -0
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +352 -345
- data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +75 -78
- data/source/bzs/db/protocol/tdap/mysql/characterset.h +18 -19
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +216 -199
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +23 -14
- data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +354 -314
- data/source/bzs/db/protocol/tdap/mysql/debuglog.h +57 -47
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +905 -739
- data/source/bzs/db/protocol/tdap/mysql/request.h +152 -159
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1044 -879
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +87 -81
- data/source/bzs/db/protocol/tdap/tdapRequest.h +162 -130
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +368 -166
- data/source/bzs/db/protocol/tdap/tdapSchema.h +702 -566
- data/source/bzs/db/protocol/tdap/tdapcapi.h +387 -353
- data/source/bzs/db/transactd/appBuilderImple.h +21 -20
- data/source/bzs/db/transactd/appModule.cpp +350 -98
- data/source/bzs/db/transactd/appModule.h +31 -37
- data/source/bzs/db/transactd/connManager.cpp +138 -135
- data/source/bzs/db/transactd/connManager.h +28 -21
- data/source/bzs/db/transactd/connectionRecord.h +39 -39
- data/source/bzs/db/transactd/transactd.cpp +217 -203
- data/source/bzs/env/boost_bcb_link.h +131 -0
- data/source/bzs/env/compiler.h +136 -79
- data/source/bzs/env/crosscompile.cpp +57 -57
- data/source/bzs/env/crosscompile.h +130 -115
- data/source/bzs/env/fileopen.h +7 -8
- data/source/bzs/env/mbcswchrLinux.cpp +4 -9
- data/source/bzs/env/mbcswchrLinux.h +37 -34
- data/source/bzs/env/tcharMinGW.h +59 -0
- data/source/bzs/env/tstring.h +90 -95
- data/source/bzs/example/changeSchema.cpp +22 -23
- data/source/bzs/example/changeSchema_c.cpp +22 -24
- data/source/bzs/example/connection_pool_c.cpp +49 -104
- data/source/bzs/example/createDatabase.cpp +40 -47
- data/source/bzs/example/createDatabase_c.cpp +38 -43
- data/source/bzs/example/deleteRecords.cpp +10 -15
- data/source/bzs/example/deleteRecords_c.cpp +10 -14
- data/source/bzs/example/dropDatabase.cpp +3 -9
- data/source/bzs/example/dropDatabase_c.cpp +5 -6
- data/source/bzs/example/insertRecords.cpp +37 -29
- data/source/bzs/example/insertRecords_c.cpp +19 -25
- data/source/bzs/example/ormap_c.cpp +621 -0
- data/source/bzs/example/queryData.cpp +371 -0
- data/source/bzs/example/queryData.h +16 -0
- data/source/bzs/example/query_c.cpp +109 -0
- data/source/bzs/example/readRecords.cpp +27 -27
- data/source/bzs/example/readRecords_c.cpp +25 -23
- data/source/bzs/example/updateRecords.cpp +16 -21
- data/source/bzs/example/updateRecords_c.cpp +8 -12
- data/source/bzs/example/update_with_transaction.cpp +21 -24
- data/source/bzs/example/update_with_transaction_c.cpp +12 -15
- data/source/bzs/example/useORMRecord.cpp +177 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +167 -156
- data/source/bzs/netsvc/client/tcpClient.h +541 -489
- data/source/bzs/netsvc/server/IAppModule.h +119 -32
- data/source/bzs/netsvc/server/iserver.h +21 -23
- data/source/bzs/netsvc/server/serverCpt.cpp +421 -391
- data/source/bzs/netsvc/server/serverCpt.h +41 -43
- data/source/bzs/netsvc/server/serverPipe.cpp +580 -565
- data/source/bzs/netsvc/server/serverPipe.h +44 -45
- data/source/bzs/netsvc/server/serverTpool.cpp +333 -303
- data/source/bzs/netsvc/server/serverTpool.h +38 -43
- data/source/bzs/rtl/benchmark.cpp +91 -31
- data/source/bzs/rtl/benchmark.h +76 -22
- data/source/bzs/rtl/datetime.cpp +231 -233
- data/source/bzs/rtl/datetime.h +16 -16
- data/source/bzs/rtl/debuglog.cpp +48 -51
- data/source/bzs/rtl/debuglog.h +55 -44
- data/source/bzs/rtl/exception.h +55 -48
- data/source/bzs/rtl/stl_uty.cpp +27 -28
- data/source/bzs/rtl/stl_uty.h +28 -29
- data/source/bzs/rtl/stringBuffers.cpp +8 -6
- data/source/bzs/rtl/stringBuffers.h +16 -9
- data/source/bzs/rtl/strtrim.cpp +90 -91
- data/source/bzs/rtl/strtrim.h +14 -16
- data/source/bzs/test/tdclatl/bench_query_atl.js +647 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +303 -303
- data/source/bzs/test/tdclatl/test_query_atl.js +669 -0
- data/source/bzs/test/tdclphp/bench.php +357 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +907 -303
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +21 -49
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +41 -75
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +23 -37
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +120 -0
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +4 -6
- data/source/bzs/test/tdclrb/prepare.rb +15 -12
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +29 -32
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -29
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +18 -19
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +107 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +734 -142
- data/source/bzs/test/transactdBench/query_bench.cpp +156 -0
- data/source/bzs/test/transactdBench/scaling_bench.cpp +265 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +107 -83
- data/source/bzs/test/transactdBench/transactdBench2.cpp +122 -83
- data/source/bzs/test/transactdBench/workerBase.cpp +5 -0
- data/source/bzs/test/transactdBench/workerBase.h +88 -0
- data/source/bzs/test/transactdBench/workerMySQLImple.h +333 -0
- data/source/bzs/test/transactdBench/workerTransactdImple.h +201 -0
- data/source/bzs/test/trdclengn/test_blob.cpp +121 -73
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +1244 -426
- data/source/global/ormsrcgen/confParam.h +80 -0
- data/source/global/ormsrcgen/fieldName.cpp +77 -0
- data/source/global/ormsrcgen/fieldName.h +43 -0
- data/source/global/ormsrcgen/main.cpp +196 -0
- data/source/global/ormsrcgen/srcgen.cpp +763 -0
- data/source/global/ormsrcgen/srcgen.h +72 -0
- data/source/global/ormsrcgen/template/fieldNameList_sample.txt +2 -0
- data/source/global/ormsrcgen/template/ormDataClass_template.cpp +48 -0
- data/source/global/ormsrcgen/template/ormDataClass_template.h +34 -0
- data/source/global/ormsrcgen/template/ormMapClass_template.cpp +51 -0
- data/source/global/ormsrcgen/template/ormMapClass_template.h +62 -0
- data/source/global/ormsrcgen/template/template.cnf +38 -0
- data/source/global/querystmts/querystmts.cpp +237 -0
- data/source/global/tdclatl/ConnectParams.cpp +77 -0
- data/source/global/tdclatl/ConnectParams.h +70 -0
- data/source/global/tdclatl/Database.cpp +132 -128
- data/source/global/tdclatl/Database.h +60 -49
- data/source/global/tdclatl/DbDef.cpp +68 -64
- data/source/global/tdclatl/DbDef.h +36 -36
- data/source/global/tdclatl/Field.cpp +12 -17
- data/source/global/tdclatl/Field.h +15 -12
- data/source/global/tdclatl/FieldDef.cpp +75 -36
- data/source/global/tdclatl/FieldDef.h +38 -19
- data/source/global/tdclatl/FieldDefs.cpp +74 -0
- data/source/global/tdclatl/FieldDefs.h +56 -0
- data/source/global/tdclatl/FieldNames.cpp +99 -0
- data/source/global/tdclatl/FieldNames.h +66 -0
- data/source/global/tdclatl/Flags.cpp +75 -37
- data/source/global/tdclatl/Flags.h +13 -12
- data/source/global/tdclatl/GroupQuery.cpp +119 -0
- data/source/global/tdclatl/GroupQuery.h +65 -0
- data/source/global/tdclatl/KeyDef.cpp +15 -14
- data/source/global/tdclatl/KeyDef.h +20 -17
- data/source/global/tdclatl/KeySegment.cpp +13 -12
- data/source/global/tdclatl/PooledDbManager.cpp +223 -0
- data/source/global/tdclatl/PooledDbManager.h +76 -0
- data/source/global/tdclatl/QueryBase.cpp +206 -127
- data/source/global/tdclatl/QueryBase.h +55 -59
- data/source/global/tdclatl/Record.cpp +214 -0
- data/source/global/tdclatl/Record.h +96 -0
- data/source/global/tdclatl/Recordset.cpp +278 -0
- data/source/global/tdclatl/Recordset.h +83 -0
- data/source/global/tdclatl/RecordsetQuery.cpp +118 -0
- data/source/global/tdclatl/RecordsetQuery.h +126 -0
- data/source/global/tdclatl/Table.cpp +57 -60
- data/source/global/tdclatl/Table.h +32 -29
- data/source/global/tdclatl/TableDef.cpp +63 -62
- data/source/global/tdclatl/TableDef.h +20 -22
- data/source/global/tdclatl/TdVersion.cpp +3 -3
- data/source/global/tdclatl/TdVersion.h +15 -11
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +99 -92
- data/source/global/tdclatl/activeTable.cpp +355 -0
- data/source/global/tdclatl/activeTable.h +79 -0
- data/source/global/tdclatl/dllmain.cpp +4 -3
- data/source/global/tdclatl/dllmain.h +7 -6
- data/source/global/tdclatl/keySegment.h +22 -18
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/stdafx.h +6 -4
- data/source/global/tdclatl/targetver.h +0 -1
- data/source/global/tdclatl/tdclatl.cpp +10 -5
- data/source/global/tdclatl/tdclatl.idl +530 -14
- data/source/linux/charsetConvert.h +78 -79
- data/source/linux/linuxTypes.h +9 -12
- data/source/linux/tchar.h +168 -166
- data/transactd.gemspec +24 -16
- metadata +98 -12
- data/bin/common/tdclc_32_1_2.dll +0 -0
- data/bin/common/tdclc_64_1_2.dll +0 -0
- data/build/tdclc/tdclc_32.cbproj +0 -173
- data/build/tdclcpp/tdclcpp_bcb_32.cbproj +0 -232
- data/build/tdclrb/GEM_VERSION +0 -3
- data/source/bzs/db/protocol/tdap/client/filter.cpp +0 -43
- 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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
75
|
+
m_pipeName = pipeName;
|
|
81
76
|
}
|
|
82
77
|
|
|
83
78
|
void acceptor::cancel()
|
|
84
79
|
{
|
|
85
|
-
|
|
80
|
+
m_cancel = true;
|
|
86
81
|
}
|
|
87
82
|
|
|
88
83
|
void acceptor::accept(platform_stream& pipe)
|
|
89
84
|
{
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
167
|
-
|
|
163
|
+
virtual ~IExitCheckHandler(){};
|
|
164
|
+
virtual bool isExit() = 0;
|
|
168
165
|
};
|
|
169
166
|
|
|
170
|
-
|
|
171
167
|
class exitCheckHnadler : public IExitCheckHandler
|
|
172
168
|
{
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
public:
|
|
169
|
+
HANDLE m_procHandle;
|
|
170
|
+
bool m_cancel;
|
|
171
|
+
IAppModule* m_module;
|
|
177
172
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
public:
|
|
207
|
+
HANDLE m_recv;
|
|
208
|
+
HANDLE m_send;
|
|
209
|
+
bool m_sent;
|
|
210
|
+
bool m_cancel;
|
|
222
211
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
|
323
|
+
class connection : public iconnection, private noncopyable
|
|
320
324
|
{
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
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
|
|
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
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
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<
|
|
598
|
-
std::vector<worker*>
|
|
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
|
-
|
|
612
|
-
|
|
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
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
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
|
-
|
|
627
|
-
|
|
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
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
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
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
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
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
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
|
-
|
|
698
|
-
|
|
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
|