Re: Restart pg_usleep when interrupted - Mailing list pgsql-hackers

From Nathan Bossart
Subject Re: Restart pg_usleep when interrupted
Date
Msg-id ZpA4_Pw14FCP6025@nathan
Whole thread Raw
In response to Re: Restart pg_usleep when interrupted  (Sami Imseih <samimseih@gmail.com>)
Responses Re: Restart pg_usleep when interrupted
Re: Restart pg_usleep when interrupted
List pgsql-hackers
On Thu, Jul 11, 2024 at 01:10:25PM -0500, Sami Imseih wrote:
>> I'm curious why we wouldn't just subtract "elapsed_time" from "delay" at
>> the bottom of the while loop to avoid needing this extra check.  
> 
> Can you elaborate further? I am not sure how this will work since delay is a timespec 
> and elapsed time is an instr_time. 
> 
> Also, in every iteration of the loop, the delay must be set to the remaining time. The
> purpose of the elapsed_time is to make sure that we don´t surpass requested time
> delay as an additional safeguard.

I'm imagining something like this:

    struct timespec delay;
    TimestampTz end_time;

    end_time = TimestampTzPlusMilliseconds(GetCurrentTimestamp(), msec);

    do
    {
        long        secs;
        int         microsecs;

        TimestampDifference(GetCurrentTimestamp(), end_time,
                            &secs, µsecs);

        delay.tv_sec = secs;
        delay.tv_nsec = microsecs * 1000;

    } while (nanosleep(&delay, NULL) == -1 && errno == EINTR);

-- 
nathan



pgsql-hackers by date:

Previous
From: Sami Imseih
Date:
Subject: Re: Restart pg_usleep when interrupted
Next
From: Robert Haas
Date:
Subject: Re: Parent/child context relation in pg_get_backend_memory_contexts()