From ff1b0d7d28a198d55ffd5f0fd61c136a26d2e740 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michal=20Voc=C5=AF?= Date: Thu, 28 Jun 2007 08:07:40 +0000 Subject: [PATCH] work in progress~ --- org.glite.lb.logger/src-nt/Connection.H | 2 +- org.glite.lb.logger/src-nt/EventManager.H | 55 +++++++------------------- org.glite.lb.logger/src-nt/EventManager.cpp | 2 + org.glite.lb.logger/src-nt/HTTPTransport.H | 6 +-- org.glite.lb.logger/src-nt/HTTPTransport.cpp | 12 ++++-- org.glite.lb.logger/src-nt/Makefile | 2 +- org.glite.lb.logger/src-nt/PlainConnection.H | 7 ++-- org.glite.lb.logger/src-nt/PlainConnection.cpp | 3 -- org.glite.lb.logger/src-nt/PluginManager.H | 2 + org.glite.lb.logger/src-nt/PluginManager.cpp | 3 ++ org.glite.lb.logger/src-nt/SocketInput.cpp | 1 - org.glite.lb.logger/src-nt/ThreadPool.H | 2 + org.glite.lb.logger/src-nt/ThreadPool.cpp | 7 +++- org.glite.lb.logger/src-nt/Transport.H | 4 +- org.glite.lb.logger/src-nt/main.cpp | 6 ++- 15 files changed, 51 insertions(+), 63 deletions(-) create mode 100644 org.glite.lb.logger/src-nt/EventManager.cpp diff --git a/org.glite.lb.logger/src-nt/Connection.H b/org.glite.lb.logger/src-nt/Connection.H index 75d20d7..158eaa1 100644 --- a/org.glite.lb.logger/src-nt/Connection.H +++ b/org.glite.lb.logger/src-nt/Connection.H @@ -9,7 +9,7 @@ public: virtual Connection *newConnection(int fd) const = 0; virtual Connection *accept(int fd) const = 0; - virtual ~Factory() = 0; + virtual ~Factory(); }; class Endpoint { diff --git a/org.glite.lb.logger/src-nt/EventManager.H b/org.glite.lb.logger/src-nt/EventManager.H index 2a12b7a..355260d 100644 --- a/org.glite.lb.logger/src-nt/EventManager.H +++ b/org.glite.lb.logger/src-nt/EventManager.H @@ -3,71 +3,44 @@ #include -#include "Singleton.H" // interface -// type for return code of event handler -typedef enum { - NOT_HANDLED, // the event was not handled at all - HANDLED, // the event was handled succesfully - HANDLED_FINAL // the event was handled, - // no other handlers should be called -} eventstatus_t; - - class Event { }; -template +template class EventHandler { public: - virtual eventstatus_t handleEvent(T *&e); -}; - - -template -class EventManagerForType: public Singleton< EventManagerForType > { -public: + typedef int (THandler::*EventHandlerType)(TEvent* &); -protected: - void registerHandler(EventHandler *); - void registerHandlerFirst(EventHandler *); + private: - + std::list m_handlers; }; -class EventManager: public Singleton { +class EventManager { public: - eventstatus_t postEvent(Event *); - - template - void registerHandler(EventHandler *h) { - EventManagerForType::instance()->registerHandler(h); - } + // constants for event handler return codes + static const int NOT_HANDLED = 0; + static const int HANDLED = 1; + static const int HANDLED_FINAL = 2; + static const int HANDLED_NEW = 3; + int postEvent(Event* &event); + template - void registerHandlerFirst(EventHandler *) { - EventManagerForType::instance()->registerHandlerFirst(h); - } - -protected: - EventManager() - {} - - virtual ~EventManager() - {} + registerHandler(, int priority); private: - + std::list< }; - // implementation #endif diff --git a/org.glite.lb.logger/src-nt/EventManager.cpp b/org.glite.lb.logger/src-nt/EventManager.cpp new file mode 100644 index 0000000..0ab0674 --- /dev/null +++ b/org.glite.lb.logger/src-nt/EventManager.cpp @@ -0,0 +1,2 @@ +#include "EventManager.H" + diff --git a/org.glite.lb.logger/src-nt/HTTPTransport.H b/org.glite.lb.logger/src-nt/HTTPTransport.H index 417deea..37c91d7 100644 --- a/org.glite.lb.logger/src-nt/HTTPTransport.H +++ b/org.glite.lb.logger/src-nt/HTTPTransport.H @@ -3,6 +3,7 @@ #include "ThreadPool.H" #include "Transport.H" +#include "Singleton.H" #include @@ -10,7 +11,8 @@ class HTTPTransport: public Transport { public: - class Factory: public Transport::Factory { + class Factory: public Transport::Factory, + public Singleton { public: virtual Transport *newTransport(Connection *conn) const { if(conn) @@ -20,8 +22,6 @@ public: } }; - static Factory theFactory; - HTTPTransport(Connection *conn) : Transport(conn), state(NONE), diff --git a/org.glite.lb.logger/src-nt/HTTPTransport.cpp b/org.glite.lb.logger/src-nt/HTTPTransport.cpp index 4c99a82..6908f80 100644 --- a/org.glite.lb.logger/src-nt/HTTPTransport.cpp +++ b/org.glite.lb.logger/src-nt/HTTPTransport.cpp @@ -1,13 +1,11 @@ #include "HTTPTransport.H" #include "Exception.H" +#include "EventManager.H" #include #include -HTTPTransport::Factory HTTPTransport::theFactory; - - HTTPTransport::~HTTPTransport() { if(body) free(body); @@ -29,9 +27,11 @@ HTTPTransport::onReady() len = conn->read(pos, sizeof(buffer) - (pos - buffer)); if(len < 0) { // error during request + // XXX - handle this state = NONE; } else if(len == 0) { // other side closed connection + // XXX - handle this state = NONE; } else { char *cr = NULL, *p = buffer, *s = buffer; @@ -114,6 +114,7 @@ HTTPTransport::onReady() } } else { // report error + // XXX - this may happen, do not handle using exceptions std::cout << "Wrong content length" << std::endl; throw new Exception(); } @@ -137,7 +138,7 @@ HTTPTransport::onReady() state = NONE; } else { pos += len; - if(pos - body == content_length) { + if(pos == content_length + body) { // finished reading state = NONE; } @@ -148,9 +149,12 @@ HTTPTransport::onReady() if(state != NONE) ThreadPool::instance()->queueWorkRead(this); else { + // we have a new message + // XXX - or we have an error, must handle it std::cout << request << std::endl << headers << std::endl; std::cout.write(body, content_length); std::cout.flush(); + res = EventManager::instance()->postEvent(new NewMessageEvent(conn, headers, body)); } } diff --git a/org.glite.lb.logger/src-nt/Makefile b/org.glite.lb.logger/src-nt/Makefile index 2ff9420..de04063 100644 --- a/org.glite.lb.logger/src-nt/Makefile +++ b/org.glite.lb.logger/src-nt/Makefile @@ -21,7 +21,7 @@ TEST_OBJS= \ test/SingletonTest.o \ test/test_main.o -plain: SocketInput.o PlainConnection.o HTTPTransport.o ThreadPool.o main.o +plain: PluginManager.cpp SocketInput.o Connection.o PlainConnection.o Transport.o HTTPTransport.o ThreadPool.o main.o $(LINK) -o $@ $+ $(THREAD_LIB) utest: ThreadPool.o PluginManager.o EventManager.o $(TEST_OBJS) diff --git a/org.glite.lb.logger/src-nt/PlainConnection.H b/org.glite.lb.logger/src-nt/PlainConnection.H index 556d428..5536095 100644 --- a/org.glite.lb.logger/src-nt/PlainConnection.H +++ b/org.glite.lb.logger/src-nt/PlainConnection.H @@ -2,13 +2,14 @@ #define _PLAIN_CONNECTION_H #include "Connection.H" - +#include "Singleton.H" class PlainConnection: public Connection { public: - class Factory: public Connection::Factory { + class Factory: public Connection::Factory, + public Singleton { public: virtual Connection *newConnection(int fd) const { return new PlainConnection(fd); @@ -19,8 +20,6 @@ public: virtual ~Factory() {} }; - static Factory theFactory; - PlainConnection(int a_fd): Connection(a_fd) {} diff --git a/org.glite.lb.logger/src-nt/PlainConnection.cpp b/org.glite.lb.logger/src-nt/PlainConnection.cpp index 156ec6e..899f23e 100644 --- a/org.glite.lb.logger/src-nt/PlainConnection.cpp +++ b/org.glite.lb.logger/src-nt/PlainConnection.cpp @@ -4,9 +4,6 @@ #include #include -PlainConnection::Factory PlainConnection::theFactory; - - PlainConnection::~PlainConnection() { } diff --git a/org.glite.lb.logger/src-nt/PluginManager.H b/org.glite.lb.logger/src-nt/PluginManager.H index 7b5aa74..1840536 100644 --- a/org.glite.lb.logger/src-nt/PluginManager.H +++ b/org.glite.lb.logger/src-nt/PluginManager.H @@ -21,6 +21,8 @@ public: virtual bool initialize() = 0; virtual bool cleanup () = 0; + + virtual ~Plugin(); }; // add plugin with given name to the list of registered plugins diff --git a/org.glite.lb.logger/src-nt/PluginManager.cpp b/org.glite.lb.logger/src-nt/PluginManager.cpp index df53043..0200737 100644 --- a/org.glite.lb.logger/src-nt/PluginManager.cpp +++ b/org.glite.lb.logger/src-nt/PluginManager.cpp @@ -1,3 +1,6 @@ #include "PluginManager.H" +PluginManager::Plugin::~Plugin() { +} + diff --git a/org.glite.lb.logger/src-nt/SocketInput.cpp b/org.glite.lb.logger/src-nt/SocketInput.cpp index 14e8df1..259e843 100644 --- a/org.glite.lb.logger/src-nt/SocketInput.cpp +++ b/org.glite.lb.logger/src-nt/SocketInput.cpp @@ -34,7 +34,6 @@ SocketInput::SocketInput(const char *path, throw new Exception; if(listen(fd, SOCK_QUEUE_MAX) < 0) throw new Exception; - ThreadPool::instance()->setWorkAccept(this); } diff --git a/org.glite.lb.logger/src-nt/ThreadPool.H b/org.glite.lb.logger/src-nt/ThreadPool.H index b03d7e5..1a3b43c 100644 --- a/org.glite.lb.logger/src-nt/ThreadPool.H +++ b/org.glite.lb.logger/src-nt/ThreadPool.H @@ -23,6 +23,8 @@ public: : fd(afd), event(NONE) {} + virtual ~WorkDescription(); + protected: enum Event { NONE, READY, TIMEOUT, ERROR } event; void doWork(); diff --git a/org.glite.lb.logger/src-nt/ThreadPool.cpp b/org.glite.lb.logger/src-nt/ThreadPool.cpp index 7f20453..be4045c 100644 --- a/org.glite.lb.logger/src-nt/ThreadPool.cpp +++ b/org.glite.lb.logger/src-nt/ThreadPool.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -69,8 +70,12 @@ ThreadPool::WaitDesc::adjustTimeout(const struct timeval &delta) } +ThreadPool::WorkDescription::~WorkDescription() { +} + + ThreadPool::ThreadPool() - : work_count(0), wait_count(0), ufds_size(0), ufds(NULL), f_exit(false) + : f_exit(false), work_count(0), wait_count(0), ufds_size(0), ufds(NULL) { pthread_mutex_init(&wait_queue_mutex, NULL); pthread_mutex_init(&work_queue_mutex, NULL); diff --git a/org.glite.lb.logger/src-nt/Transport.H b/org.glite.lb.logger/src-nt/Transport.H index 9cfe349..115ddaf 100644 --- a/org.glite.lb.logger/src-nt/Transport.H +++ b/org.glite.lb.logger/src-nt/Transport.H @@ -2,7 +2,7 @@ #define _TRANSPORT_H #include "Connection.H" - +#include "ThreadPool.H" class Transport: public ThreadPool::WorkDescription { public: @@ -10,7 +10,7 @@ public: public: virtual Transport *newTransport(Connection *conn) const = 0; - virtual ~Factory() = 0; + virtual ~Factory(); }; Transport(Connection *a_conn) diff --git a/org.glite.lb.logger/src-nt/main.cpp b/org.glite.lb.logger/src-nt/main.cpp index aa7ac45..1967015 100644 --- a/org.glite.lb.logger/src-nt/main.cpp +++ b/org.glite.lb.logger/src-nt/main.cpp @@ -16,8 +16,10 @@ int main(int argc, char *argv[]) // create unix socket with plain IO and HTTP transport input = new SocketInput(sock_path, - &PlainConnection::theFactory, - &HTTPTransport::theFactory); + PlainConnection::Factory::instance(), + HTTPTransport::Factory::instance()); + // and add the socket to pool + ThreadPool::instance()->setWorkAccept(input); // start worker threads ThreadPool::instance()->startWorkers(num_threads); -- 1.8.2.3