summaryrefslogtreecommitdiff
path: root/lib/util/util.c
diff options
context:
space:
mode:
authorBjörn Jacke <bj@sernet.de>2010-09-16 21:36:37 +0200
committerBjörn Jacke <bj@sernet.de>2010-09-16 21:38:20 +0200
commit2b254c814b139f93997f61525d77b934596c53a3 (patch)
tree945897a1c52a9d6d8f5958f47b6c8b4a877d7164 /lib/util/util.c
parent0fd16018a1c993166eae72390433398347538a81 (diff)
downloadsamba-2b254c814b139f93997f61525d77b934596c53a3.tar.gz
samba-2b254c814b139f93997f61525d77b934596c53a3.tar.bz2
samba-2b254c814b139f93997f61525d77b934596c53a3.zip
s3/s4: merge msleep and smb_msleep
the merged variant is renamed to smb_msleep as some platforms already have a msleep function.
Diffstat (limited to 'lib/util/util.c')
-rw-r--r--lib/util/util.c49
1 files changed, 42 insertions, 7 deletions
diff --git a/lib/util/util.c b/lib/util/util.c
index 076ddf47fc..296a2a6c68 100644
--- a/lib/util/util.c
+++ b/lib/util/util.c
@@ -165,15 +165,50 @@ _PUBLIC_ bool directory_create_or_exist(const char *dname, uid_t uid,
Sleep for a specified number of milliseconds.
**/
-_PUBLIC_ void msleep(unsigned int t)
+_PUBLIC_ void smb_msleep(unsigned int t)
{
- struct timeval tval;
+#if defined(HAVE_NANOSLEEP)
+ struct timespec ts;
+ int ret;
+
+ ts.tv_sec = t/1000;
+ ts.tv_nsec = 1000000*(t%1000);
+
+ do {
+ errno = 0;
+ ret = nanosleep(&ts, &ts);
+ } while (ret < 0 && errno == EINTR && (ts.tv_sec > 0 || ts.tv_nsec > 0));
+#else
+ unsigned int tdiff=0;
+ struct timeval tval,t1,t2;
+ fd_set fds;
- tval.tv_sec = t/1000;
- tval.tv_usec = 1000*(t%1000);
- /* this should be the real select - do NOT replace
- with sys_select() */
- select(0,NULL,NULL,NULL,&tval);
+ GetTimeOfDay(&t1);
+ t2 = t1;
+
+ while (tdiff < t) {
+ tval.tv_sec = (t-tdiff)/1000;
+ tval.tv_usec = 1000*((t-tdiff)%1000);
+
+ /* Never wait for more than 1 sec. */
+ if (tval.tv_sec > 1) {
+ tval.tv_sec = 1;
+ tval.tv_usec = 0;
+ }
+
+ FD_ZERO(&fds);
+ errno = 0;
+ select(0,&fds,NULL,NULL,&tval);
+
+ GetTimeOfDay(&t2);
+ if (t2.tv_sec < t1.tv_sec) {
+ /* Someone adjusted time... */
+ t1 = t2;
+ }
+
+ tdiff = usec_time_diff(&t1,&t2)/1000;
+ }
+#endif
}
/**