]> git.sesse.net Git - cubemap/commitdiff
Make Server stoppable.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 6 Apr 2013 17:02:43 +0000 (19:02 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 6 Apr 2013 17:02:43 +0000 (19:02 +0200)
cubemap.cpp
server.cpp
server.h

index 4ee5d6f3c4d6a95fcc5dfc556a437b5cf2077a76..d0a3ac4d62d5721e42bac1d0f7fed4cec5729b82 100644 (file)
@@ -112,4 +112,9 @@ int main(int argc, char **argv)
 
        Input input(STREAM_ID);
        input.run(STREAM_URL);
+
+       for (int i = 0; i < NUM_SERVERS; ++i) {
+               servers[i].stop();
+       }
+       delete[] servers;
 }
index 08f2afdfc907c38d8858de1715b46ce0ac2c179a..f5c117b6dcbad54ac13ac30e89e861f8c5943130 100644 (file)
@@ -34,8 +34,26 @@ Server::Server()
 
 void Server::run()
 {
-       pthread_t thread;
-       pthread_create(&thread, NULL, Server::do_work_thunk, this);
+       should_stop = false;
+       
+       // Joinable is already the default, but it's good to be certain.
+       pthread_attr_t attr;
+       pthread_attr_init(&attr);
+       pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+       pthread_create(&worker_thread, &attr, Server::do_work_thunk, this);
+}
+
+void Server::stop()
+{
+       {
+               MutexLock lock(&mutex);
+               should_stop = true;
+       }
+
+       if (pthread_join(worker_thread, NULL) == -1) {
+               perror("pthread_join");
+               exit(1);
+       }
 }
 
 void *Server::do_work_thunk(void *arg)
@@ -49,13 +67,17 @@ void Server::do_work()
 {
        for ( ;; ) {
                int nfds = epoll_wait(epoll_fd, events, EPOLL_MAX_EVENTS, EPOLL_TIMEOUT_MS);
-
-               MutexLock lock(&mutex);  // We release the mutex between iterations.
                if (nfds == -1) {
                        perror("epoll_wait");
                        exit(1);
                }
-               
+
+               MutexLock lock(&mutex);  // We release the mutex between iterations.
+       
+               if (should_stop) {
+                       return;
+               }
+       
                for (int i = 0; i < nfds; ++i) {
                        int fd = events[i].data.fd;
                        assert(clients.count(fd) != 0);
index dea24d894e4cf9e5c9ea5ab7d3e96fa77f861a08..0f93b7f0b034caa1eb88a276f3b2aa40fa78fc83 100644 (file)
--- a/server.h
+++ b/server.h
@@ -57,14 +57,24 @@ public:
 
        // Start a new thread that handles clients.
        void run();
+
+       // Stop the thread.
+       void stop();
+
        void add_client(int sock);
        void add_stream(const std::string &stream_id);
        void set_header(const std::string &stream_id, const std::string &header);
        void add_data(const std::string &stream_id, const char *data, size_t bytes);
 
 private:
+       pthread_t worker_thread;
+
+       // All variables below this line are protected by the mutex.
        pthread_mutex_t mutex;
 
+       // If the thread should stop or not.
+       bool should_stop;       
+
        // Map from stream ID to stream.
        std::map<std::string, Stream> streams;