svn commit: samba r4544 - in trunk/source/lib: .

jra at samba.org jra at samba.org
Thu Jan 6 00:45:40 GMT 2005


Author: jra
Date: 2005-01-06 00:45:39 +0000 (Thu, 06 Jan 2005)
New Revision: 4544

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=4544

Log:
Fix based on work by Derrell.Lipman at UnwiredUniverse.com :
                                                                                                                                        
  * In an application with signals, it was possible for functions to block
    indefinitely while awaiting timeouts.  This patch ensures that if a system
    call with a timeout is aborted and needs to be restarted, it is restarted
    with a timeout which is adjusted for the amount of time already waited.
                                                                                                                                        
Jeremy.

Modified:
   trunk/source/lib/select.c


Changeset:
Modified: trunk/source/lib/select.c
===================================================================
--- trunk/source/lib/select.c	2005-01-05 16:55:33 UTC (rev 4543)
+++ trunk/source/lib/select.c	2005-01-06 00:45:39 UTC (rev 4544)
@@ -128,12 +128,23 @@
 {
 	int ret;
 	fd_set *readfds2, readfds_buf, *writefds2, writefds_buf, *errorfds2, errorfds_buf;
-	struct timeval tval2, *ptval;
+	struct timeval tval2, *ptval, end_time;
 
 	readfds2 = (readfds ? &readfds_buf : NULL);
 	writefds2 = (writefds ? &writefds_buf : NULL);
 	errorfds2 = (errorfds ? &errorfds_buf : NULL);
-	ptval = (tval ? &tval2 : NULL);
+	if (tval) {
+		GetTimeOfDay(&end_time);
+		end_time.tv_sec += tval->tv_sec;
+		end_time.tv_usec += tval->tv_usec;
+		end_time.tv_sec += end_time.tv_usec / 1000000;
+		end_time.tv_usec %= 1000000;
+		errno = 0;
+		tval2 = *tval;
+		ptval = &tval2;
+	} else {
+		ptval = NULL;
+	}
 
 	do {
 		if (readfds)
@@ -142,9 +153,20 @@
 			writefds_buf = *writefds;
 		if (errorfds)
 			errorfds_buf = *errorfds;
-		if (tval)
-			tval2 = *tval;
+		if (ptval && (errno == EINTR)) {
+			struct timeval now_time;
+			SMB_BIG_INT tdif;
 
+			GetTimeOfDay(&now_time);
+			tdif = usec_time_diff(&end_time, &now_time);
+			if (tdif <= 0) {
+				ret = 0; /* time expired. */
+				break;
+			}
+			ptval->tv_sec = tdif / 1000000;
+			ptval->tv_usec = tdif % 1000000;
+		}
+
 		ret = sys_select(maxfd, readfds2, writefds2, errorfds2, ptval);
 	} while (ret == -1 && errno == EINTR);
 



More information about the samba-cvs mailing list