diff options
author | Mike Buland <mbuland@penny-arcade.com> | 2018-01-29 00:47:50 -0800 |
---|---|---|
committer | Mike Buland <mbuland@penny-arcade.com> | 2018-01-29 00:47:50 -0800 |
commit | 1cb0fc6ab3f05e37f8c4c0bf5549b320c8b89078 (patch) | |
tree | 1417fdcc919d74ca25dc33b27714d10dd169700e | |
parent | 65ffc3b58ca865a7f83bf39290df1760c35b57f0 (diff) | |
download | libbu++-1cb0fc6ab3f05e37f8c4c0bf5549b320c8b89078.tar.gz libbu++-1cb0fc6ab3f05e37f8c4c0bf5549b320c8b89078.tar.bz2 libbu++-1cb0fc6ab3f05e37f8c4c0bf5549b320c8b89078.tar.xz libbu++-1cb0fc6ab3f05e37f8c4c0bf5549b320c8b89078.zip |
Changes related to debugging an issue.
It may not have had as much to do with low-level protocol details, and a
lot of this can be reverted, but I can't revert it right now. I'll look
it over later in the week.
-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 | ||||
-rw-r--r-- | src/unstable/protocolwebsocket.cpp | 23 | ||||
-rw-r--r-- | src/unstable/protocolwebsocket.h | 3 | ||||
-rw-r--r-- | src/unstable/readwritemutex.cpp | 4 |
7 files changed, 69 insertions, 11 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; |
diff --git a/src/unstable/protocolwebsocket.cpp b/src/unstable/protocolwebsocket.cpp index 9200904..576249c 100644 --- a/src/unstable/protocolwebsocket.cpp +++ b/src/unstable/protocolwebsocket.cpp | |||
@@ -9,6 +9,7 @@ | |||
9 | #include "bu/protocolwebsocket.h" | 9 | #include "bu/protocolwebsocket.h" |
10 | 10 | ||
11 | #include "bu/sio.h" | 11 | #include "bu/sio.h" |
12 | #include "bu/fmt.h" | ||
12 | #include "bu/client.h" | 13 | #include "bu/client.h" |
13 | 14 | ||
14 | #include "bu/membuf.h" | 15 | #include "bu/membuf.h" |
@@ -16,6 +17,8 @@ | |||
16 | #include "bu/sha1.h" | 17 | #include "bu/sha1.h" |
17 | #include "bu/json.h" | 18 | #include "bu/json.h" |
18 | 19 | ||
20 | #include "bu/mutexlocker.h" | ||
21 | |||
19 | #include <stdlib.h> | 22 | #include <stdlib.h> |
20 | 23 | ||
21 | Bu::ProtocolWebSocket::ProtocolWebSocket() : | 24 | Bu::ProtocolWebSocket::ProtocolWebSocket() : |
@@ -25,11 +28,17 @@ Bu::ProtocolWebSocket::ProtocolWebSocket() : | |||
25 | 28 | ||
26 | Bu::ProtocolWebSocket::~ProtocolWebSocket() | 29 | Bu::ProtocolWebSocket::~ProtocolWebSocket() |
27 | { | 30 | { |
31 | mClient.lock(); | ||
32 | printf("ProtocolWebSocket::~ProtocolWebSocket(): Clearing pClient (%p)\n", (void *)this->pClient ); | ||
33 | this->pClient = NULL; | ||
34 | mClient.unlock(); | ||
28 | } | 35 | } |
29 | 36 | ||
30 | void Bu::ProtocolWebSocket::onNewConnection( Bu::Client *pClient ) | 37 | void Bu::ProtocolWebSocket::onNewConnection( Bu::Client *pClient ) |
31 | { | 38 | { |
39 | mClient.lock(); | ||
32 | this->pClient = pClient; | 40 | this->pClient = pClient; |
41 | mClient.unlock(); | ||
33 | } | 42 | } |
34 | 43 | ||
35 | void Bu::ProtocolWebSocket::onNewData( Bu::Client * /*pClient*/ ) | 44 | void Bu::ProtocolWebSocket::onNewData( Bu::Client * /*pClient*/ ) |
@@ -95,6 +104,9 @@ void Bu::ProtocolWebSocket::writeMessage( const Bu::String &sData, | |||
95 | } | 104 | } |
96 | Bu::println(""); | 105 | Bu::println(""); |
97 | */ | 106 | */ |
107 | Bu::MutexLocker l( mClient ); | ||
108 | if( pClient == NULL ) | ||
109 | return; | ||
98 | pClient->write( cHeader, idx ); | 110 | pClient->write( cHeader, idx ); |
99 | pClient->write( sData ); | 111 | pClient->write( sData ); |
100 | } | 112 | } |
@@ -108,18 +120,21 @@ bool Bu::ProtocolWebSocket::stateProtoId() | |||
108 | Bu::StringList lChunks = sLine.split(' '); | 120 | Bu::StringList lChunks = sLine.split(' '); |
109 | if( lChunks.getSize() != 3 ) | 121 | if( lChunks.getSize() != 3 ) |
110 | { | 122 | { |
123 | Bu::MutexLocker l( mClient ); | ||
111 | pClient->disconnect(); | 124 | pClient->disconnect(); |
112 | return false; | 125 | return false; |
113 | } | 126 | } |
114 | Bu::StringList::iterator i = lChunks.begin(); | 127 | Bu::StringList::iterator i = lChunks.begin(); |
115 | if( *i != "GET" ) | 128 | if( *i != "GET" ) |
116 | { | 129 | { |
130 | Bu::MutexLocker l( mClient ); | ||
117 | pClient->disconnect(); | 131 | pClient->disconnect(); |
118 | return false; | 132 | return false; |
119 | } | 133 | } |
120 | sPath = *(++i); | 134 | sPath = *(++i); |
121 | if( *(++i) != "HTTP/1.1" ) | 135 | if( *(++i) != "HTTP/1.1" ) |
122 | { | 136 | { |
137 | Bu::MutexLocker l( mClient ); | ||
123 | pClient->disconnect(); | 138 | pClient->disconnect(); |
124 | return false; | 139 | return false; |
125 | } | 140 | } |
@@ -147,6 +162,7 @@ bool Bu::ProtocolWebSocket::stateHandshake() | |||
147 | int iPos = sLine.findIdx(':'); | 162 | int iPos = sLine.findIdx(':'); |
148 | if( iPos < 0 ) | 163 | if( iPos < 0 ) |
149 | { | 164 | { |
165 | Bu::MutexLocker l( mClient ); | ||
150 | pClient->disconnect(); | 166 | pClient->disconnect(); |
151 | return false; | 167 | return false; |
152 | } | 168 | } |
@@ -183,6 +199,7 @@ bool Bu::ProtocolWebSocket::readHttpHdrLine( Bu::String &sLine ) | |||
183 | 199 | ||
184 | bool Bu::ProtocolWebSocket::processHeaders() | 200 | bool Bu::ProtocolWebSocket::processHeaders() |
185 | { | 201 | { |
202 | Bu::MutexLocker l( mClient ); | ||
186 | if( !headerMatch("Connection", "Upgrade") || | 203 | if( !headerMatch("Connection", "Upgrade") || |
187 | !headerMatch("Upgrade", "websocket") || | 204 | !headerMatch("Upgrade", "websocket") || |
188 | !headerMatch("Sec-WebSocket-Version", "13") ) | 205 | !headerMatch("Sec-WebSocket-Version", "13") ) |
@@ -209,7 +226,7 @@ bool Bu::ProtocolWebSocket::processHeaders() | |||
209 | sum.writeResult( bOut ); | 226 | sum.writeResult( bOut ); |
210 | bOut.stop(); | 227 | bOut.stop(); |
211 | 228 | ||
212 | Bu::println("accept: %1").arg( mbOut.getString() ); | 229 | // Bu::println("accept: %1").arg( mbOut.getString() ); |
213 | 230 | ||
214 | pClient->write("HTTP/1.1 101 Switching Protocols\r\n" | 231 | pClient->write("HTTP/1.1 101 Switching Protocols\r\n" |
215 | "Upgrade: websocket\r\n" | 232 | "Upgrade: websocket\r\n" |
@@ -290,8 +307,8 @@ bool Bu::ProtocolWebSocket::parseMessage() | |||
290 | } | 307 | } |
291 | } | 308 | } |
292 | 309 | ||
293 | Bu::println(""); | 310 | // Bu::println(""); |
294 | Bu::println("Data: >>%1<<").arg( sData ); | 311 | // Bu::println("Data: >>%1<<").arg( sData ); |
295 | 312 | ||
296 | onNewMessage( sData, eOp ); | 313 | onNewMessage( sData, eOp ); |
297 | 314 | ||
diff --git a/src/unstable/protocolwebsocket.h b/src/unstable/protocolwebsocket.h index cf00d34..4a3d0a1 100644 --- a/src/unstable/protocolwebsocket.h +++ b/src/unstable/protocolwebsocket.h | |||
@@ -11,6 +11,8 @@ | |||
11 | #include "bu/protocol.h" | 11 | #include "bu/protocol.h" |
12 | #include "bu/hash.h" | 12 | #include "bu/hash.h" |
13 | 13 | ||
14 | #include "bu/mutex.h" | ||
15 | |||
14 | namespace Bu | 16 | namespace Bu |
15 | { | 17 | { |
16 | class ProtocolWebSocket : public Bu::Protocol | 18 | class ProtocolWebSocket : public Bu::Protocol |
@@ -58,6 +60,7 @@ namespace Bu | |||
58 | Status eStatus; | 60 | Status eStatus; |
59 | Bu::String sPath; | 61 | Bu::String sPath; |
60 | Bu::Hash<Bu::String, Bu::StringList> hHeader; | 62 | Bu::Hash<Bu::String, Bu::StringList> hHeader; |
63 | Bu::Mutex mClient; | ||
61 | }; | 64 | }; |
62 | } | 65 | } |
63 | 66 | ||
diff --git a/src/unstable/readwritemutex.cpp b/src/unstable/readwritemutex.cpp index 651a343..9719bfb 100644 --- a/src/unstable/readwritemutex.cpp +++ b/src/unstable/readwritemutex.cpp | |||
@@ -51,11 +51,11 @@ void Bu::ReadWriteMutex::unlockRead() | |||
51 | 51 | ||
52 | // | 52 | // |
53 | // The bWantWrite could be a counter like the read lock counter, however | 53 | // The bWantWrite could be a counter like the read lock counter, however |
54 | // once a write lock occurs and bWantWrite is set at least one wite | 54 | // once a write lock occurs and bWantWrite is set at least one write |
55 | // will definately occur. In practice most writes all happen one after | 55 | // will definately occur. In practice most writes all happen one after |
56 | // the other anyway and this way reads get a chance to mingle in. | 56 | // the other anyway and this way reads get a chance to mingle in. |
57 | // | 57 | // |
58 | // Really, just getting all currint reads to stop so a write can happen | 58 | // Really, just getting all current reads to stop so a write can happen |
59 | // I think is sufficient right now. | 59 | // I think is sufficient right now. |
60 | // | 60 | // |
61 | void Bu::ReadWriteMutex::lockWrite() | 61 | void Bu::ReadWriteMutex::lockWrite() |