From: Andre Noll Date: Sat, 12 Apr 2008 06:19:01 +0000 (+0200) Subject: vss: Check the afs socket either for reading or for writing. X-Git-Tag: v0.3.3~97 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=d04dd06c4553ae3e1a6ead0e427f0f03836d0cd0;hp=e67fbcaf61d3d0f3ce62332f9615e5ed8e5a1c81 vss: Check the afs socket either for reading or for writing. --- diff --git a/vss.c b/vss.c index a7542677..3c59bf4a 100644 --- a/vss.c +++ b/vss.c @@ -262,6 +262,19 @@ enum afs_socket_status { static enum afs_socket_status afsss; +static int need_to_request_new_audio_file(void) +{ + if (map) /* have audio file */ + return 0; + if (!vss_playing()) /* don't need one */ + return 0; + if (mmd->new_vss_status_flags & VSS_NOMORE) + return 0; + if (afsss == AFS_SOCKET_AFD_PENDING) /* already requested one */ + return 0; + return 1; +} + /** * Compute the timeout for para_server's main select-loop. * @@ -288,7 +301,6 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno) int i; struct timeval *tv; - para_fd_set(afs_socket, rfds, max_fileno); if (!map) for (i = 0; senders[i].name; i++) senders[i].shutdown_clients(); @@ -317,17 +329,13 @@ struct timeval *vss_preselect(fd_set *rfds, fd_set *wfds, int *max_fileno) mmd->current_chunk = mmd->repos_request; } tv = vss_compute_timeout(); - if (tv) - goto out; - if (!map && vss_playing() && - !(mmd->new_vss_status_flags & VSS_NOMORE)) { - if (afsss != AFS_SOCKET_AFD_PENDING) { - 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; - } - } out: + 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; + } else + para_fd_set(afs_socket, rfds, max_fileno); return tv; } @@ -421,14 +429,18 @@ void vss_post_select(fd_set *rfds, fd_set *wfds) { int ret; - if (FD_ISSET(afs_socket, rfds)) - recv_afs_result(); - if (afsss != AFS_SOCKET_CHECK_FOR_WRITE || !FD_ISSET(afs_socket, wfds)) + if (afsss != AFS_SOCKET_CHECK_FOR_WRITE) { + if (FD_ISSET(afs_socket, rfds)) + recv_afs_result(); + return; + } + if (!FD_ISSET(afs_socket, wfds)) return; PARA_NOTICE_LOG("requesting new fd from afs\n"); ret = send_buffer(afs_socket, "new"); afsss = AFS_SOCKET_AFD_PENDING; } + /** * Get the data of the given chunk. *