From fdf34009bfb6d70ac0586924a56932c43e8d2848 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 6 Apr 2009 17:17:04 +0000 Subject: [PATCH] using a mutex/condvar instead of a usleep to wait for listen thread to start git-svn-id: svn://anubis/fart/trunk@225 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- distrib/distrib.cc | 22 +++++++++++++++++++++- distrib/distrib.h | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/distrib/distrib.cc b/distrib/distrib.cc index e328ba6..e5d6097 100644 --- a/distrib/distrib.cc +++ b/distrib/distrib.cc @@ -11,6 +11,12 @@ #include using namespace std; +distrib::distrib() +{ + pthread_cond_init(&m_listen_cond, NULL); + pthread_mutex_init(&m_listen_mutex, NULL); +} + int distrib::readHostFile(const char * filename) { ifstream ifs(filename); @@ -129,15 +135,29 @@ void distrib_server(distrib * the_distrib) << ':' << the_distrib->m_serverport << endl; + + /* signal readiness of the listen thread */ + pthread_mutex_lock(&the_distrib->m_listen_mutex); + pthread_cond_signal(&the_distrib->m_listen_cond); + pthread_mutex_unlock(&the_distrib->m_listen_mutex); } int distrib::startServer() { + pthread_mutex_lock(&m_listen_mutex); + + /* start the listen thread */ int ret = pthread_create(&m_server_thread, NULL, (void * (*)(void *)) distrib_server, this); - usleep(100000); + if (ret) + return ret; + + /* wait for the listen thread to be running */ + pthread_cond_wait(&m_listen_cond, &m_listen_mutex); + pthread_mutex_unlock(&m_listen_mutex); + return ret; } diff --git a/distrib/distrib.h b/distrib/distrib.h index 174492b..3027658 100644 --- a/distrib/distrib.h +++ b/distrib/distrib.h @@ -9,6 +9,7 @@ class distrib { public: + distrib(); int readHostFile(const char * filename); int startServer(); int startClient(const char * server, int port); @@ -25,6 +26,8 @@ class distrib int m_serverport; int m_listen_socket; pthread_t m_server_thread; + pthread_cond_t m_listen_cond; + pthread_mutex_t m_listen_mutex; }; #endif