diff options
author | Andrew Tridgell <tridge@samba.org> | 2000-06-11 05:57:58 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2000-06-11 05:57:58 +0000 |
commit | 8843a6379d7c1cf59f0f3673cbc567b09994b7d2 (patch) | |
tree | 63f645769adeecd6cfd999a8f2d873f1c5a626b6 /source3/lib | |
parent | 4ec7597d1154c60f0f55feab93f2dc9c776d56f8 (diff) | |
download | samba-8843a6379d7c1cf59f0f3673cbc567b09994b7d2.tar.gz samba-8843a6379d7c1cf59f0f3673cbc567b09994b7d2.tar.bz2 samba-8843a6379d7c1cf59f0f3673cbc567b09994b7d2.zip |
Linux kernel oplocks now seem to work, but need a _lot_ of testing
I had to modify sys_select() to not loop on EINTR. I added a wrapper
called sys_select_intr() which gives the old behaviour.
(This used to be commit b28cc4163bc2faaa80c5782fc02c8f03c410cdeb)
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/system.c | 26 | ||||
-rw-r--r-- | source3/lib/util.c | 2 | ||||
-rw-r--r-- | source3/lib/util_sock.c | 4 |
3 files changed, 21 insertions, 11 deletions
diff --git a/source3/lib/system.c b/source3/lib/system.c index 2a99ae779e..46b01b747a 100644 --- a/source3/lib/system.c +++ b/source3/lib/system.c @@ -112,9 +112,7 @@ int sys_select(int maxfd, fd_set *fds,struct timeval *tval) timeout = (tval != NULL) ? (tval->tv_sec * 1000) + (tval->tv_usec/1000) : -1; errno = 0; - do { - pollrtn = poll( &pfd[0], maxpoll, timeout); - } while (pollrtn<0 && errno == EINTR); + pollrtn = poll( &pfd[0], maxpoll, timeout); FD_ZERO(fds); @@ -128,11 +126,9 @@ int sys_select(int maxfd, fd_set *fds,struct timeval *tval) struct timeval t2; int selrtn; - do { - if (tval) memcpy((void *)&t2,(void *)tval,sizeof(t2)); - errno = 0; - selrtn = select(maxfd,SELECT_CAST fds,NULL,NULL,tval?&t2:NULL); - } while (selrtn<0 && errno == EINTR); + if (tval) memcpy((void *)&t2,(void *)tval,sizeof(t2)); + errno = 0; + selrtn = select(maxfd,SELECT_CAST fds,NULL,NULL,tval?&t2:NULL); return(selrtn); } @@ -140,6 +136,20 @@ int sys_select(int maxfd, fd_set *fds,struct timeval *tval) #endif /* NO_SELECT */ /******************************************************************* +similar to sys_select() but catch EINTR and continue +this is what sys_select() used to do in Samba +********************************************************************/ +int sys_select_intr(int maxfd, fd_set *fds,struct timeval *tval) +{ + int ret; + do { + ret = sys_select(maxfd, fds, tval); + } while (ret == -1 && errno == EINTR); + return ret; +} + + +/******************************************************************* A wrapper for usleep in case we don't have one. ********************************************************************/ diff --git a/source3/lib/util.c b/source3/lib/util.c index e5aa20a972..f2d89eebb7 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -728,7 +728,7 @@ void msleep(int t) FD_ZERO(&fds); errno = 0; - sys_select(0,&fds,&tval); + sys_select_intr(0,&fds,&tval); GetTimeOfDay(&t2); tdiff = TvalDiff(&t1,&t2); diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c index bb62442beb..e6aef16d16 100644 --- a/source3/lib/util_sock.c +++ b/source3/lib/util_sock.c @@ -241,7 +241,7 @@ static ssize_t read_socket_with_timeout(int fd,char *buf,size_t mincnt,size_t ma FD_ZERO(&fds); FD_SET(fd,&fds); - selrtn = sys_select(fd+1,&fds,&timeout); + selrtn = sys_select_intr(fd+1,&fds,&timeout); /* Check if error */ if(selrtn == -1) { @@ -345,7 +345,7 @@ ssize_t read_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,unsigned FD_ZERO(&fds); FD_SET(fd,&fds); - selrtn = sys_select(fd+1,&fds,&timeout); + selrtn = sys_select_intr(fd+1,&fds,&timeout); if(selrtn <= 0) return selrtn; |