[PD-dev] clock_delay question

Martin Peach martin.peach at sympatico.ca
Sun Mar 21 19:44:20 CET 2010

Ivica Ico Bukvic wrote:
>>> Another question related to this. In the netclient.c (maxlib) there is
>>> the following code excerpt:
>>> 	/* get's called when connection has been made */
>>> static void netclient_tick(t_netclient *x)
>>> {
>>>     outlet_float(x->x_outconnect, 1);
>>> 		/* add pollfunction for checking for input */
>>> 	sys_addpollfn(x->x_fd, (t_fdpollfn)netclient_rcv, x);
>>> }
>>> Isn't the outlet_float call here unsafe as it is being triggered by an
>>> external potentially out-of-sync force (namely connection)? Shouldn't
>>> this be done through clock_delay() just to be safe? If I understand this
>>> correctly, Pd does audio in 64-byte chunks and then the data processing
>>> in between. Is this correct?
>>> If so, how does Pd deal with such events if they happen during the times
>>> the pd's message tree is not being traversed (e.g. during the dsp
>>> cycle)?
>> That is why they are poll functions. The poll functions are polled right 
>> after the dsp update, in sys_microsleep(). A select call is made to see 
>> if any of the file descriptors are ready for read/writing. So if the 
>> socket connects at any random time, the float will only be sent out the 
>> outlet after the dsp. Another poll function is then registered to check 
>> for received data on the socket.
>> sys_microsleep() is called from m_pollingscheduler(), Pd's main loop, in 
>> m_sched.c, after the dacs are written, so (as I understand it), it is 
>> safe to make calls from a pollfunction. I think it's only outlet writes 
>> made directly from the dsp object's perform routine that are dangerous, 
>> they should be scheduled for right after the dac writes using 
>> clock_delay(0).
>> Martin
> Thanks for the explanation. I am not sure however how does this apply to
> the aforesaid example, so I would greatly appreciate your insight in
> that specific scenario. Namely:
> In the netclient example is the outlet_float call ok even though the
> netclient_tick function containing it is triggered by an external
> out-of-sync force (namely network connection)? 

Yes, because netclient_tick is called after a clock timeout that was 
triggered by the connect routine running in a different thread.

> If so, what ensures that
> this particular call is not going to happen right in the middle of other
> GUI stuff already being sent out and/or dsp loop as the network client
> has no idea when that is actually happening? Shouldn't this be also
> clock_delay()?

It _is_ clock_delayed.
netclient_tick() is associated with a clock in netclient_new() as:
     x->x_clock = clock_new(x, (t_method)netclient_tick);
and the x_clock is set to timeout in 0 milliseconds in 
netclient_child_connect() after the socket connects, which can happen at 
any time since it's running in a separate thread.
The clock will only be checked at one point in the main loop, after the 
dacs have been written, so the function it calls will run at a safe time.

> In other words, are outlet_<something> calls safe to be made from
> non-dsp functions no matter when they happen *or* are they safe to be
> made only in objects that are being pushed by incoming data streams
> (which is typically most of Pd objects, but not all, e.g. such as metro
> for instance)? If latter is the case, I would say clock_delay(0) is
> necessary even on the aforesaid call.

I guess the rule is this:
Outlet calls are safe as long as they are:
1> outside of dsp perform routines and
2> called from Pd's main thread.


More information about the Pd-dev mailing list