]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - vss.c
Introduce the vss task.
[paraslash.git] / vss.c
diff --git a/vss.c b/vss.c
index e21a1ff4fd13a715fc465c2c2758f72961856aa3..98965efd386a14b5fd95361c9f6878fb959af128 100644 (file)
--- a/vss.c
+++ b/vss.c
 #include "ipc.h"
 #include "fd.h"
 
-static struct timeval announce_tv;
-static struct timeval data_send_barrier;
-static struct timeval eof_barrier;
-static struct timeval autoplay_barrier;
-
 extern struct misc_meta_data *mmd;
 
 extern void dccp_send_init(struct sender *);
@@ -62,10 +57,28 @@ struct sender senders[] = {
        }
 };
 
-
+/** The possible states of the afs socket. See \ref afs_socket. */
+enum afs_socket_status {
+       /** Socket is inactive. */
+       AFS_SOCKET_READY,
+       /** Socket fd was included in the write fd set for select(). */
+       AFS_SOCKET_CHECK_FOR_WRITE,
+       /** vss wrote a request to the socket and waits for afs to reply. */
+       AFS_SOCKET_AFD_PENDING
+};
 
 static char *map;
 
+struct vss_task {
+       struct timeval announce_tv;
+       struct timeval data_send_barrier;
+       struct timeval eof_barrier;
+       struct timeval autoplay_barrier;
+       enum afs_socket_status afsss;
+};
+
+static struct vss_task vss_task_struct, *vsst = &vss_task_struct;
+
 /**
  * Check if vss status flag \a P (playing) is set.
  *
@@ -156,8 +169,8 @@ void vss_init(void)
                        conf.announce_time_arg : 300,
                autoplay_delay = conf.autoplay_delay_arg > 0?
                        conf.autoplay_delay_arg : 0;
-       ms2tv(announce_time, &announce_tv);
-       PARA_INFO_LOG("announce timeval: %lums\n", tv2ms(&announce_tv));
+       ms2tv(announce_time, &vsst->announce_tv);
+       PARA_INFO_LOG("announce timeval: %lums\n", tv2ms(&vsst->announce_tv));
        for (i = 0; senders[i].name; i++) {
                PARA_NOTICE_LOG("initializing %s sender\n", senders[i].name);
                senders[i].init(&senders[i]);
@@ -171,7 +184,7 @@ void vss_init(void)
                mmd->new_vss_status_flags |= VSS_PLAYING;
                gettimeofday(&now, NULL);
                ms2tv(autoplay_delay, &tmp);
-               tv_add(&now, &tmp, &autoplay_barrier);
+               tv_add(&now, &tmp, &vsst->autoplay_barrier);
        }
 }
 
@@ -205,12 +218,12 @@ static struct timeval *vss_compute_timeout(void)
                return &the_timeout;
        }
        gettimeofday(&now, NULL);
-       if (chk_barrier("autoplay_delay", &now, &autoplay_barrier,
+       if (chk_barrier("autoplay_delay", &now, &vsst->autoplay_barrier,
                        &the_timeout, 1) < 0)
                return &the_timeout;
-       if (chk_barrier("eof", &now, &eof_barrier, &the_timeout, 1) < 0)
+       if (chk_barrier("eof", &now, &vsst->eof_barrier, &the_timeout, 1) < 0)
                return &the_timeout;
-       if (chk_barrier("data send", &now, &data_send_barrier,
+       if (chk_barrier("data send", &now, &vsst->data_send_barrier,
                        &the_timeout, 1) < 0)
                return &the_timeout;
        if (!vss_playing() || !map)
@@ -230,11 +243,13 @@ static void vss_eof(void)
        struct timeval now;
        char *tmp;
 
+       if (!map)
+               return;
        if (mmd->new_vss_status_flags & VSS_NOMORE)
                mmd->new_vss_status_flags = VSS_NEXT;
        gettimeofday(&now, NULL);
-       tv_add(&mmd->afd.afhi.eof_tv, &now, &eof_barrier);
-       munmap(map, mmd->size);
+       tv_add(&mmd->afd.afhi.eof_tv, &now, &vsst->eof_barrier);
+       para_munmap(map, mmd->size);
        map = NULL;
        mmd->chunks_sent = 0;
        mmd->offset = 0;
@@ -290,18 +305,6 @@ struct timeval *vss_chunk_time(void)
        return &mmd->afd.afhi.chunk_tv;
 }
 
-/** The possible states of the afs socket. See \ref afs_socket. */
-enum afs_socket_status {
-       /** Socket is inactive. */
-       AFS_SOCKET_READY,
-       /** Socket fd was included in the write fd set for select(). */
-       AFS_SOCKET_CHECK_FOR_WRITE,
-       /** vss wrote a request to the socket and waits for afs to reply. */
-       AFS_SOCKET_AFD_PENDING
-};
-
-static enum afs_socket_status afsss;
-
 static int need_to_request_new_audio_file(void)
 {
        if (map) /* have audio file */
@@ -310,7 +313,7 @@ static int need_to_request_new_audio_file(void)
                return 0;
        if (mmd->new_vss_status_flags & VSS_NOMORE)
                return 0;
-       if (afsss == AFS_SOCKET_AFD_PENDING) /* already requested one */
+       if (vsst->afsss == AFS_SOCKET_AFD_PENDING) /* already requested one */
                return 0;
        return 1;
 }
@@ -349,13 +352,13 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno)
        else if (vss_paused()) {
                if (mmd->chunks_sent) {
                        gettimeofday(&now, NULL);
-                       tv_add(&mmd->afd.afhi.eof_tv, &now, &eof_barrier);
+                       tv_add(&mmd->afd.afhi.eof_tv, &now, &vsst->eof_barrier);
                }
                mmd->chunks_sent = 0;
        } else if (vss_repos()) {
                gettimeofday(&now, NULL);
-               tv_add(&now, &announce_tv, &data_send_barrier);
-               tv_add(&mmd->afd.afhi.eof_tv, &now, &eof_barrier);
+               tv_add(&now, &vsst->announce_tv, &vsst->data_send_barrier);
+               tv_add(&mmd->afd.afhi.eof_tv, &now, &vsst->eof_barrier);
                mmd->chunks_sent = 0;
                mmd->current_chunk = mmd->repos_request;
                mmd->new_vss_status_flags &= ~VSS_REPOS;
@@ -364,7 +367,7 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno)
        if (need_to_request_new_audio_file()) {
                PARA_DEBUG_LOG("ready and playing, but no audio file\n");
                para_fd_set(afs_socket, wfds, max_fileno);
-               afsss = AFS_SOCKET_CHECK_FOR_WRITE;
+               vsst->afsss = AFS_SOCKET_CHECK_FOR_WRITE;
        } else
                para_fd_set(afs_socket, rfds, max_fileno);
        for (i = 0; senders[i].name; i++) {
@@ -394,7 +397,7 @@ static int recv_afs_msg(int *fd, uint32_t *code, uint32_t *data)
        ret = recvmsg(afs_socket, &msg, 0);
        if (ret < 0)
                return -ERRNO_TO_PARA_ERROR(errno);
-       afsss = AFS_SOCKET_READY;
+       vsst->afsss = AFS_SOCKET_READY;
        if (iov.iov_len != sizeof(buf))
                return -E_AFS_SHORT_READ;
        *code = *(uint32_t*)buf;
@@ -451,7 +454,7 @@ static void recv_afs_result(void)
        mmd->num_played++;
        mmd->new_vss_status_flags &= (~VSS_NEXT);
        gettimeofday(&now, NULL);
-       tv_add(&now, &announce_tv, &data_send_barrier);
+       tv_add(&now, &vsst->announce_tv, &vsst->data_send_barrier);
        return;
 err:
        free(mmd->afd.afhi.chunk_table);
@@ -484,9 +487,9 @@ static void vss_send_chunk(void)
                &mmd->stream_start, &due);
        if (tv_diff(&due, &now, NULL) > 0)
                return;
-       if (chk_barrier("eof", &now, &eof_barrier, &due, 1) < 0)
+       if (chk_barrier("eof", &now, &vsst->eof_barrier, &due, 1) < 0)
                return;
-       if (chk_barrier("data send", &now, &data_send_barrier,
+       if (chk_barrier("data send", &now, &vsst->data_send_barrier,
                        &due, 1) < 0)
                return;
        mmd->new_vss_status_flags &= ~VSS_REPOS;
@@ -525,13 +528,13 @@ void vss_post_select(fd_set *rfds, fd_set *wfds)
                        senders[s].client_cmds[num](&mmd->sender_cmd_data);
                mmd->sender_cmd_data.cmd_num = -1;
        }
-       if (afsss != AFS_SOCKET_CHECK_FOR_WRITE) {
+       if (vsst->afsss != AFS_SOCKET_CHECK_FOR_WRITE) {
                if (FD_ISSET(afs_socket, rfds))
                        recv_afs_result();
        } else if (FD_ISSET(afs_socket, wfds)) {
                PARA_NOTICE_LOG("requesting new fd from afs\n");
                ret = send_buffer(afs_socket, "new");
-               afsss = AFS_SOCKET_AFD_PENDING;
+               vsst->afsss = AFS_SOCKET_AFD_PENDING;
        }
        for (i = 0; senders[i].name; i++) {
                if (!senders[i].post_select)