diff options
Diffstat (limited to 'src/stable')
-rw-r--r-- | src/stable/client.cpp | 32 | ||||
-rw-r--r-- | src/stable/client.h | 2 | ||||
-rw-r--r-- | src/stable/multiserver.cpp | 6 | ||||
-rw-r--r-- | src/stable/string.cpp | 10 |
4 files changed, 44 insertions, 6 deletions
diff --git a/src/stable/client.cpp b/src/stable/client.cpp index ca86f37..43ae83b 100644 --- a/src/stable/client.cpp +++ b/src/stable/client.cpp | |||
@@ -25,11 +25,13 @@ Bu::Client::Client( Bu::TcpSocket *pSocket, | |||
25 | bWantsDisconnect( false ), | 25 | bWantsDisconnect( false ), |
26 | pfLink( pfLink ) | 26 | pfLink( pfLink ) |
27 | { | 27 | { |
28 | Bu::ReadWriteMutex::WriteLocker lGlobal( mGlobal ); | ||
28 | lFilts.prepend( pSocket ); | 29 | lFilts.prepend( pSocket ); |
29 | } | 30 | } |
30 | 31 | ||
31 | Bu::Client::~Client() | 32 | Bu::Client::~Client() |
32 | { | 33 | { |
34 | Bu::ReadWriteMutex::WriteLocker lGlobal( mGlobal ); | ||
33 | for( FilterList::iterator i = lFilts.begin(); i; i++ ) | 35 | for( FilterList::iterator i = lFilts.begin(); i; i++ ) |
34 | { | 36 | { |
35 | delete *i; | 37 | delete *i; |
@@ -40,6 +42,7 @@ Bu::Client::~Client() | |||
40 | 42 | ||
41 | void Bu::Client::processInput() | 43 | void Bu::Client::processInput() |
42 | { | 44 | { |
45 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
43 | mRead.lock(); | 46 | mRead.lock(); |
44 | char buf[RBS]; | 47 | char buf[RBS]; |
45 | Bu::size nRead, nTotal=0; | 48 | Bu::size nRead, nTotal=0; |
@@ -85,6 +88,7 @@ void Bu::Client::processInput() | |||
85 | 88 | ||
86 | void Bu::Client::processOutput() | 89 | void Bu::Client::processOutput() |
87 | { | 90 | { |
91 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
88 | mWrite.lock(); | 92 | mWrite.lock(); |
89 | char buf[RBS]; | 93 | char buf[RBS]; |
90 | if( qbWrite.getSize() > 0 ) | 94 | if( qbWrite.getSize() > 0 ) |
@@ -100,17 +104,20 @@ void Bu::Client::processOutput() | |||
100 | 104 | ||
101 | void Bu::Client::setProtocol( Protocol *pProto ) | 105 | void Bu::Client::setProtocol( Protocol *pProto ) |
102 | { | 106 | { |
107 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
103 | this->pProto = pProto; | 108 | this->pProto = pProto; |
104 | this->pProto->onNewConnection( this ); | 109 | this->pProto->onNewConnection( this ); |
105 | } | 110 | } |
106 | 111 | ||
107 | Bu::Protocol *Bu::Client::getProtocol() | 112 | Bu::Protocol *Bu::Client::getProtocol() |
108 | { | 113 | { |
114 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
109 | return pProto; | 115 | return pProto; |
110 | } | 116 | } |
111 | 117 | ||
112 | void Bu::Client::clearProtocol() | 118 | void Bu::Client::clearProtocol() |
113 | { | 119 | { |
120 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
114 | pProto = NULL; | 121 | pProto = NULL; |
115 | } | 122 | } |
116 | /* | 123 | /* |
@@ -127,127 +134,149 @@ Bu::String &Bu::Client::getOutput() | |||
127 | 134 | ||
128 | bool Bu::Client::isOpen() | 135 | bool Bu::Client::isOpen() |
129 | { | 136 | { |
137 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
130 | if( !pTopStream ) return false; | 138 | if( !pTopStream ) return false; |
131 | return pTopStream->isOpen(); | 139 | return pTopStream->isOpen(); |
132 | } | 140 | } |
133 | 141 | ||
134 | Bu::size Bu::Client::write( const Bu::String &sData ) | 142 | Bu::size Bu::Client::write( const Bu::String &sData ) |
135 | { | 143 | { |
144 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
136 | Bu::MutexLocker l( mWrite ); | 145 | Bu::MutexLocker l( mWrite ); |
137 | return qbWrite.write( sData.getStr(), sData.getSize() ); | 146 | return qbWrite.write( sData.getStr(), sData.getSize() ); |
138 | } | 147 | } |
139 | 148 | ||
140 | Bu::size Bu::Client::write( const void *pData, Bu::size nBytes ) | 149 | Bu::size Bu::Client::write( const void *pData, Bu::size nBytes ) |
141 | { | 150 | { |
151 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
142 | Bu::MutexLocker l( mWrite ); | 152 | Bu::MutexLocker l( mWrite ); |
143 | return qbWrite.write( pData, nBytes ); | 153 | return qbWrite.write( pData, nBytes ); |
144 | } | 154 | } |
145 | 155 | ||
146 | Bu::size Bu::Client::write( int8_t nData ) | 156 | Bu::size Bu::Client::write( int8_t nData ) |
147 | { | 157 | { |
158 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
148 | Bu::MutexLocker l( mWrite ); | 159 | Bu::MutexLocker l( mWrite ); |
149 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); | 160 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); |
150 | } | 161 | } |
151 | 162 | ||
152 | Bu::size Bu::Client::write( int16_t nData ) | 163 | Bu::size Bu::Client::write( int16_t nData ) |
153 | { | 164 | { |
165 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
154 | Bu::MutexLocker l( mWrite ); | 166 | Bu::MutexLocker l( mWrite ); |
155 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); | 167 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); |
156 | } | 168 | } |
157 | 169 | ||
158 | Bu::size Bu::Client::write( int32_t nData ) | 170 | Bu::size Bu::Client::write( int32_t nData ) |
159 | { | 171 | { |
172 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
160 | Bu::MutexLocker l( mWrite ); | 173 | Bu::MutexLocker l( mWrite ); |
161 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); | 174 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); |
162 | } | 175 | } |
163 | 176 | ||
164 | Bu::size Bu::Client::write( int64_t nData ) | 177 | Bu::size Bu::Client::write( int64_t nData ) |
165 | { | 178 | { |
179 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
166 | Bu::MutexLocker l( mWrite ); | 180 | Bu::MutexLocker l( mWrite ); |
167 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); | 181 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); |
168 | } | 182 | } |
169 | 183 | ||
170 | Bu::size Bu::Client::write( uint8_t nData ) | 184 | Bu::size Bu::Client::write( uint8_t nData ) |
171 | { | 185 | { |
186 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
172 | Bu::MutexLocker l( mWrite ); | 187 | Bu::MutexLocker l( mWrite ); |
173 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); | 188 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); |
174 | } | 189 | } |
175 | 190 | ||
176 | Bu::size Bu::Client::write( uint16_t nData ) | 191 | Bu::size Bu::Client::write( uint16_t nData ) |
177 | { | 192 | { |
193 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
178 | Bu::MutexLocker l( mWrite ); | 194 | Bu::MutexLocker l( mWrite ); |
179 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); | 195 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); |
180 | } | 196 | } |
181 | 197 | ||
182 | Bu::size Bu::Client::write( uint32_t nData ) | 198 | Bu::size Bu::Client::write( uint32_t nData ) |
183 | { | 199 | { |
200 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
184 | Bu::MutexLocker l( mWrite ); | 201 | Bu::MutexLocker l( mWrite ); |
185 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); | 202 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); |
186 | } | 203 | } |
187 | 204 | ||
188 | Bu::size Bu::Client::write( uint64_t nData ) | 205 | Bu::size Bu::Client::write( uint64_t nData ) |
189 | { | 206 | { |
207 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
190 | Bu::MutexLocker l( mWrite ); | 208 | Bu::MutexLocker l( mWrite ); |
191 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); | 209 | return qbWrite.write( (const char *)&nData, sizeof(nData) ); |
192 | } | 210 | } |
193 | 211 | ||
194 | Bu::size Bu::Client::read( void *pData, Bu::size nBytes ) | 212 | Bu::size Bu::Client::read( void *pData, Bu::size nBytes ) |
195 | { | 213 | { |
214 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
196 | Bu::MutexLocker l( mWrite ); | 215 | Bu::MutexLocker l( mWrite ); |
197 | return qbRead.read( pData, nBytes ); | 216 | return qbRead.read( pData, nBytes ); |
198 | } | 217 | } |
199 | 218 | ||
200 | Bu::size Bu::Client::peek( void *pData, int nBytes, int nOffset ) | 219 | Bu::size Bu::Client::peek( void *pData, int nBytes, int nOffset ) |
201 | { | 220 | { |
221 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
202 | Bu::MutexLocker l( mWrite ); | 222 | Bu::MutexLocker l( mWrite ); |
203 | return qbRead.peek( pData, nBytes, nOffset ); | 223 | return qbRead.peek( pData, nBytes, nOffset ); |
204 | } | 224 | } |
205 | 225 | ||
206 | Bu::size Bu::Client::getInputSize() | 226 | Bu::size Bu::Client::getInputSize() |
207 | { | 227 | { |
228 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
208 | Bu::MutexLocker l( mWrite ); | 229 | Bu::MutexLocker l( mWrite ); |
209 | return qbRead.getSize(); | 230 | return qbRead.getSize(); |
210 | } | 231 | } |
211 | 232 | ||
212 | Bu::size Bu::Client::getOutputSize() | 233 | Bu::size Bu::Client::getOutputSize() |
213 | { | 234 | { |
235 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
214 | Bu::MutexLocker l( mWrite ); | 236 | Bu::MutexLocker l( mWrite ); |
215 | return qbWrite.getSize(); | 237 | return qbWrite.getSize(); |
216 | } | 238 | } |
217 | 239 | ||
218 | const Bu::TcpSocket *Bu::Client::getSocket() const | 240 | const Bu::TcpSocket *Bu::Client::getSocket() const |
219 | { | 241 | { |
242 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
220 | return pSocket; | 243 | return pSocket; |
221 | } | 244 | } |
222 | 245 | ||
223 | void Bu::Client::disconnect() | 246 | void Bu::Client::disconnect() |
224 | { | 247 | { |
248 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
225 | bWantsDisconnect = true; | 249 | bWantsDisconnect = true; |
226 | } | 250 | } |
227 | 251 | ||
228 | bool Bu::Client::wantsDisconnect() | 252 | bool Bu::Client::wantsDisconnect() |
229 | { | 253 | { |
254 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
230 | return bWantsDisconnect; | 255 | return bWantsDisconnect; |
231 | } | 256 | } |
232 | 257 | ||
233 | void Bu::Client::close() | 258 | void Bu::Client::close() |
234 | { | 259 | { |
260 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
235 | pTopStream->close(); | 261 | pTopStream->close(); |
236 | } | 262 | } |
237 | 263 | ||
238 | Bu::ClientLink *Bu::Client::getLink() | 264 | Bu::ClientLink *Bu::Client::getLink() |
239 | { | 265 | { |
266 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
240 | return pfLink->createLink( this ); | 267 | return pfLink->createLink( this ); |
241 | } | 268 | } |
242 | 269 | ||
243 | void Bu::Client::onMessage( const Bu::String &sMsg ) | 270 | void Bu::Client::onMessage( const Bu::String &sMsg ) |
244 | { | 271 | { |
272 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
245 | if( pProto ) | 273 | if( pProto ) |
246 | pProto->onMessage( this, sMsg ); | 274 | pProto->onMessage( this, sMsg ); |
247 | } | 275 | } |
248 | 276 | ||
249 | void Bu::Client::tick() | 277 | void Bu::Client::tick() |
250 | { | 278 | { |
279 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
251 | if( pProto ) | 280 | if( pProto ) |
252 | pProto->onTick( this ); | 281 | pProto->onTick( this ); |
253 | } | 282 | } |
@@ -259,6 +288,7 @@ Bu::size Bu::Client::tell() | |||
259 | 288 | ||
260 | void Bu::Client::seek( Bu::size offset ) | 289 | void Bu::Client::seek( Bu::size offset ) |
261 | { | 290 | { |
291 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
262 | Bu::MutexLocker l( mRead ); | 292 | Bu::MutexLocker l( mRead ); |
263 | return qbRead.seek( offset ); | 293 | return qbRead.seek( offset ); |
264 | } | 294 | } |
@@ -280,11 +310,13 @@ bool Bu::Client::isEos() | |||
280 | 310 | ||
281 | void Bu::Client::flush() | 311 | void Bu::Client::flush() |
282 | { | 312 | { |
313 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
283 | processOutput(); | 314 | processOutput(); |
284 | } | 315 | } |
285 | 316 | ||
286 | bool Bu::Client::canRead() | 317 | bool Bu::Client::canRead() |
287 | { | 318 | { |
319 | Bu::ReadWriteMutex::ReadLocker lGlobal( mGlobal ); | ||
288 | Bu::MutexLocker l( mRead ); | 320 | Bu::MutexLocker l( mRead ); |
289 | return qbRead.getSize() > 0; | 321 | return qbRead.getSize() > 0; |
290 | } | 322 | } |
diff --git a/src/stable/client.h b/src/stable/client.h index ac882eb..6492a6e 100644 --- a/src/stable/client.h +++ b/src/stable/client.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #include "bu/string.h" | 14 | #include "bu/string.h" |
15 | #include "bu/queuebuf.h" | 15 | #include "bu/queuebuf.h" |
16 | #include "bu/mutex.h" | 16 | #include "bu/mutex.h" |
17 | #include "bu/readwritemutex.h" | ||
17 | 18 | ||
18 | namespace Bu | 19 | namespace Bu |
19 | { | 20 | { |
@@ -130,6 +131,7 @@ namespace Bu | |||
130 | class Bu::ClientLinkFactory *pfLink; | 131 | class Bu::ClientLinkFactory *pfLink; |
131 | Bu::Mutex mRead; | 132 | Bu::Mutex mRead; |
132 | Bu::Mutex mWrite; | 133 | Bu::Mutex mWrite; |
134 | mutable Bu::ReadWriteMutex mGlobal; | ||
133 | }; | 135 | }; |
134 | } | 136 | } |
135 | 137 | ||
diff --git a/src/stable/multiserver.cpp b/src/stable/multiserver.cpp index 6fd7ff3..c9e86cf 100644 --- a/src/stable/multiserver.cpp +++ b/src/stable/multiserver.cpp | |||
@@ -11,6 +11,8 @@ | |||
11 | 11 | ||
12 | #include "bu/config.h" | 12 | #include "bu/config.h" |
13 | 13 | ||
14 | #include "bu/sio.h" | ||
15 | |||
14 | Bu::MultiServer::MultiServer() | 16 | Bu::MultiServer::MultiServer() |
15 | { | 17 | { |
16 | } | 18 | } |
@@ -40,7 +42,9 @@ void Bu::MultiServer::onNewConnection( Bu::Client *pClient, int nPort ) | |||
40 | 42 | ||
41 | void Bu::MultiServer::onClosedConnection( Bu::Client *pClient ) | 43 | void Bu::MultiServer::onClosedConnection( Bu::Client *pClient ) |
42 | { | 44 | { |
43 | delete pClient->getProtocol(); | 45 | Bu::Protocol *pProto = pClient->getProtocol(); |
46 | pClient->clearProtocol(); | ||
47 | delete pProto; | ||
44 | } | 48 | } |
45 | 49 | ||
46 | void Bu::MultiServer::shutdown() | 50 | void Bu::MultiServer::shutdown() |
diff --git a/src/stable/string.cpp b/src/stable/string.cpp index 1579826..ce679fe 100644 --- a/src/stable/string.cpp +++ b/src/stable/string.cpp | |||
@@ -201,7 +201,7 @@ void Bu::String::append( const char *pData, long nStart, long nLen ) | |||
201 | 201 | ||
202 | _hardCopy(); | 202 | _hardCopy(); |
203 | 203 | ||
204 | if( core->pLast && core->pLast->nLength < nMinSize ) | 204 | if( core->pLast && core->pLast->nLength+1 < nMinSize ) |
205 | { | 205 | { |
206 | int nAmnt = nMinSize - core->pLast->nLength; | 206 | int nAmnt = nMinSize - core->pLast->nLength; |
207 | if( nAmnt > nLen ) | 207 | if( nAmnt > nLen ) |
@@ -228,9 +228,9 @@ void Bu::String::append( const char *pData, long nStart, long nLen ) | |||
228 | 228 | ||
229 | void Bu::String::append( const char &cData ) | 229 | void Bu::String::append( const char &cData ) |
230 | { | 230 | { |
231 | if( core->pLast && core->pLast->nLength < nMinSize ) | 231 | _hardCopy(); |
232 | if( core->pLast && core->pLast->nLength+1 < nMinSize ) | ||
232 | { | 233 | { |
233 | _hardCopy(); | ||
234 | core->pLast->pData[core->pLast->nLength] = cData; | 234 | core->pLast->pData[core->pLast->nLength] = cData; |
235 | ++core->pLast->nLength; ++core->nLength; | 235 | ++core->pLast->nLength; ++core->nLength; |
236 | // pLast->pData[pLast->nLength] = (char)0; | 236 | // pLast->pData[pLast->nLength] = (char)0; |
@@ -615,9 +615,9 @@ Bu::String &Bu::String::operator+=( const Bu::String::const_iterator &i ) | |||
615 | 615 | ||
616 | Bu::String &Bu::String::operator+=( const char cData ) | 616 | Bu::String &Bu::String::operator+=( const char cData ) |
617 | { | 617 | { |
618 | if( core->pLast && core->pLast->nLength < nMinSize ) | ||
619 | { | ||
620 | _hardCopy(); | 618 | _hardCopy(); |
619 | if( core->pLast && core->pLast->nLength+1 < nMinSize ) | ||
620 | { | ||
621 | core->pLast->pData[core->pLast->nLength] = cData; | 621 | core->pLast->pData[core->pLast->nLength] = cData; |
622 | ++core->pLast->nLength; ++core->nLength; | 622 | ++core->pLast->nLength; ++core->nLength; |
623 | // pLast->pData[pLast->nLength] = (char)0; | 623 | // pLast->pData[pLast->nLength] = (char)0; |