]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - afs.c
Simplify the scheduling code.
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index 451a492c8bfe9871dd22c51121eadfd69aeee3ec..ab1a1df6ffaad6da32cafd2d363211593172159c 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -755,34 +755,29 @@ static void unregister_tasks(void)
 
 static void signal_pre_select(struct sched *s, struct task *t)
 {
-       struct signal_task *st = t->private_data;
-       t->ret = 1;
+       struct signal_task *st = container_of(t, struct signal_task, task);
        para_fd_set(st->fd, &s->rfds, &s->max_fileno);
 }
 
 static void signal_post_select(struct sched *s, struct task *t)
 {
-       struct signal_task *st = t->private_data;
-       t->ret = -E_AFS_PARENT_DIED;
-       if (getppid() == 1)
-               goto err;
-       t->ret = 1;
+       struct signal_task *st = container_of(t, struct signal_task, task);
+       if (getppid() == 1) {
+               t->error = -E_AFS_PARENT_DIED;
+               return;
+       }
        if (!FD_ISSET(st->fd, &s->rfds))
                return;
        st->signum = para_next_signal();
-       t->ret = 1;
        if (st->signum == SIGHUP) {
                close_afs_tables();
-               t->ret = open_afs_tables();
-               if (t->ret < 0)
-                       goto err;
+               t->error = open_afs_tables();
+               if (t->error < 0)
+                       return;
                init_admissible_files(current_mop);
                return;
        }
-       t->ret = -E_AFS_SIGNAL;
-err:
-       PARA_NOTICE_LOG("%s\n", para_strerror(-t->ret));
-       unregister_tasks();
+       t->error = -E_AFS_SIGNAL;
 }
 
 static void register_signal_task(void)
@@ -805,7 +800,6 @@ static void register_signal_task(void)
 
        st->task.pre_select = signal_pre_select;
        st->task.post_select = signal_post_select;
-       st->task.private_data = st;
        sprintf(st->task.status, "signal task");
        register_task(&st->task);
 }
@@ -824,14 +818,13 @@ struct afs_client {
 
 static void command_pre_select(struct sched *s, struct task *t)
 {
-       struct command_task *ct = t->private_data;
+       struct command_task *ct = container_of(t, struct command_task, task);
        struct afs_client *client;
 
        para_fd_set(server_socket, &s->rfds, &s->max_fileno);
        para_fd_set(ct->fd, &s->rfds, &s->max_fileno);
        list_for_each_entry(client, &afs_client_list, node)
                para_fd_set(client->fd, &s->rfds, &s->max_fileno);
-       t->ret = 1;
 }
 
 /**
@@ -966,10 +959,10 @@ err:
 
 static void command_post_select(struct sched *s, struct task *t)
 {
-       struct command_task *ct = t->private_data;
+       struct command_task *ct = container_of(t, struct command_task, task);
        struct sockaddr_un unix_addr;
        struct afs_client *client, *tmp;
-       int fd;
+       int fd, ret;
        if (FD_ISSET(server_socket, &s->rfds))
                execute_server_command();
 
@@ -990,25 +983,23 @@ static void command_post_select(struct sched *s, struct task *t)
        }
        /* Accept connections on the local socket. */
        if (!FD_ISSET(ct->fd, &s->rfds))
-               goto out;
-       t->ret = para_accept(ct->fd, &unix_addr, sizeof(unix_addr));
-       if (t->ret < 0) {
-               PARA_NOTICE_LOG("%s\n", para_strerror(-t->ret));
-               goto out;
+               return;
+       ret = para_accept(ct->fd, &unix_addr, sizeof(unix_addr));
+       if (ret < 0) {
+               PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
+               return;
        }
-       fd = t->ret;
-       t->ret = mark_fd_nonblocking(fd);
-       if (t->ret < 0) {
-               PARA_NOTICE_LOG("%s\n", para_strerror(-t->ret));
+       fd = ret;
+       ret = mark_fd_nonblocking(fd);
+       if (ret < 0) {
+               PARA_NOTICE_LOG("%s\n", para_strerror(-ret));
                close(fd);
-               goto out;
+               return;
        }
        client = para_malloc(sizeof(*client));
        client->fd = fd;
        client->connect_time = *now;
        para_list_add(&client->node, &afs_client_list);
-out:
-       t->ret = 1;
 }
 
 static void register_command_task(uint32_t cookie)
@@ -1019,7 +1010,6 @@ static void register_command_task(uint32_t cookie)
 
        ct->task.pre_select = command_pre_select;
        ct->task.post_select = command_post_select;
-       ct->task.private_data = ct;
        sprintf(ct->task.status, "command task");
        register_task(&ct->task);
 }