#include "volume.h"
#include "partition.h"
+#ifdef HAVE_POLL
+#include <sys/poll.h>
+#endif /* HAVE_POLL */
+
#ifdef USE_UNIX_SOCKETS
#include <sys/un.h>
#include <afs/afsutil.h>
static void AcceptOn();
static void AcceptOff();
static void InitHandler();
-static void CallHandler(fd_set * fdsetp);
static int AddHandler();
static int FindHandler();
static int FindHandler_r();
static int RemoveHandler();
+#if defined(HAVE_POLL) && defined (AFS_PTHREAD_ENV)
+static void CallHandler(struct pollfd *fds, int nfds, int mask);
+static void GetHandler(struct pollfd *fds, int maxfds, int events, int *nfds);
+#else
+static void CallHandler(fd_set * fdsetp);
static void GetHandler(fd_set * fdsetp, int *maxfdp);
-
+#endif
extern int LogLevel;
static afs_int32 FSYNC_com_VolOp(int fd, SYNC_command * com, SYNC_response * res);
#endif /* AFS_PTHREAD_ENV */
}
+#if defined(HAVE_POLL) && defined(AFS_PTHREAD_ENV)
+static struct pollfd FSYNC_readfds[MAXHANDLERS];
+#else
static fd_set FSYNC_readfds;
+#endif
#ifdef USE_UNIX_SOCKETS
static int
InitHandler();
AcceptOn();
for (;;) {
+#if defined(HAVE_POLL) && defined(AFS_PTHREAD_ENV)
+ int nfds;
+ GetHandler(FSYNC_readfds, MAXHANDLERS, POLLIN|POLLPRI, &nfds);
+ if (poll(FSYNC_readfds, nfds, -1) >=1)
+ CallHandler(FSYNC_readfds, nfds, POLLIN|POLLPRI);
+#else
int maxfd;
GetHandler(&FSYNC_readfds, &maxfd);
/* Note: check for >= 1 below is essential since IOMGR_select
if (IOMGR_Select(maxfd + 1, &FSYNC_readfds, NULL, NULL, NULL) >= 1)
#endif /* AFS_PTHREAD_ENV */
CallHandler(&FSYNC_readfds);
+#endif
}
}
ReleaseWriteLock(&FSYNC_handler_lock);
}
+#if defined(HAVE_POLL) && defined(AFS_PTHREAD_ENV)
+static void
+CallHandler(struct pollfd *fds, int nfds, int mask)
+{
+ int i;
+ int handler;
+ ObtainReadLock(&FSYNC_handler_lock);
+ for (i = 0; i < nfds; i++) {
+ if (fds[i].revents & mask) {
+ handler = FindHandler_r(fds[i].fd);
+ ReleaseReadLock(&FSYNC_handler_lock);
+ (*HandlerProc[handler]) (fds[i].fd);
+ ObtainReadLock(&FSYNC_handler_lock);
+ }
+ }
+ ReleaseReadLock(&FSYNC_handler_lock);
+}
+#else
static void
CallHandler(fd_set * fdsetp)
{
}
ReleaseReadLock(&FSYNC_handler_lock);
}
+#endif
static int
AddHandler(int afd, int (*aproc) ())
return 1;
}
+#if defined(HAVE_POLL) && defined(AFS_PTHREAD_ENV)
+static void
+GetHandler(struct pollfd *fds, int maxfds, int events, int *nfds)
+{
+ int i;
+ int fdi = 0;
+ ObtainReadLock(&FSYNC_handler_lock);
+ for (i = 0; i < MAXHANDLERS; i++)
+ if (HandlerFD[i] != -1) {
+ assert(fdi<maxfds);
+ fds[fdi].fd = HandlerFD[i];
+ fds[fdi].events = events;
+ fds[fdi].revents = 0;
+ fdi++;
+ }
+ *nfds = fdi;
+}
+#else
static void
GetHandler(fd_set * fdsetp, int *maxfdp)
{
*maxfdp = maxfd;
ReleaseReadLock(&FSYNC_handler_lock); /* just in case */
}
+#endif /* HAVE_POLL && AFS_PTHREAD_ENV */
#endif /* FSSYNC_BUILD_SERVER */