1010
1111// Vector for holding all sockets
1212vector <CSocket*> vecSockets;
13+ deque <CSocket*> processQueue;
14+ deque <CSocket*> deleteList;
1315
1416void CSocketManager::DoPulse ()
1517{
1618 // Loop through all sockets
17- for (unsigned int i = 0 ; i < vecSockets.size (); ++i)
19+ processQueue = deque <CSocket*>(vecSockets.begin (), vecSockets.end ());
20+ while (!processQueue.empty ())
1821 {
19- // Get the socket by the ID
20- CSocket* pSocket = vecSockets[i] ;
22+ CSocket* pSocket = processQueue. front ();
23+ processQueue. pop_front () ;
2124
2225 // Do a pulse at the socket
2326 if (!pSocket->DoPulse ())
@@ -26,6 +29,14 @@ void CSocketManager::DoPulse()
2629 SocketRemove (pSocket);
2730 }
2831 }
32+
33+ // Finally cleanup sockets that were removed
34+ while (!deleteList.empty ())
35+ {
36+ CSocket* pSocket = deleteList.front ();
37+ deleteList.pop_front ();
38+ SAFE_DELETE (pSocket);
39+ }
2940}
3041
3142void CSocketManager::SocketAdd (CSocket*& pSocket)
@@ -34,26 +45,13 @@ void CSocketManager::SocketAdd(CSocket*& pSocket)
3445 vecSockets.push_back (pSocket);
3546}
3647
37- bool CSocketManager::SocketRemove (CSocket*& pSocket)
48+ void CSocketManager::SocketRemove (CSocket*& pSocket)
3849{
39- // Check if an socket was actually specified
40- if (pSocket == NULL )
41- return false ;
42-
43- // Loop through all sockets
44- for (unsigned int i = 0 ; i < vecSockets.size (); ++i)
45- {
46- // If the current is the one we're looking for...
47- if (vecSockets[i] == pSocket)
48- {
49- // Remove it from the vector and delete it, then return true
50- vecSockets.erase (vecSockets.begin () + i);
51- SAFE_DELETE (pSocket);
52- return true ;
53- }
54- }
55-
56- return false ;
50+ ListRemove (vecSockets, pSocket);
51+ ListRemove (processQueue, pSocket);
52+ pSocket->CloseSocketWithEvent ();
53+ ListRemove (deleteList, pSocket);
54+ deleteList.push_back (pSocket);
5755}
5856
5957bool CSocketManager::GetSocket (CSocket*& pSocket, void * pUserdata)
@@ -82,4 +80,11 @@ void CSocketManager::HandleStop()
8280 // Triggered at module stop. Simply destroys all sockets
8381 for (unsigned int i = 0 ; i < vecSockets.size (); ++i)
8482 SAFE_DELETE (vecSockets[i]);
83+
84+ for (unsigned int i = 0 ; i < deleteList.size (); ++i)
85+ SAFE_DELETE (deleteList[i]);
86+
87+ vecSockets.clear ();
88+ processQueue.clear ();
89+ deleteList.clear ();
8590}
0 commit comments