|
|
|
@ -41,6 +41,7 @@ |
|
|
|
|
#include <unistd.h> |
|
|
|
|
#include <grpc/support/log.h> |
|
|
|
|
#include <grpc/support/time.h> |
|
|
|
|
#include "src/core/iomgr/block_annotate.h" |
|
|
|
|
|
|
|
|
|
static struct timespec timespec_from_gpr(gpr_timespec gts) { |
|
|
|
|
struct timespec rv; |
|
|
|
@ -126,6 +127,7 @@ void gpr_sleep_until(gpr_timespec until) { |
|
|
|
|
gpr_timespec now; |
|
|
|
|
gpr_timespec delta; |
|
|
|
|
struct timespec delta_ts; |
|
|
|
|
int ns_result; |
|
|
|
|
|
|
|
|
|
for (;;) { |
|
|
|
|
/* We could simplify by using clock_nanosleep instead, but it might be
|
|
|
|
@ -137,7 +139,10 @@ void gpr_sleep_until(gpr_timespec until) { |
|
|
|
|
|
|
|
|
|
delta = gpr_time_sub(until, now); |
|
|
|
|
delta_ts = timespec_from_gpr(delta); |
|
|
|
|
if (nanosleep(&delta_ts, NULL) == 0) { |
|
|
|
|
GRPC_IOMGR_START_BLOCKING_REGION; |
|
|
|
|
ns_result = nanosleep(&delta_ts, NULL); |
|
|
|
|
GRPC_IOMGR_END_BLOCKING_REGION; |
|
|
|
|
if (ns_result == 0) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|