Fix the broken SO_REUSEADDR.
[cubemap] / server.cpp
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);