|
@@ -5173,29 +5173,30 @@ push_inner(struct mg_context *ctx,
|
|
|
|
|
|
/* Only in case n=0 (timeout), repeat calling the write function */
|
|
/* Only in case n=0 (timeout), repeat calling the write function */
|
|
|
|
|
|
- /* Quick fix for #474 */
|
|
|
|
- (void)ms_wait;
|
|
|
|
- mg_sleep(1);
|
|
|
|
|
|
+ /* If send failed, wait before retry */
|
|
|
|
+ if (fp != NULL) {
|
|
|
|
+ /* For files, just wait a fixed time,
|
|
|
|
+ * maybe an average disk seek time. */
|
|
|
|
+ mg_sleep(ms_wait > 10 ? 10 : ms_wait);
|
|
|
|
+ } else {
|
|
|
|
+ /* For sockets, wait for the socket using select */
|
|
|
|
+ fd_set wfds;
|
|
|
|
+ struct timeval tv;
|
|
|
|
+ int sret;
|
|
|
|
|
|
- /* Alternatively, use select (TODO: test):
|
|
|
|
- * {
|
|
|
|
- * fd_set wfds;
|
|
|
|
- * struct timeval tv;
|
|
|
|
- * int sret;
|
|
|
|
- *
|
|
|
|
- * FD_ZERO(&wfds);
|
|
|
|
- * FD_SET(sock, &wfds);
|
|
|
|
- * tv.tv_sec = ms_wait / 1000;
|
|
|
|
- * tv.tv_usec = (ms_wait % 1000) * 1000;
|
|
|
|
- *
|
|
|
|
- * sret = select(sock+ 1, NULL, &wfds, NULL, &tv);
|
|
|
|
- *
|
|
|
|
- * if (sret > 0) {
|
|
|
|
- * continue;
|
|
|
|
- * }
|
|
|
|
- *
|
|
|
|
- * }
|
|
|
|
- */
|
|
|
|
|
|
+ FD_ZERO(&wfds);
|
|
|
|
+ FD_SET(sock, &wfds);
|
|
|
|
+ tv.tv_sec = ms_wait / 1000;
|
|
|
|
+ tv.tv_usec = (ms_wait % 1000) * 1000;
|
|
|
|
+
|
|
|
|
+ sret = select(sock + 1, NULL, &wfds, NULL, &tv);
|
|
|
|
+
|
|
|
|
+ if (sret > 0) {
|
|
|
|
+ /* We got ready to write. Don't check the timeout
|
|
|
|
+ * but directly go back to write again. */
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
if (timeout >= 0) {
|
|
if (timeout >= 0) {
|
|
now = mg_get_current_time_ns();
|
|
now = mg_get_current_time_ns();
|