[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[myserver-commit] [2814] Added getHandle to the Stream class.
From: |
Giuseppe Scrivano |
Subject: |
[myserver-commit] [2814] Added getHandle to the Stream class. |
Date: |
Sun, 14 Sep 2008 21:09:19 +0000 |
Revision: 2814
http://svn.sv.gnu.org/viewvc/?view=rev&root=myserver&revision=2814
Author: gscrivano
Date: 2008-09-14 21:09:18 +0000 (Sun, 14 Sep 2008)
Log Message:
-----------
Added getHandle to the Stream class. Now the same getHandle method signature
is shared between Socket and File.
Modified Paths:
--------------
trunk/myserver/include/base/file/file.h
trunk/myserver/include/base/socket/socket.h
trunk/myserver/include/connections_scheduler/connections_scheduler.h
trunk/myserver/include/filter/stream.h
trunk/myserver/src/base/process/process_server_manager.cpp
trunk/myserver/src/base/socket/socket.cpp
trunk/myserver/src/connections_scheduler/connections_scheduler.cpp
trunk/myserver/src/connections_scheduler/listen_threads.cpp
trunk/myserver/src/filter/stream.cpp
trunk/myserver/src/protocol/ftp/ftp.cpp
Modified: trunk/myserver/include/base/file/file.h
===================================================================
--- trunk/myserver/include/base/file/file.h 2008-09-14 18:19:19 UTC (rev
2813)
+++ trunk/myserver/include/base/file/file.h 2008-09-14 21:09:18 UTC (rev
2814)
@@ -22,13 +22,6 @@
#include <include/filter/stream.h>
#include <string>
-#ifdef WIN32
-typedef void* FileHandle;
-#endif
-#ifdef NOT_WIN
-typedef long FileHandle;
-#endif
-
using namespace std;
class File : public Stream
Modified: trunk/myserver/include/base/socket/socket.h
===================================================================
--- trunk/myserver/include/base/socket/socket.h 2008-09-14 18:19:19 UTC (rev
2813)
+++ trunk/myserver/include/base/socket/socket.h 2008-09-14 21:09:18 UTC (rev
2814)
@@ -39,7 +39,6 @@
#ifndef SOCKETLIBINCLUDED
extern "C"
{
- //#include <ws2tcpip.h>
#include <winsock2.h>
}
#define SOCKETLIBINCLUDED
@@ -68,11 +67,8 @@
#define MAX_IP_STRING_LEN 32
#endif
-typedef unsigned int SocketHandle;
typedef struct sockaddr_storage MYSERVER_SOCKADDR_STORAGE;
typedef struct sockaddr_storage MYSERVER_SOCKADDRIN;
-//typedef struct sockaddr_in MYSERVER_SOCKADDRIN;
-//typedef struct sockaddr MYSERVER_SOCKADDR;
typedef struct sockaddr_storage MYSERVER_SOCKADDR;
typedef struct hostent MYSERVER_HOSTENT;
int startupSocketLib(u_short);
@@ -84,8 +80,8 @@
Socket* getServerSocket();
static void stopBlockingOperations(bool);
- SocketHandle getHandle();
- int setHandle(SocketHandle);
+ virtual FileHandle getHandle();
+ int setHandle(FileHandle);
static MYSERVER_HOSTENT *gethostbyaddr(char* addr, int len, int type);
static MYSERVER_HOSTENT *gethostbyname(const char*);
static int gethostname(char*, int);
@@ -94,7 +90,7 @@
int listen(int);
Socket();
Socket(Socket*);
- Socket(SocketHandle);
+ Socket(FileHandle);
Socket accept(MYSERVER_SOCKADDR*, int*);
int setsockopt(int,int, const char*,int);
@@ -112,11 +108,8 @@
int operator=(Socket);
int getsockname(MYSERVER_SOCKADDR*,int*);
int setNonBlocking(int);
-#ifdef __HURD__
- virtual int dataOnRead(int sec = 1, int usec = 500);
-#else
virtual int dataOnRead(int sec = 0, int usec = 500);
-#endif
+
u_long getThrottling();
void setThrottling(u_long);
static int getLocalIPsList(string&);
@@ -125,7 +118,7 @@
virtual int write(const char* buffer, u_long len, u_long *nbw);
protected:
- SocketHandle socketHandle;
+ FileHandle socketHandle;
/*! Pointer to the socket that has accepted this connection. */
Socket *serverSocket;
Modified: trunk/myserver/include/connections_scheduler/connections_scheduler.h
===================================================================
--- trunk/myserver/include/connections_scheduler/connections_scheduler.h
2008-09-14 18:19:19 UTC (rev 2813)
+++ trunk/myserver/include/connections_scheduler/connections_scheduler.h
2008-09-14 21:09:18 UTC (rev 2814)
@@ -100,7 +100,7 @@
u_long getNumTotalConnections();
- void newData(short event, SocketHandle handle);
+ void newData(short event, FileHandle handle);
private:
Server* server;
@@ -114,7 +114,7 @@
Mutex eventsMutex;
Mutex eventsSocketMutex;
queue<ConnectionPtr> *ready;
- HashMap<SocketHandle, ConnectionPtr> connections;
+ HashMap<FileHandle, ConnectionPtr> connections;
list<ListenerArg*> listeners;
u_long currentPriority;
u_long currentPriorityDone;
Modified: trunk/myserver/include/filter/stream.h
===================================================================
--- trunk/myserver/include/filter/stream.h 2008-09-14 18:19:19 UTC (rev
2813)
+++ trunk/myserver/include/filter/stream.h 2008-09-14 21:09:18 UTC (rev
2814)
@@ -1,6 +1,6 @@
/*
MyServer
-Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+Copyright (C) 2002, 2003, 2004, 2008 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
@@ -20,6 +20,13 @@
#include "stdafx.h"
+#ifdef WIN32
+typedef void* FileHandle;
+#endif
+#ifdef NOT_WIN
+typedef long FileHandle;
+#endif
+
/*!
*Abstract class to handle virtual data streams.
*/
@@ -29,6 +36,7 @@
virtual int read(char* buffer, u_long len, u_long*);
virtual int write(const char* buffer, u_long len, u_long*);
virtual int flush(u_long*);
+ virtual FileHandle getHandle();
Stream();
/*! Avoid direct instances of this class. */
virtual ~Stream() = 0;
Modified: trunk/myserver/src/base/process/process_server_manager.cpp
===================================================================
--- trunk/myserver/src/base/process/process_server_manager.cpp 2008-09-14
18:19:19 UTC (rev 2813)
+++ trunk/myserver/src/base/process/process_server_manager.cpp 2008-09-14
21:09:18 UTC (rev 2814)
@@ -405,7 +405,7 @@
server->port = (initialPort + nServers++);
server->socket.socket(AF_INET,SOCK_STREAM,0);
- if(server->socket.getHandle() != (SocketHandle)INVALID_SOCKET)
+ if(server->socket.getHandle() != (FileHandle)INVALID_SOCKET)
{
((sockaddr_in *)(&serverSockAddrIn))->sin_family = AF_INET;
@@ -480,7 +480,7 @@
{
#if HAVE_IPV6 && 0
server->socket.socket(AF_INET6, SOCK_STREAM, 0);
- if(server->socket.getHandle() != (SocketHandle)INVALID_SOCKET)
+ if(server->socket.getHandle() != (FileHandle)INVALID_SOCKET)
{
((sockaddr_in6 *)(&serverSockAddrIn))->sin6_family = AF_INET6;
Modified: trunk/myserver/src/base/socket/socket.cpp
===================================================================
--- trunk/myserver/src/base/socket/socket.cpp 2008-09-14 18:19:19 UTC (rev
2813)
+++ trunk/myserver/src/base/socket/socket.cpp 2008-09-14 21:09:18 UTC (rev
2814)
@@ -56,9 +56,9 @@
}
/*!
- *Returns the base/socket/socket.handle
+ *Returns the socket handle
*/
-SocketHandle Socket::getHandle()
+FileHandle Socket::getHandle()
{
return socketHandle;
}
@@ -66,7 +66,7 @@
/*!
*Set the handle for the socket
*/
-int Socket::setHandle(SocketHandle h)
+int Socket::setHandle(FileHandle h)
{
socketHandle = h;
return 1;
@@ -94,14 +94,14 @@
*/
int Socket::socket(int af, int type, int protocol)
{
- socketHandle = (SocketHandle)::socket(af, type, protocol);
+ socketHandle = (FileHandle)::socket(af, type, protocol);
return (int)socketHandle;
}
/*!
*Set the base/socket/socket.handle.
*/
-Socket::Socket(SocketHandle handle)
+Socket::Socket(FileHandle handle)
{
throttlingRate = 0;
setHandle(handle);
@@ -196,7 +196,7 @@
Socket s;
#ifdef WIN32
- SocketHandle h = (SocketHandle)::accept(socketHandle,(struct sockaddr*)sa,
+ FileHandle h = (FileHandle)::accept(socketHandle,(struct sockaddr*)sa,
sockaddrlen);
s.setHandle(h);
#endif
Modified: trunk/myserver/src/connections_scheduler/connections_scheduler.cpp
===================================================================
--- trunk/myserver/src/connections_scheduler/connections_scheduler.cpp
2008-09-14 18:19:19 UTC (rev 2813)
+++ trunk/myserver/src/connections_scheduler/connections_scheduler.cpp
2008-09-14 21:09:18 UTC (rev 2814)
@@ -68,18 +68,17 @@
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;
-
- closesocket(listener);
- return 0;
-
+ 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;
+
+ closesocket(listener);
+ return 0;
} while (0);
closesocket(listener);
@@ -123,8 +122,9 @@
da->mutex->unlock();
return 0;
}
+
da->terminated = false;
- da->terminate = false;
+
da->mutex->unlock();
while(!da->terminate)
@@ -149,16 +149,16 @@
return NULL;
}
-static void newDataHandler(int fd, short event, void *arg)
+static void newDataHandler(int fd, short event, void *param)
{
- ConnectionsScheduler* scheduler = (ConnectionsScheduler*) arg;
+ ConnectionsScheduler::DispatcherArg* arg =
(ConnectionsScheduler::DispatcherArg*) param;
- if(scheduler)
- scheduler->newData(event, (SocketHandle)fd);
+ if(!arg->terminate && arg->scheduler)
+ arg->scheduler->newData(event, (FileHandle)fd);
}
-void ConnectionsScheduler::newData(short event, SocketHandle handle)
+void ConnectionsScheduler::newData(short event, FileHandle handle)
{
ConnectionPtr connection = connections.get(handle);
@@ -192,20 +192,22 @@
/*
*Schedule a new connection.
*The 'c' command is followed by:
- *SocketHandle -> Socket to monitor for new data.
+ *FileHandle -> Socket to monitor for new data.
*ConnectionPtr -> Related Connection.
*timeval -> Timeout.
*/
- SocketHandle handle;
+ FileHandle handle;
ConnectionPtr c;
timeval tv = {10, 0};
- sock.recv((char*)&handle, sizeof(SocketHandle), 0);
+ sock.recv((char*)&handle, sizeof(FileHandle), 0);
sock.recv((char*)&c, sizeof(ConnectionPtr), 0);
sock.recv((char*)&tv, sizeof(timeval), 0);
- event_once(handle, EV_READ | EV_TIMEOUT, newDataHandler,
da->scheduler, &tv);
+ event_once(handle, EV_READ | EV_TIMEOUT, newDataHandler, da, &tv);
}
+ if(cmd == 'r')
+ break;
/* Handle other cmd without do anything else. */
}
@@ -232,8 +234,7 @@
asock = s->serverSocket->accept(&asockIn, &asockInLen);
if(s->server &&
- asock.getHandle() != 0 &&
- asock.getHandle() != (SocketHandle)INVALID_SOCKET)
+ asock.getHandle() != (FileHandle)INVALID_SOCKET)
{
s->server->addConnection(asock, &asockIn);
}
@@ -348,9 +349,10 @@
{
static timeval tv = {1, 0};
- event_init();
+ event_init();
dispatcherArg.terminated = true;
+ dispatcherArg.terminate = false;
dispatcherArg.mutex = &eventsMutex;
dispatcherArg.server = server;
dispatcherArg.scheduler = this;
@@ -361,7 +363,8 @@
#define LOCAL_SOCKETPAIR_AF AF_UNIX
#endif
int err = create_socketpair(LOCAL_SOCKETPAIR_AF, SOCK_STREAM, 0,
- dispatcherArg.fd);
+ dispatcherArg.fd);
+
if (err == -1)
{
if(server)
@@ -477,12 +480,12 @@
void ConnectionsScheduler::addWaitingConnectionImpl(ConnectionPtr c, int lock)
{
static timeval tv = {10, 0};
- SocketHandle handle = c->socket ? c->socket->getHandle() : NULL;
+ FileHandle handle = c->socket ? c->socket->getHandle() : NULL;
if(server)
tv.tv_sec = server->getTimeout() / 1000;
else
- tv.tv_sec = 30000;
+ tv.tv_sec = 30;
c->setScheduled(0);
@@ -503,14 +506,14 @@
eventsSocketMutex.lock();
sock.write("c", 1, &nbw);
- sock.write((char*)&handle, sizeof(SocketHandle), &nbw);
+ sock.write((char*)&handle, sizeof(FileHandle), &nbw);
sock.write((char*)&c, sizeof(ConnectionPtr), &nbw);
sock.write((char*)&tv, sizeof(timeval), &nbw);
eventsSocketMutex.unlock();
}
else
{
- event_once(handle, EV_READ | EV_TIMEOUT, newDataHandler, this, &tv);
+ event_once(handle, EV_READ | EV_TIMEOUT, newDataHandler, &dispatcherArg,
&tv);
}
}
@@ -542,7 +545,7 @@
if(ready[currentPriority].size())
{
- SocketHandle handle;
+ FileHandle handle;
ret = ready[currentPriority].front();
ret->setScheduled(0);
@@ -562,7 +565,8 @@
*/
void ConnectionsScheduler::release()
{
- u_long max = 100;
+ u_long nbw;
+ u_long max = 0;
releasing = true;
dispatcherArg.terminate = true;
@@ -574,17 +578,12 @@
readySemaphore->unlock();
}
- event_loopexit(NULL);
-#if EVENT_LOOPBREAK | WIN32
- event_loopbreak();
-#endif
- u_long nbw;
- Socket sock(dispatcherArg.fd[1]);
+ Socket sock(dispatcherArg.fd[1]);
- eventsSocketMutex.lock();
- sock.write("r", 1, &nbw);
- eventsSocketMutex.unlock();
-
+ eventsSocketMutex.lock();
+ sock.write("r", 1, &nbw);
+ eventsSocketMutex.unlock();
+
if(dispatchedThreadId)
Thread::join(dispatchedThreadId);
@@ -622,7 +621,7 @@
connectionsMutex.lock();
- HashMap<SocketHandle, ConnectionPtr>::Iterator it = connections.begin();
+ HashMap<FileHandle, ConnectionPtr>::Iterator it = connections.begin();
for(; it != connections.end(); it++)
out.push_back(*it);
@@ -654,15 +653,17 @@
void ConnectionsScheduler::terminateConnections()
{
int i;
+
try
{
connectionsMutex.lock();
- HashMap<SocketHandle, ConnectionPtr>::Iterator it = connections.begin();
+ HashMap<FileHandle, ConnectionPtr>::Iterator it = connections.begin();
for(; it != connections.end(); it++)
{
- if ( (*it)->allowDelete(true) )
- (*it)->socket->closesocket();
+ ConnectionPtr c = *it;
+ if ( c->allowDelete(true) && c->socket)
+ c->socket->closesocket();
}
}
catch(...)
@@ -695,7 +696,7 @@
try
{
- for(HashMap<SocketHandle, ConnectionPtr>::Iterator it =
connections.begin();
+ for(HashMap<FileHandle, ConnectionPtr>::Iterator it = connections.begin();
it != connections.end() && !ret;
it++)
{
Modified: trunk/myserver/src/connections_scheduler/listen_threads.cpp
===================================================================
--- trunk/myserver/src/connections_scheduler/listen_threads.cpp 2008-09-14
18:19:19 UTC (rev 2813)
+++ trunk/myserver/src/connections_scheduler/listen_threads.cpp 2008-09-14
21:09:18 UTC (rev 2814)
@@ -94,7 +94,7 @@
{
server->logWriteln(languageParser->getValue("MSG_SSOCKCREATE"));
serverSocketIPv4->socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (serverSocketIPv4->getHandle() == (SocketHandle)INVALID_SOCKET)
+ if (serverSocketIPv4->getHandle() == (FileHandle)INVALID_SOCKET)
{
server->logPreparePrintError();
server->logWriteln(languageParser->getValue("ERR_OPENP"));
@@ -159,7 +159,7 @@
{
server->logWriteln(languageParser->getValue("MSG_SSOCKCREATE"));
serverSocketIPv6->socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
- if ( serverSocketIPv6->getHandle() == (SocketHandle)INVALID_SOCKET )
+ if ( serverSocketIPv6->getHandle() == (FileHandle)INVALID_SOCKET )
{
server->logPreparePrintError();
server->logWriteln(languageParser->getValue("ERR_OPENP"));
Modified: trunk/myserver/src/filter/stream.cpp
===================================================================
--- trunk/myserver/src/filter/stream.cpp 2008-09-14 18:19:19 UTC (rev
2813)
+++ trunk/myserver/src/filter/stream.cpp 2008-09-14 21:09:18 UTC (rev
2814)
@@ -57,3 +57,11 @@
{
}
+
+/*!
+ *Get the file handle.
+ */
+FileHandle Stream::getHandle()
+{
+ return 0;
+}
Modified: trunk/myserver/src/protocol/ftp/ftp.cpp
===================================================================
--- trunk/myserver/src/protocol/ftp/ftp.cpp 2008-09-14 18:19:19 UTC (rev
2813)
+++ trunk/myserver/src/protocol/ftp/ftp.cpp 2008-09-14 21:09:18 UTC (rev
2814)
@@ -581,7 +581,7 @@
{
asockInLen = sizeof(sockaddr_in);
asock = pFtpUserData->m_pDataConnection->socket->accept(&asockIn,
&asockInLen);
- if ( asock.getHandle() == (SocketHandle)INVALID_SOCKET )
+ if ( asock.getHandle() == (FileHandle)INVALID_SOCKET )
return;
pFtpUserData->m_pDataConnection->socket->shutdown(SD_BOTH);
@@ -1575,7 +1575,7 @@
Socket *pSocket = new Socket();
pSocket->socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if ( pSocket->getHandle() == (SocketHandle)INVALID_SOCKET )
+ if ( pSocket->getHandle() == (FileHandle)INVALID_SOCKET )
return 0;
int nReuseAddr = 1;
MYSERVER_SOCKADDR_STORAGE storage = { 0 };
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [myserver-commit] [2814] Added getHandle to the Stream class.,
Giuseppe Scrivano <=