From d6aa5b6e69f648a748b249daa886f8090947b7eb Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 5 Apr 2009 18:41:39 +0000 Subject: [PATCH] added pthread support for starting the server listen/accept loop git-svn-id: svn://anubis/fart/trunk@224 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- Makefile | 2 +- distrib/distrib.cc | 34 ++++++++++++++++++++-------------- distrib/distrib.h | 7 +++++-- main/Scene.cc | 3 ++- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 2258e80..434dbd0 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ export CPPFLAGS += -I"$(shell pwd)" endif export CXXFLAGS := -Wall -O2 -LDFLAGS := -lfl +LDFLAGS := -lfl -lpthread SUBDIRS := util shapes main parser distrib diff --git a/distrib/distrib.cc b/distrib/distrib.cc index de1b47d..e328ba6 100644 --- a/distrib/distrib.cc +++ b/distrib/distrib.cc @@ -31,7 +31,7 @@ int distrib::readHostFile(const char * filename) return 0; } -int distrib::connect(const std::vector & client_options) +int distrib::startClients(const std::vector & client_options) { int err = 0; for (int i = 0, sz = m_hosts.size(); i < sz; i++) @@ -91,33 +91,33 @@ int distrib::connect(const string & host, return 0; } -int distrib::startServer(const std::vector & client_options) +void distrib_server(distrib * the_distrib) { char hostname[1000]; gethostname(&hostname[0], 1000); - m_servername = hostname; + the_distrib->m_servername = hostname; - m_listen_socket = socket(PF_INET, SOCK_STREAM, 0); - if ( m_listen_socket == -1 ) + int listen_socket = socket(PF_INET, SOCK_STREAM, 0); + if ( listen_socket == -1 ) { cerr << "Error " << errno << " creating listen socket!" << endl; - return 1; + exit(39); } - if ( listen(m_listen_socket, 5) == -1 ) + if ( listen(listen_socket, 5) == -1 ) { cerr << "Error " << errno << " when trying to listen!" << endl; - return 2; + exit(40); } struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in); - getsockname(m_listen_socket, + getsockname(listen_socket, (struct sockaddr *) &addr, (socklen_t *) &addr_len); int ip_addr = ntohl(addr.sin_addr.s_addr); - m_serverport = ntohs(addr.sin_port); + the_distrib->m_serverport = ntohs(addr.sin_port); cout << "Listening on " << (unsigned int) ((ip_addr >> 24) & 0xFF) << '.' @@ -127,12 +127,18 @@ int distrib::startServer(const std::vector & client_options) << '.' << (unsigned int) (ip_addr & 0xFF) << ':' - << m_serverport + << the_distrib->m_serverport << endl; +} - connect(client_options); - - return 0; +int distrib::startServer() +{ + int ret = pthread_create(&m_server_thread, + NULL, + (void * (*)(void *)) distrib_server, + this); + usleep(100000); + return ret; } int distrib::startClient(const char * server, int port) diff --git a/distrib/distrib.h b/distrib/distrib.h index df56465..174492b 100644 --- a/distrib/distrib.h +++ b/distrib/distrib.h @@ -4,16 +4,18 @@ #include #include +#include class distrib { public: int readHostFile(const char * filename); - int startServer(const std::vector & client_options); + int startServer(); int startClient(const char * server, int port); + int startClients(const std::vector & client_options); + friend void distrib_server(distrib * the_distrib); protected: - int connect(const std::vector & client_options); int connect(const std::string & host, const std::vector & client_options); @@ -22,6 +24,7 @@ class distrib std::string m_servername; int m_serverport; int m_listen_socket; + pthread_t m_server_thread; }; #endif diff --git a/main/Scene.cc b/main/Scene.cc index 4f8abea..2c3effd 100644 --- a/main/Scene.cc +++ b/main/Scene.cc @@ -102,7 +102,8 @@ Scene::Scene(const map & options, { if (m_hosts_file != "") m_distrib.readHostFile(m_hosts_file.c_str()); - m_distrib.startServer(m_client_options); + m_distrib.startServer(); + m_distrib.startClients(m_client_options); } else {