diff --git a/lib/multi.c b/lib/multi.c index e402be099c..4b6a6de6ec 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -86,7 +86,8 @@ static void multi_xfer_tbl_dump(struct Curl_multi *multi); static const struct curltime *multi_now(struct Curl_multi *multi) { - curlx_pnow(&multi->now); + if(!multi->processing_socket) + curlx_pnow(&multi->now); return &multi->now; } @@ -3266,6 +3267,9 @@ static CURLMcode multi_socket(struct Curl_multi *multi, (void)ev_bitmask; sigpipe_init(&pipe_ctx); + curlx_pnow(&multi->now); + multi->processing_socket = TRUE; + if(checkall) { /* *perform() deals with running_handles on its own */ mresult = multi_perform(multi, running_handles); @@ -3298,7 +3302,7 @@ static CURLMcode multi_socket(struct Curl_multi *multi, goto out; } - multi_mark_expired_as_dirty(multi, multi_now(multi)); + multi_mark_expired_as_dirty(multi, &multi->now); mresult = multi_run_dirty(multi, &pipe_ctx, &run_xfers); if(mresult) goto out; @@ -3329,6 +3333,7 @@ out: if(CURLM_OK >= mresult) mresult = Curl_update_timer(multi); + multi->processing_socket = FALSE; return mresult; } @@ -3730,7 +3735,10 @@ void Curl_expire_ex(struct Curl_easy *data, DEBUGASSERT(id < EXPIRE_LAST); - set = *Curl_pgrs_now(data); + if(multi->processing_socket) + set = multi->now; + else + curlx_pnow(&set); set.tv_sec += (time_t)(milli / 1000); /* may be a 64 to 32-bit conversion */ set.tv_usec += (int)(milli % 1000) * 1000; diff --git a/lib/multihandle.h b/lib/multihandle.h index b0c10e92c1..6b6e5303ed 100644 --- a/lib/multihandle.h +++ b/lib/multihandle.h @@ -206,6 +206,7 @@ struct Curl_multi { BIT(xfer_buf_borrowed); /* xfer_buf is currently being borrowed */ BIT(xfer_ulbuf_borrowed); /* xfer_ulbuf is currently being borrowed */ BIT(xfer_sockbuf_borrowed); /* xfer_sockbuf is currently being borrowed */ + BIT(processing_socket); BIT(quick_exit); /* do not join threads on cleanup */ #ifdef DEBUGBUILD BIT(warned); /* true after user warned of DEBUGBUILD */