diff options
author | Mike Buland <eichlan@xagasoft.com> | 2008-02-07 14:59:11 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2008-02-07 14:59:11 +0000 |
commit | 5574841cc88412854b2cb94253152b3606803e2a (patch) | |
tree | 444381af56492c049e00b9b717a225333de614a5 | |
parent | 3e581ae682dc6050b8b8c41c917ae62a040719d8 (diff) | |
download | libbu++-5574841cc88412854b2cb94253152b3606803e2a.tar.gz libbu++-5574841cc88412854b2cb94253152b3606803e2a.tar.bz2 libbu++-5574841cc88412854b2cb94253152b3606803e2a.tar.xz libbu++-5574841cc88412854b2cb94253152b3606803e2a.zip |
Corrected a very rare race condition in Bu::ItoServer where there was a chance
that the client would disconnect so quickly that it would be cleaned up before
it was properly accounted for. I apparently added something to MiniMacro a
while ago...probably the end tags I think...
-rw-r--r-- | src/itoserver.cpp | 3 | ||||
-rw-r--r-- | src/minimacro.cpp | 33 | ||||
-rw-r--r-- | src/minimacro.h | 3 |
3 files changed, 37 insertions, 2 deletions
diff --git a/src/itoserver.cpp b/src/itoserver.cpp index 8bdd894..7426e8a 100644 --- a/src/itoserver.cpp +++ b/src/itoserver.cpp | |||
@@ -64,11 +64,12 @@ void Bu::ItoServer::addClient( int nSocket, int nPort ) | |||
64 | { | 64 | { |
65 | ItoClient *pC = new ItoClient( *this, nSocket, nPort, nTimeoutSec, | 65 | ItoClient *pC = new ItoClient( *this, nSocket, nPort, nTimeoutSec, |
66 | nTimeoutUSec ); | 66 | nTimeoutUSec ); |
67 | pC->start(); | ||
68 | 67 | ||
69 | imClients.lock(); | 68 | imClients.lock(); |
70 | hClients.insert( nSocket, pC ); | 69 | hClients.insert( nSocket, pC ); |
71 | imClients.unlock(); | 70 | imClients.unlock(); |
71 | |||
72 | pC->start(); | ||
72 | } | 73 | } |
73 | 74 | ||
74 | void *Bu::ItoServer::run() | 75 | void *Bu::ItoServer::run() |
diff --git a/src/minimacro.cpp b/src/minimacro.cpp index 2bd156c..1d2abf8 100644 --- a/src/minimacro.cpp +++ b/src/minimacro.cpp | |||
@@ -20,8 +20,9 @@ Bu::MiniMacro::~MiniMacro() | |||
20 | 20 | ||
21 | Bu::FString Bu::MiniMacro::parse( const Bu::FString &sIn ) | 21 | Bu::FString Bu::MiniMacro::parse( const Bu::FString &sIn ) |
22 | { | 22 | { |
23 | bContinue = true; | ||
23 | Bu::FString sOut; | 24 | Bu::FString sOut; |
24 | for( sCur = sIn.getStr(); *sCur; sCur++ ) | 25 | for( sCur = sIn.getStr(); *sCur && bContinue; sCur++ ) |
25 | { | 26 | { |
26 | if( *sCur == '{' ) | 27 | if( *sCur == '{' ) |
27 | { | 28 | { |
@@ -53,6 +54,8 @@ Bu::FString Bu::MiniMacro::parse( const Bu::FString &sIn ) | |||
53 | } | 54 | } |
54 | } | 55 | } |
55 | 56 | ||
57 | iLastPos = (int)sCur - (int)sIn.getStr(); | ||
58 | |||
56 | return sOut; | 59 | return sOut; |
57 | } | 60 | } |
58 | 61 | ||
@@ -101,6 +104,29 @@ Bu::FString Bu::MiniMacro::parseCond() | |||
101 | Bu::FString Bu::MiniMacro::parseCmd() | 104 | Bu::FString Bu::MiniMacro::parseCmd() |
102 | { | 105 | { |
103 | Bu::FString sOut; | 106 | Bu::FString sOut; |
107 | const char *sNext = sCur; | ||
108 | for(; *sNext != ':' && *sNext != '}' && *sNext != '\0'; sNext++ ); | ||
109 | if( *sNext != '\0' ) | ||
110 | { | ||
111 | Bu::FString sName( sCur, (int)sNext-(int)sCur ); | ||
112 | if( sName == "end" ) | ||
113 | { | ||
114 | sCur = sNext; | ||
115 | bContinue = false; | ||
116 | return sOut; | ||
117 | } | ||
118 | else | ||
119 | { | ||
120 | throw Bu::ExceptionBase("Unknown command '%s'.", | ||
121 | sName.getStr() | ||
122 | ); | ||
123 | } | ||
124 | } | ||
125 | else | ||
126 | { | ||
127 | printf("Uh...?\n"); | ||
128 | } | ||
129 | |||
104 | printf("%20s\n", sCur ); | 130 | printf("%20s\n", sCur ); |
105 | return sOut; | 131 | return sOut; |
106 | } | 132 | } |
@@ -142,3 +168,8 @@ const Bu::FString &Bu::MiniMacro::getvar( const Bu::FString &sName ) | |||
142 | return hVars.get( sName ); | 168 | return hVars.get( sName ); |
143 | } | 169 | } |
144 | 170 | ||
171 | int Bu::MiniMacro::getPosition() | ||
172 | { | ||
173 | return iLastPos; | ||
174 | } | ||
175 | |||
diff --git a/src/minimacro.h b/src/minimacro.h index 4349b19..f278666 100644 --- a/src/minimacro.h +++ b/src/minimacro.h | |||
@@ -70,6 +70,7 @@ namespace Bu | |||
70 | void addVar( const Bu::FString &sName, const Bu::FString &sValue ); | 70 | void addVar( const Bu::FString &sName, const Bu::FString &sValue ); |
71 | bool hasVar( const Bu::FString &sName ); | 71 | bool hasVar( const Bu::FString &sName ); |
72 | const Bu::FString &getvar( const Bu::FString &sName ); | 72 | const Bu::FString &getvar( const Bu::FString &sName ); |
73 | int getPosition(); | ||
73 | 74 | ||
74 | private: | 75 | private: |
75 | const char *sCur; | 76 | const char *sCur; |
@@ -80,6 +81,8 @@ namespace Bu | |||
80 | const Bu::FString &sIn, const Bu::FString &sFunc ); | 81 | const Bu::FString &sIn, const Bu::FString &sFunc ); |
81 | 82 | ||
82 | StrHash hVars; | 83 | StrHash hVars; |
84 | bool bContinue; | ||
85 | int iLastPos; | ||
83 | 86 | ||
84 | public: | 87 | public: |
85 | typedef Bu::List<Bu::FString> StrList; | 88 | typedef Bu::List<Bu::FString> StrList; |