[PATCH 2/3] Cygwin: dsp: Reduce wait time for blocking read().

Brian Inglis Brian.Inglis@Shaw.ca
Tue Sep 5 17:35:29 GMT 2023


On 2023-09-05 05:48, Takashi Yano via Cygwin-apps wrote:
> On Tue, 5 Sep 2023 12:37:28 +0100
> Jon Turney wrote:
>> On 05/09/2023 10:28, Takashi Yano wrote:
>>> Previous wait time of 100msec is too long if application specifies
>>> smaller buffer. With this patch, the wait time is reduced to 1msec.
>>
>> I don't really have the context to understand this change, but it seems
>> to me the obvious questions to ask are:
>>
>> Are there negative consequences of making this wait much smaller (i.e.
>> lots more CPU spent busy-waiting?)
>>
>> Your comment seems to imply that the wait time should be proportional to
>> the buffer size and sample rate?
>>
>>> ---
>>>    winsup/cygwin/fhandler/dsp.cc | 4 ++--
>>>    1 file changed, 2 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/winsup/cygwin/fhandler/dsp.cc b/winsup/cygwin/fhandler/dsp.cc
>>> index e872aa08c..00f2bab69 100644
>>> --- a/winsup/cygwin/fhandler/dsp.cc
>>> +++ b/winsup/cygwin/fhandler/dsp.cc
>>> @@ -931,8 +931,8 @@ fhandler_dev_dsp::Audio_in::waitfordata ()
>>>    	  set_errno (EAGAIN);
>>>    	  return false;
>>>    	}
>>> -      debug_printf ("100ms");
>>> -      switch (cygwait (100))
>>> +      debug_printf ("1ms");
>>> +      switch (cygwait (1))
>>>    	{
>>>    	case WAIT_SIGNALED:
>>>    	  if (!_my_tls.call_signal_handler ())
> 
> The code around the modification is as follows.
> 
>    while (!Qisr2app_->recv (&pHdr))
>      {
>        if (fh->is_nonblocking ())
>          {
>            set_errno (EAGAIN);
>            return false;
>          }
>        debug_printf ("1ms");
>        switch (cygwait (1))
>          {
>          case WAIT_SIGNALED:
>            if (!_my_tls.call_signal_handler ())
>              {
>                set_errno (EINTR);
>                return false;
>              }
>            break;
>          case WAIT_CANCELED:
>            pthread::static_cancel_self ();
>            /*NOTREACHED*/
>          default:
>            break;
>          }
>      }
> 
> while loop is very short, so almost all the time in the loop
> is consumed by cygwait() even with wait time of 1msec.
> 
> Theoretically, the CPU gets 100 times load, however, it is
> too small to care the CPU load.

Our sound and synth guy *Achim* would probably be the best person to review and 
comment!

I know Windows historically had to add support for a 1ms MultiMedia Timer, to 
avoid A/V artifacts, as ms really matter for audio delay and phasing, when 
peer-to-peer digital media exchange first became popular, and it is enabled for 
the system by Meinberg's Windows ntpd daemon, which needs it for network timing.

-- 
Take care. Thanks, Brian Inglis              Calgary, Alberta, Canada

La perfection est atteinte                   Perfection is achieved
non pas lorsqu'il n'y a plus rien à ajouter  not when there is no more to add
mais lorsqu'il n'y a plus rien à retirer     but when there is no more to cut
                                 -- Antoine de Saint-Exupéry


More information about the Cygwin-apps mailing list