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
|
#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
|
|
55
|
+
class connection : public iconnection, private boost::noncopyable
|
|
58
56
|
{
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
|
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
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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<
|
|
345
|
-
std::vector<worker*>
|
|
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
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
|
|
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
|
-
|
|
442
|
+
: m_timer(m_ios), m_maxConnections(max_connections), m_stopped(false)
|
|
412
443
|
{
|
|
413
|
-
|
|
444
|
+
worker::hostCheckName = hostCheckName;
|
|
414
445
|
}
|
|
415
446
|
|
|
416
447
|
server::~server()
|
|
417
448
|
{
|
|
418
|
-
|
|
449
|
+
m_listeners.clear();
|
|
419
450
|
}
|
|
420
451
|
|
|
421
|
-
void server::addApplication(boost::shared_ptr<IAppModuleBuilder> app,
|
|
422
|
-
|
|
452
|
+
void server::addApplication(boost::shared_ptr<IAppModuleBuilder> app,
|
|
453
|
+
const std::string& address, const std::string& port)
|
|
423
454
|
{
|
|
424
|
-
|
|
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
|
-
|
|
432
|
-
|
|
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
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
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
|
-
|
|
449
|
-
|
|
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
|
-
|
|
458
|
-
|
|
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
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
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
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
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
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
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
|
-
|
|
514
|
-
|
|
515
|
-
|
|
545
|
+
doStop();
|
|
546
|
+
worker::join();
|
|
516
547
|
}
|
|
517
548
|
|
|
518
|
-
|
|
519
|
-
}//namespace
|
|
520
|
-
}//
|
|
521
|
-
}//
|
|
522
|
-
}//namespace bzs
|
|
549
|
+
} // namespace cpt
|
|
550
|
+
} // namespace server
|
|
551
|
+
} // namesapce netsvc
|
|
552
|
+
} // namespace bzs
|