[Top][All Lists]
[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();
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [myserver-commit] [2936] Fixed file descriptors leak.,
Giuseppe Scrivano <=