Browse Source

restore max code - since timeout is unsigned

Kano 12 years ago
parent
commit
4d749ff44b
1 changed files with 14 additions and 5 deletions
  1. 14 5
      usbutils.c

+ 14 - 5
usbutils.c

@@ -2035,7 +2035,7 @@ int _usb_read(struct cgpu_info *cgpu, int ep, char *buf, size_t bufsiz, int *pro
 #endif
 	struct timeval read_start, tv_finish;
 	unsigned int initial_timeout;
-	double done;
+	double max, done;
 	int bufleft, err, got, tot;
 	__maybe_unused bool first = true;
 	unsigned char *search;
@@ -2069,6 +2069,7 @@ int _usb_read(struct cgpu_info *cgpu, int ep, char *buf, size_t bufsiz, int *pro
 		bufleft = bufsiz;
 		err = LIBUSB_SUCCESS;
 		initial_timeout = timeout;
+		max = ((double)timeout) / 1000.0;
 		cgtime(&read_start);
 		while (bufleft > 0) {
 			if (ftdi)
@@ -2112,8 +2113,10 @@ int _usb_read(struct cgpu_info *cgpu, int ep, char *buf, size_t bufsiz, int *pro
 
 			done = tdiff(&tv_finish, &read_start);
 			// N.B. this is: return LIBUSB_SUCCESS with whatever size has already been read
+			if (unlikely(done >= max))
+				break;
 			timeout = initial_timeout - (done * 1000);
-			if (timeout <= 0)
+			if (!timeout)
 				break;
 		}
 
@@ -2132,6 +2135,7 @@ int _usb_read(struct cgpu_info *cgpu, int ep, char *buf, size_t bufsiz, int *pro
 	endlen = strlen(end);
 	err = LIBUSB_SUCCESS;
 	initial_timeout = timeout;
+	max = ((double)timeout) / 1000.0;
 	cgtime(&read_start);
 	while (bufleft > 0) {
 		if (ftdi)
@@ -2193,8 +2197,10 @@ int _usb_read(struct cgpu_info *cgpu, int ep, char *buf, size_t bufsiz, int *pro
 
 		done = tdiff(&tv_finish, &read_start);
 		// N.B. this is: return LIBUSB_SUCCESS with whatever size has already been read
+		if (unlikely(done >= max))
+			break;
 		timeout = initial_timeout - (done * 1000);
-		if (timeout <= 0)
+		if (!timeout)
 			break;
 	}
 
@@ -2215,7 +2221,7 @@ int _usb_write(struct cgpu_info *cgpu, int ep, char *buf, size_t bufsiz, int *pr
 #endif
 	struct timeval read_start, tv_finish;
 	unsigned int initial_timeout;
-	double done;
+	double max, done;
 	__maybe_unused bool first = true;
 	int err, sent, tot;
 
@@ -2235,6 +2241,7 @@ int _usb_write(struct cgpu_info *cgpu, int ep, char *buf, size_t bufsiz, int *pr
 	tot = 0;
 	err = LIBUSB_SUCCESS;
 	initial_timeout = timeout;
+	max = ((double)timeout) / 1000.0;
 	cgtime(&read_start);
 	while (bufsiz > 0) {
 		sent = 0;
@@ -2263,8 +2270,10 @@ int _usb_write(struct cgpu_info *cgpu, int ep, char *buf, size_t bufsiz, int *pr
 
 		done = tdiff(&tv_finish, &read_start);
 		// N.B. this is: return LIBUSB_SUCCESS with whatever size was written
+		if (unlikely(done >= max))
+			break;
 		timeout = initial_timeout - (done * 1000);
-		if (timeout <= 0)
+		if (!timeout)
 			break;
 	}