diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/stable/server.cpp | 35 | ||||
-rw-r--r-- | src/stable/server.h | 1 |
2 files changed, 22 insertions, 14 deletions
diff --git a/src/stable/server.cpp b/src/stable/server.cpp index 160b3eb..3aa8a34 100644 --- a/src/stable/server.cpp +++ b/src/stable/server.cpp | |||
@@ -204,13 +204,29 @@ void Bu::Server::addClient( const Bu::ServerSocket *pSrv, Bu::Socket *pSocket ) | |||
204 | ); | 204 | ); |
205 | { | 205 | { |
206 | Bu::MutexLocker l( mClients ); | 206 | Bu::MutexLocker l( mClients ); |
207 | if( hClients.has( iFdCli ) ) | 207 | if( hClients.has( iFdCli ) || hSockets.has( iFdCli ) ) |
208 | { | 208 | { |
209 | Bu::println("!!!!!!!!! hClients has %1 already.").arg( iFdCli ); | 209 | // Oops, it got closed and we haven't managed to get to it yet. |
210 | } | 210 | // We're not going to be able to write anyhting, we may as well |
211 | if( hSockets.has( iFdCli ) ) | 211 | // just clean up. |
212 | { | 212 | // |
213 | Bu::println("!!!!!!!!! hSockets has %1 already.").arg( iFdCli ); | 213 | // This can happen in a variety of situations, but mostly when |
214 | // we get a disconnect followed immediately be a reconnect. | ||
215 | struct epoll_event ev; | ||
216 | epoll_ctl( pCore->fdRead, EPOLL_CTL_DEL, iFdCli, &ev ); | ||
217 | epoll_ctl( pCore->fdWrite, EPOLL_CTL_DEL, iFdCli, &ev ); | ||
218 | Client *pOldClient = hClients.get( iFdCli ); | ||
219 | Socket *pOldSocket = hSockets.get( iFdCli ); | ||
220 | |||
221 | hClients.erase( iFdCli ); | ||
222 | hSockets.erase( iFdCli ); | ||
223 | |||
224 | onClosedConnection( pOldClient ); | ||
225 | pOldClient->close(); | ||
226 | pOldSocket->close(); | ||
227 | |||
228 | delete pOldClient; | ||
229 | delete pOldSocket; | ||
214 | } | 230 | } |
215 | hClients.insert( iFdCli, pClient ); | 231 | hClients.insert( iFdCli, pClient ); |
216 | hSockets.insert( iFdCli, pSocket ); | 232 | hSockets.insert( iFdCli, pSocket ); |
@@ -558,13 +574,6 @@ void Bu::Server::IoWorker::handleWrite( Client *pClient, Socket *pSocket ) | |||
558 | } | 574 | } |
559 | } | 575 | } |
560 | 576 | ||
561 | void Bu::Server::IoWorker::close( Bu::Socket *pSocket ) | ||
562 | { | ||
563 | // Bu::Server::fd iFd; | ||
564 | // pSocket->getFd( iFd ); | ||
565 | // rSrv.closeClient( iFd ); | ||
566 | } | ||
567 | |||
568 | ///////// | 577 | ///////// |
569 | // ClientWorker | 578 | // ClientWorker |
570 | //// | 579 | //// |
diff --git a/src/stable/server.h b/src/stable/server.h index a839968..9fb8282 100644 --- a/src/stable/server.h +++ b/src/stable/server.h | |||
@@ -161,7 +161,6 @@ namespace Bu | |||
161 | private: | 161 | private: |
162 | void handleRead( Client *pClient, Socket *pSocket ); | 162 | void handleRead( Client *pClient, Socket *pSocket ); |
163 | void handleWrite( Client *pClient, Socket *pSocket ); | 163 | void handleWrite( Client *pClient, Socket *pSocket ); |
164 | void close( Socket *pSocket ); | ||
165 | 164 | ||
166 | private: | 165 | private: |
167 | Server &rSrv; | 166 | Server &rSrv; |