]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - server.c
interactive: Avoid select(2) in input_available().
[paraslash.git] / server.c
index cb32d4d962e129ccf3589fa2ba3db8eb72e18984..729ca1ac69d4f1f86a09359d315dc84e60e873cf 100644 (file)
--- a/server.c
+++ b/server.c
@@ -407,15 +407,16 @@ static int command_post_select(struct sched *s, void *context)
 
        ret = task_get_notification(sct->task);
        if (ret < 0)
-               return ret;
+               goto fail;
        for (n = 0; n < sct->num_listen_fds; n++) {
                ret = command_task_accept(n, s, sct);
-               if (ret < 0) {
-                       free(sct->listen_fds);
-                       return ret;
-               }
+               if (ret < 0)
+                       goto fail;
        }
        return 0;
+fail:
+       free(sct->listen_fds);
+       return ret;
 }
 
 static void init_server_command_task(struct server_command_task *sct,
@@ -617,13 +618,13 @@ out:
 }
 
 static int server_select(int max_fileno, fd_set *readfds, fd_set *writefds,
-               struct timeval *timeout_tv)
+               int timeout)
 {
        int ret;
 
        status_refresh();
        mutex_unlock(mmd_mutex);
-       ret = para_select(max_fileno + 1, readfds, writefds, timeout_tv);
+       ret = para_select(max_fileno + 1, readfds, writefds, timeout);
        mutex_lock(mmd_mutex);
        return ret;
 }
@@ -657,7 +658,7 @@ int main(int argc, char *argv[])
        struct server_command_task server_command_task_struct,
                *sct = &server_command_task_struct;
 
-       sched.default_timeout.tv_sec = 1;
+       sched.default_timeout = 1000;
        sched.select_function = server_select;
 
        server_init(argc, argv, sct);
@@ -678,12 +679,13 @@ int main(int argc, char *argv[])
                deplete_close_on_fork_list();
                if (ret < 0)
                        PARA_EMERG_LOG("%s\n", para_strerror(-ret));
+               vss_shutdown();
        } else {
+               vss_shutdown();
                alarm(ALARM_TIMEOUT);
                close_listed_fds();
                ret = handle_connect(sct->child_fd);
        }
-       vss_shutdown();
        shm_detach(mmd);
        user_list_deplete();
        free_lpr();