This is needed to allow other handlers to add new timers.
/* ================================================== */
+int
+LCL_IsFirstParameterChangeHandler(LCL_ParameterChangeHandler handler)
+{
+ return change_list.next->handler == handler;
+}
+
+/* ================================================== */
+
static void
invoke_parameter_change_handlers(struct timeval *raw, struct timeval *cooked,
double dfreq, double doffset,
/* Remove a handler */
extern void LCL_RemoveParameterChangeHandler(LCL_ParameterChangeHandler, void *anything);
+/* Check if a handler is invoked first when dispatching */
+extern int LCL_IsFirstParameterChangeHandler(LCL_ParameterChangeHandler handler);
+
/* Function type for handlers to be called back when an indeterminate
offset is introduced into the local time. This situation occurs
when the frequency must be adjusted to effect a clock slew and
int i;
if (change_type != LCL_ChangeAdjust) {
+ /* Make sure this handler is invoked first in order to not shift new timers
+ added from other handlers */
+ assert(LCL_IsFirstParameterChangeHandler(handle_slew));
+
/* If a step change occurs, just shift all raw time stamps by the offset */
for (ptr = timer_queue.next; ptr != &timer_queue; ptr = ptr->next) {