myserver-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[myserver-commit] [2936] Fixed file descriptors leak.


From: Giuseppe Scrivano
Subject: [myserver-commit] [2936] Fixed file descriptors leak.
Date: Tue, 04 Nov 2008 21:29:19 +0000

Revision: 2936
          http://svn.sv.gnu.org/viewvc/?view=rev&root=myserver&revision=2936
Author:   gscrivano
Date:     2008-11-04 21:29:18 +0000 (Tue, 04 Nov 2008)

Log Message:
-----------
Fixed file descriptors leak.  Don't re-initialize libevent if it was already.

Modified Paths:
--------------
    trunk/myserver/include/connections_scheduler/connections_scheduler.h
    trunk/myserver/src/base/socket/socket.cpp
    trunk/myserver/src/connections_scheduler/connections_scheduler.cpp
    trunk/myserver/src/server/server.cpp

Modified: trunk/myserver/include/connections_scheduler/connections_scheduler.h
===================================================================
--- trunk/myserver/include/connections_scheduler/connections_scheduler.h        
2008-11-03 12:09:59 UTC (rev 2935)
+++ trunk/myserver/include/connections_scheduler/connections_scheduler.h        
2008-11-04 21:29:18 UTC (rev 2936)
@@ -69,7 +69,7 @@
     bool terminated; 
     bool terminate;
     Mutex* mutex;
-    int fd[2];
+    FileHandle fd[2];
     event loopEvent;
     Server* server;
     ConnectionsScheduler* scheduler;

Modified: trunk/myserver/src/base/socket/socket.cpp
===================================================================
--- trunk/myserver/src/base/socket/socket.cpp   2008-11-03 12:09:59 UTC (rev 
2935)
+++ trunk/myserver/src/base/socket/socket.cpp   2008-11-04 21:29:18 UTC (rev 
2936)
@@ -434,8 +434,7 @@
        */
       if(toSend)
       {
-        while((getTicks() <= time) && !denyBlockingOperations)
-          Thread::wait(1);
+        Thread::wait(getTicks () - time);
       }
       else
         break;
@@ -452,14 +451,13 @@
 int Socket::ioctlsocket(long cmd,unsigned long* argp)
 {
 #ifdef WIN32
-  return ::ioctlsocket(socketHandle,cmd,argp);
+  return ::ioctlsocket(socketHandle, cmd, argp);
 #endif
 #ifdef NOT_WIN
   int int_argp = 0;
-  int ret = ::ioctl((int)socketHandle,cmd,&int_argp);
+  int ret = ::ioctl((int)socketHandle, cmd, &int_argp);
   *argp = int_argp;
   return ret;
-
 #endif
 }
 

Modified: trunk/myserver/src/connections_scheduler/connections_scheduler.cpp
===================================================================
--- trunk/myserver/src/connections_scheduler/connections_scheduler.cpp  
2008-11-03 12:09:59 UTC (rev 2935)
+++ trunk/myserver/src/connections_scheduler/connections_scheduler.cpp  
2008-11-04 21:29:18 UTC (rev 2936)
@@ -27,64 +27,77 @@
 #endif
 
 static int
-create_socketpair(int af, int type, int protocol, socket_t socks[2])
+make_socket_nonblocking(FileHandle fd)
 {
-  #ifndef WIN32
-  return socketpair(af, type, protocol, socks);
-  #else
-   struct sockaddr_in addr;
-    SOCKET listener;
-    int e;
-    int addrlen = sizeof(addr);
-    DWORD flags = 0;
+#ifdef WIN32
+  unsigned long nonblocking = 1;
+  ioctlsocket(fd, FIONBIO, (unsigned long*) &nonblocking);
+#else
+  return fcntl(fd, F_SETFL, O_NONBLOCK);
+#endif
+  return 0;
+}
 
-    if (socks == 0)
-    {
-        return -1;
-    }
+static int
+create_socketpair(int af, int type, int protocol, FileHandle socks[2])
+{
+#ifndef WIN32
+  return socketpair(af, type, protocol, (int*)socks);
+#else
+  struct sockaddr_in addr;
+  SOCKET listener;
+  int e;
+  int addrlen = sizeof(addr);
+  DWORD flags = 0;
+  
+  if (socks == 0)
+    return -1;
 
-    socks[0] = socks[1] = INVALID_SOCKET;
-    listener = socket(AF_INET, type, 0);
-    if (listener == INVALID_SOCKET)
-        return -1;
+  socks[0] = socks[1] = INVALID_SOCKET;
+  listener = socket(AF_INET, type, 0);
 
-    memset(&addr, 0, sizeof(addr));
-    addr.sin_family = AF_INET;
-    addr.sin_addr.s_addr = htonl(0x7f000001);
-    addr.sin_port = 0;
+  if (listener == INVALID_SOCKET)
+    return -1;
 
-    e = bind(listener, (const struct sockaddr*) &addr, sizeof(addr));
-    if (e == SOCKET_ERROR)
-    {
-        close(listener);
-        return -1;
-    }
-    e = getsockname(listener, (struct sockaddr*) &addr, &addrlen);
-    if (e == SOCKET_ERROR)
-    {
-        close(listener);
-        return -1;
-    }
+  memset(&addr, 0, sizeof(addr));
+  addr.sin_family = AF_INET;
+  addr.sin_addr.s_addr = htonl(0x7f000001);
+  addr.sin_port = 0;
 
-    do
-    {
-      if (listen(listener, 1) == SOCKET_ERROR)
-        break;
-      if ((socks[0] = socket(AF_INET, type, 0)) == INVALID_SOCKET)
-        break;
-      if (connect(socks[0], (const struct sockaddr*) &addr, sizeof(addr)) == 
SOCKET_ERROR)
-        break;
-      if ((socks[1] = accept(listener, NULL, NULL)) == INVALID_SOCKET)
-        break;
-      
-      close(listener);
-      return 0;
-    } while (0);
-
+  e = bind(listener, (const struct sockaddr*) &addr, sizeof(addr));
+  if (e == SOCKET_ERROR)
+  {
     close(listener);
-    close(socks[0]);
-    close(socks[1]);
     return -1;
+  }
+  
+  e = getsockname(listener, (struct sockaddr*) &addr, &addrlen);
+  if (e == SOCKET_ERROR)
+  {
+    close(listener);
+    return -1;
+  }
+  
+  do
+  {
+    if (listen(listener, 1) == SOCKET_ERROR)
+      break;
+    if ((socks[0] = socket(AF_INET, type, 0)) == INVALID_SOCKET)
+      break;
+    if (connect(socks[0], (const struct sockaddr*) &addr, sizeof(addr)) == 
SOCKET_ERROR)
+      break;
+    if ((socks[1] = accept(listener, NULL, NULL)) == INVALID_SOCKET)
+      break;
+    
+    close(listener);
+    return 0;
+  } while (0);
+  
+  close(listener);
+  close(socks[0]);
+  close(socks[1]);
+  
+  return -1;
   #endif
 }
 
@@ -337,14 +350,22 @@
  */
 void ConnectionsScheduler::initialize()
 {
-  event_init();
+  static int initialized = 0;
 
+  if (!initialized)
+  {
+    event_init();
+    initialized = 1;
+  }
+
   dispatcherArg.terminated = true;
   dispatcherArg.terminate = false;
   dispatcherArg.mutex = &eventsMutex;
   dispatcherArg.server = server;
   dispatcherArg.scheduler = this;
 
+  dispatchedThreadId = 0;
+
 #ifdef WIN32
 #define LOCAL_SOCKETPAIR_AF AF_INET
 #else
@@ -362,8 +383,11 @@
     return;
   }
 
+  make_socket_nonblocking(dispatcherArg.fd[0]);
+  make_socket_nonblocking(dispatcherArg.fd[1]);
+
   event_set(&(dispatcherArg.loopEvent), dispatcherArg.fd[0], EV_READ | 
EV_TIMEOUT,
-         eventLoopHandler, &dispatcherArg);
+            eventLoopHandler, &dispatcherArg);
 
   event_add(&(dispatcherArg.loopEvent), NULL);
 
@@ -479,7 +503,7 @@
   if(lock)
   {
     u_long nbw;
-    Socket sock ((FileHandle)dispatcherArg.fd[1]);
+    Socket sock (dispatcherArg.fd[1]);
 
     eventsSocketMutex.lock();
     sock.write("c", 1, &nbw);
@@ -545,18 +569,19 @@
   releasing = true;
   dispatcherArg.terminate = true;
 
-  if(server)
+  if (server)
     max = server->getNumThreads() * 2;
 
-  for(u_long i = 0; i < max; i++)
+  for (u_long i = 0; i < max; i++)
   {
     readySemaphore->unlock();
   }
 
-  Socket sock((FileHandle)dispatcherArg.fd[1]);
+  Socket sockR (dispatcherArg.fd[0]);
+  Socket sockW (dispatcherArg.fd[1]);
 
   eventsSocketMutex.lock();
-  sock.write("r", 1, &nbw);
+  sockW.write("r", 1, &nbw);
   eventsSocketMutex.unlock();
   
   if(dispatchedThreadId)
@@ -577,12 +602,15 @@
 
   event_del(&(dispatcherArg.loopEvent));
 
-  close(dispatcherArg.fd[0]);
-  close(dispatcherArg.fd[1]);
-
   listeners.clear();
   
   eventsMutex.unlock();
+
+  sockR.shutdown(SD_BOTH);
+  sockW.shutdown(SD_BOTH);
+
+  sockR.close();
+  sockW.close();
 }
 
 /*!

Modified: trunk/myserver/src/server/server.cpp
===================================================================
--- trunk/myserver/src/server/server.cpp        2008-11-03 12:09:59 UTC (rev 
2935)
+++ trunk/myserver/src/server/server.cpp        2008-11-04 21:29:18 UTC (rev 
2936)
@@ -634,10 +634,10 @@
 
           logWriteln("Rebooting...");
 
+          Socket::stopBlockingOperations(true);
+
           connectionsScheduler.release();
 
-          Socket::stopBlockingOperations(true);
-
           listenThreads.beginFastReboot();
 
           listenThreads.terminate();






reply via email to

[Prev in Thread] Current Thread [Next in Thread]