work in progress~
authorMichal Voců <michal@ruk.cuni.cz>
Thu, 28 Jun 2007 08:07:40 +0000 (08:07 +0000)
committerMichal Voců <michal@ruk.cuni.cz>
Thu, 28 Jun 2007 08:07:40 +0000 (08:07 +0000)
15 files changed:
org.glite.lb.logger/src-nt/Connection.H
org.glite.lb.logger/src-nt/EventManager.H
org.glite.lb.logger/src-nt/EventManager.cpp [new file with mode: 0644]
org.glite.lb.logger/src-nt/HTTPTransport.H
org.glite.lb.logger/src-nt/HTTPTransport.cpp
org.glite.lb.logger/src-nt/Makefile
org.glite.lb.logger/src-nt/PlainConnection.H
org.glite.lb.logger/src-nt/PlainConnection.cpp
org.glite.lb.logger/src-nt/PluginManager.H
org.glite.lb.logger/src-nt/PluginManager.cpp
org.glite.lb.logger/src-nt/SocketInput.cpp
org.glite.lb.logger/src-nt/ThreadPool.H
org.glite.lb.logger/src-nt/ThreadPool.cpp
org.glite.lb.logger/src-nt/Transport.H
org.glite.lb.logger/src-nt/main.cpp

index 75d20d7..158eaa1 100644 (file)
@@ -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 {
index 2a12b7a..355260d 100644 (file)
@@ -3,71 +3,44 @@
 
 #include <list>
 
-#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<class T>
+template <class THandler, class TEvent>
 class EventHandler {
 public:
-       virtual eventstatus_t handleEvent(T *&e);
-};
-
-
-template <class T>
-class EventManagerForType: public Singleton< EventManagerForType<T> > {
-public:
+       typedef int (THandler::*EventHandlerType)(TEvent* &);
 
-protected:
-       void registerHandler(EventHandler<T> *);
-       void registerHandlerFirst(EventHandler<T> *);
+       
 
 private:
-
+       std::list<EventHandlerType> m_handlers;
 };
 
 
-class EventManager: public Singleton<EventManager> {
+class EventManager {
 public:
-       eventstatus_t postEvent(Event *);
-
-       template<class T>
-       void registerHandler(EventHandler<T> *h) {
-               EventManagerForType<T>::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<class T>
-       void registerHandlerFirst(EventHandler<T> *) {
-               EventManagerForType<T>::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 (file)
index 0000000..0ab0674
--- /dev/null
@@ -0,0 +1,2 @@
+#include "EventManager.H"
+
index 417deea..37c91d7 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "ThreadPool.H"
 #include "Transport.H"
+#include "Singleton.H"
 
 #include <string>
 
@@ -10,7 +11,8 @@ class HTTPTransport:
        public Transport
 {
 public:
-       class Factory: public Transport::Factory {
+       class Factory: public Transport::Factory, 
+                      public Singleton<HTTPTransport::Factory>  {
        public:
                virtual Transport *newTransport(Connection *conn) const {
                        if(conn) 
@@ -20,8 +22,6 @@ public:
                }
        };
 
-       static Factory theFactory;
-
        HTTPTransport(Connection *conn) 
                : Transport(conn),
                  state(NONE),
index 4c99a82..6908f80 100644 (file)
@@ -1,13 +1,11 @@
 #include "HTTPTransport.H"
 #include "Exception.H"
+#include "EventManager.H"
 
 #include <iostream>
 #include <string.h>
 
 
-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));
        }
 
 }
index 2ff9420..de04063 100644 (file)
@@ -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)
index 556d428..5536095 100644 (file)
@@ -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<PlainConnection::Factory> {
        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)
                {}
 
index 156ec6e..899f23e 100644 (file)
@@ -4,9 +4,6 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 
-PlainConnection::Factory PlainConnection::theFactory;
-
-
 PlainConnection::~PlainConnection()
 {
 }
index 7b5aa74..1840536 100644 (file)
@@ -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
index df53043..0200737 100644 (file)
@@ -1,3 +1,6 @@
 #include "PluginManager.H"
 
+PluginManager::Plugin::~Plugin() {
+}
+
 
index 14e8df1..259e843 100644 (file)
@@ -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);
 }
 
 
index b03d7e5..1a3b43c 100644 (file)
@@ -23,6 +23,8 @@ public:
                        : fd(afd), event(NONE) {}
 
 
+               virtual ~WorkDescription();
+
        protected:
                enum Event { NONE, READY, TIMEOUT, ERROR } event;
                void doWork();
index 7f20453..be4045c 100644 (file)
@@ -4,6 +4,7 @@
 #include <sys/time.h>
 #include <time.h>
 #include <stdlib.h>
+#include <errno.h>
 
 #include <iostream>
 
@@ -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);
index 9cfe349..115ddaf 100644 (file)
@@ -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) 
index aa7ac45..1967015 100644 (file)
@@ -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);