[PD-cvs] pd/src m_sched.c,1.5.4.35.2.16,1.5.4.35.2.17
Tim Blechmann
timblech at users.sourceforge.net
Wed Jun 28 12:51:22 CEST 2006
Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22138/src
Modified Files:
Tag: devel_0_39
m_sched.c
Log Message:
fix for idle callbacks
replacing tabs with spaces
Index: m_sched.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_sched.c,v
retrieving revision 1.5.4.35.2.16
retrieving revision 1.5.4.35.2.17
diff -C2 -d -r1.5.4.35.2.16 -r1.5.4.35.2.17
*** m_sched.c 27 Jun 2006 16:31:17 -0000 1.5.4.35.2.16
--- m_sched.c 28 Jun 2006 10:51:16 -0000 1.5.4.35.2.17
***************
*** 372,386 ****
static void run_clock_callbacks(double next_sys_time)
{
! if (clock_setlist && clock_setlist->c_settime <= next_sys_time)
! {
! do
! {
! t_clock *c = clock_setlist;
! sys_time = c->c_settime;
! clock_unset(c); /* the compiler should easily inline this */
! outlet_setstacklim();
! (*c->c_fn)(c->c_owner);
! }
! while (clock_setlist && clock_setlist->c_settime <= next_sys_time);
}
}
--- 372,386 ----
static void run_clock_callbacks(double next_sys_time)
{
! if (clock_setlist && clock_setlist->c_settime <= next_sys_time)
! {
! do
! {
! t_clock *c = clock_setlist;
! sys_time = c->c_settime;
! clock_unset(c); /* the compiler should easily inline this */
! outlet_setstacklim();
! (*c->c_fn)(c->c_owner);
! }
! while (clock_setlist && clock_setlist->c_settime <= next_sys_time);
}
}
***************
*** 390,402 ****
void sched_tick(double next_sys_time)
{
! run_clock_callbacks(next_sys_time);
! sys_time = next_sys_time;
! sched_diddsp++; /* rethink: how to get rid of this stupid histogram??? */
dsp_tick();
! /* rethink: should we really do all this midi messaging in the realtime thread ? */
! sys_pollmidiqueue();
! sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
}
--- 390,402 ----
void sched_tick(double next_sys_time)
{
! run_clock_callbacks(next_sys_time);
! sys_time = next_sys_time;
! sched_diddsp++; /* rethink: how to get rid of this stupid histogram??? */
dsp_tick();
! /* rethink: should we really do all this midi messaging in the realtime thread ? */
! sys_pollmidiqueue();
! sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
}
***************
*** 421,434 ****
sys_time_per_dsp_tick = (TIMEUNITPERSEC) *
((double)sys_schedblocksize) / sys_dacsr;
!
/* T.Grill - lock mutex */
! sys_lock();
!
sys_clearhist();
! /* tb: adapt sleepgrain with advance */
! sys_update_sleepgrain();
! sched_set_using_dacs(0); /* tb: dsp is switched off */
sys_initmidiqueue();
--- 421,434 ----
sys_time_per_dsp_tick = (TIMEUNITPERSEC) *
((double)sys_schedblocksize) / sys_dacsr;
!
/* T.Grill - lock mutex */
! sys_lock();
!
sys_clearhist();
! /* tb: adapt sleepgrain with advance */
! sys_update_sleepgrain();
! sched_set_using_dacs(0); /* tb: dsp is switched off */
sys_initmidiqueue();
***************
*** 436,527 ****
while (!sys_quit)
{
! if (!sys_callbackscheduler || !sched_usedacs)
! while (sys_keepsched)
! {
! int didsomething = 0;
! int timeforward;
! waitfortick:
! if (sched_usedacs)
! {
! timeforward = sys_send_dacs();
! /* if dacs remain "idle" for 1 sec, they're hung up. */
! if (timeforward != 0)
! idlecount = 0;
! else
! {
! idlecount++;
! if (!(idlecount & 31))
! {
! static double idletime;
! /* on 32nd idle, start a clock watch; every
! 32 ensuing idles, check it */
! if (idlecount == 32)
! idletime = sys_getrealtime();
! else if (sys_getrealtime() - idletime > 1.)
! {
! post("audio I/O stuck... closing audio\n");
! sys_close_audio();
! sched_set_using_dacs(0);
! goto waitfortick;
! }
! }
! }
! }
! else
! {
! if (1000. * (sys_getrealtime() - sched_referencerealtime)
! > clock_gettimesince(sched_referencelogicaltime))
! timeforward = SENDDACS_YES;
! else timeforward = SENDDACS_NO;
! }
! sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
! if (timeforward != SENDDACS_NO)
! {
! sched_tick(sys_time + sys_time_per_dsp_tick);
! }
! if (timeforward == SENDDACS_YES)
! didsomething = 1;
! sys_pollmidiqueue();
! if (sys_pollgui())
! {
! didsomething = 1;
! }
! /* test for idle; if so, do graphics updates. */
! if (!didsomething)
! {
! sched_pollformeters();
! /* tb: call idle callbacks */
! if (timeforward != SENDDACS_SLEPT)
! {
! run_idle_callbacks(sys_sleepgrain);
! }
! }
! }
! else /* tb: scheduler for callback-based dsp scheduling */
! while(sys_keepsched)
! {
/* tb: allow the audio callback to run */
sys_unlock();
! sys_microsleep(sys_sleepgrain);
! sys_lock();
! sys_pollmidiqueue();
! sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
!
! if (sys_pollgui())
! continue;
!
! /* do graphics updates and run idle callbacks */
sched_pollformeters();
! }
! sys_keepsched = 1;
! }
sys_close_audio();
--- 436,527 ----
while (!sys_quit)
{
! if (!sys_callbackscheduler || !sched_usedacs)
! while (sys_keepsched)
! {
! int didsomething = 0;
! int timeforward;
! waitfortick:
! if (sched_usedacs)
! {
! timeforward = sys_send_dacs();
! /* if dacs remain "idle" for 1 sec, they're hung up. */
! if (timeforward != 0)
! idlecount = 0;
! else
! {
! idlecount++;
! if (!(idlecount & 31))
! {
! static double idletime;
! /* on 32nd idle, start a clock watch; every
! 32 ensuing idles, check it */
! if (idlecount == 32)
! idletime = sys_getrealtime();
! else if (sys_getrealtime() - idletime > 1.)
! {
! post("audio I/O stuck... closing audio\n");
! sys_close_audio();
! sched_set_using_dacs(0);
! goto waitfortick;
! }
! }
! }
! }
! else
! {
! if (1000. * (sys_getrealtime() - sched_referencerealtime)
! > clock_gettimesince(sched_referencelogicaltime))
! timeforward = SENDDACS_YES;
! else timeforward = SENDDACS_NO;
! }
! sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
! if (timeforward != SENDDACS_NO)
! {
! sched_tick(sys_time + sys_time_per_dsp_tick);
! }
! if (timeforward == SENDDACS_YES)
! didsomething = 1;
! sys_pollmidiqueue();
! if (sys_pollgui())
! {
! didsomething = 1;
! }
! /* test for idle; if so, do graphics updates. */
! if (!didsomething)
! {
! sched_pollformeters();
! /* tb: call idle callbacks */
! if (timeforward != SENDDACS_SLEPT)
! {
! run_idle_callbacks(sys_sleepgrain);
! }
! }
! }
! else /* tb: scheduler for callback-based dsp scheduling */
! while(sys_keepsched)
! {
/* tb: allow the audio callback to run */
sys_unlock();
! sys_microsleep(sys_sleepgrain);
! sys_lock();
! sys_pollmidiqueue();
! sys_setmiditimediff(0, 1e-6 * sys_schedadvance);
!
! if (sys_pollgui())
! continue;
!
! /* do graphics updates and run idle callbacks */
sched_pollformeters();
! }
! sys_keepsched = 1;
! }
sys_close_audio();
***************
*** 540,550 ****
void sys_lock(void)
{
! pthread_mutex_lock(&sys_mutex);
}
void sys_unlock(void)
{
! pthread_mutex_unlock(&sys_mutex);
! pthread_cond_signal(&sys_cond);
}
--- 540,550 ----
void sys_lock(void)
{
! pthread_mutex_lock(&sys_mutex);
}
void sys_unlock(void)
{
! pthread_mutex_unlock(&sys_mutex);
! pthread_cond_signal(&sys_cond);
}
***************
*** 561,570 ****
int gettimeofday (struct timeval *tv, void* tz)
{
! __int64 now; /* time since 1 Jan 1601 in 100ns */
!
! GetSystemTimeAsFileTime ((FILETIME*) &now);
! tv->tv_usec = (long) ((now / 10LL) % 1000000LL);
! tv->tv_sec = (long) ((now - 116444736000000000LL) / 10000000LL);
! return (0);
}
#endif
--- 561,570 ----
int gettimeofday (struct timeval *tv, void* tz)
{
! __int64 now; /* time since 1 Jan 1601 in 100ns */
!
! GetSystemTimeAsFileTime ((FILETIME*) &now);
! tv->tv_usec = (long) ((now / 10LL) % 1000000LL);
! tv->tv_sec = (long) ((now - 116444736000000000LL) / 10000000LL);
! return (0);
}
#endif
***************
*** 598,602 ****
if (ret)
! post("timeout, %d", ret);
return ret;
--- 598,602 ----
if (ret)
! post("timeout, %d", ret);
return ret;
***************
*** 606,639 ****
int sys_timedlock(int microsec)
{
! struct timespec timeout;
! int ret;
! struct timeval now;
! if (sys_trylock() == 0)
! return 0;
! if (microsec < 1e3)
! microsec = 1e3;
! gettimeofday(&now,0);
!
! timeout.tv_sec = now.tv_sec;
! timeout.tv_nsec = (now.tv_usec + microsec) * 1000;
!
! while (timeout.tv_nsec > 1e9)
! {
! timeout.tv_sec += 1;
! timeout.tv_nsec -= 1e9;
! }
!
! /* in case the lock has been released during the system call, try
! again before waiting for the signal */
! if (sys_trylock() == 0)
! return 0;
!
! ret = pthread_cond_timedwait(&sys_cond, &sys_mutex, &timeout);
!
! return ret;
}
#endif
--- 606,639 ----
int sys_timedlock(int microsec)
{
! struct timespec timeout;
! int ret;
! struct timeval now;
! if (sys_trylock() == 0)
! return 0;
! if (microsec < 1e3)
! microsec = 1e3;
! gettimeofday(&now,0);
!
! timeout.tv_sec = now.tv_sec;
! timeout.tv_nsec = (now.tv_usec + microsec) * 1000;
!
! while (timeout.tv_nsec > 1e9)
! {
! timeout.tv_sec += 1;
! timeout.tv_nsec -= 1e9;
! }
!
! /* in case the lock has been released during the system call, try
! again before waiting for the signal */
! if (sys_trylock() == 0)
! return 0;
!
! ret = pthread_cond_timedwait(&sys_cond, &sys_mutex, &timeout);
!
! return ret;
}
#endif
***************
*** 658,663 ****
void sys_exit(void)
{
! sys_keepsched = 0;
! sys_quit = 1;
}
--- 658,663 ----
void sys_exit(void)
{
! sys_keepsched = 0;
! sys_quit = 1;
}
***************
*** 670,677 ****
typedef struct _sched_callback
{
! struct _sched_callback* next; /* next callback in ringbuffer / in fifo */
! t_int (*function) (t_int* argv);
! t_int* argv;
! t_int argc;
} t_sched_callback;
--- 670,677 ----
typedef struct _sched_callback
{
! struct _sched_callback* next; /* next callback in ringbuffer / in fifo */
! t_int (*function) (t_int* argv);
! t_int* argv;
! t_int argc;
} t_sched_callback;
***************
*** 679,694 ****
void sys_callback(t_int (*callback) (t_int* argv), t_int* argv, t_int argc)
{
! t_sched_callback* noo = (t_sched_callback*) getbytes
! (sizeof(t_sched_callback));
! noo->function = callback;
! noo->argv = (t_int*) copybytes (argv, argc * sizeof (t_int));
! noo->argc = argc;
! noo->next = NULL;
! if (callback_fifo == NULL)
! callback_fifo = fifo_init();
!
! fifo_put(callback_fifo, noo);
}
--- 679,702 ----
void sys_callback(t_int (*callback) (t_int* argv), t_int* argv, t_int argc)
{
! t_sched_callback* noo = (t_sched_callback*) getbytes
! (sizeof(t_sched_callback));
! noo->function = callback;
! if (argv && argc)
! {
! noo->argv = (t_int*) copybytes (argv, argc * sizeof (t_int));
! noo->argc = argc;
! }
! else
! {
! noo->argc = 0;
! noo->argv = NULL;
! }
! noo->next = NULL;
! if (callback_fifo == NULL)
! callback_fifo = fifo_init();
!
! fifo_put(callback_fifo, noo);
}
***************
*** 696,701 ****
void sys_init_idle_callbacks(void)
{
! callback_fifo = fifo_init(); /* tb: initialize fifo for idle callbacks */
! }
static t_sched_callback *ringbuffer_head;
--- 704,709 ----
void sys_init_idle_callbacks(void)
{
! callback_fifo = fifo_init(); /* tb: initialize fifo for idle callbacks */
! }
static t_sched_callback *ringbuffer_head;
***************
*** 703,765 ****
void run_all_idle_callbacks(void)
{
! t_sched_callback * new_callback;
! /* append idle callback to ringbuffer */
! while (new_callback = (t_sched_callback*) fifo_get(callback_fifo))
! {
! t_sched_callback * next;
!
! /* set the next field to NULL ... it might be set in the fifo */
! new_callback->next = NULL;
! if (ringbuffer_head == NULL)
! {
! ringbuffer_head = new_callback;
! }
! else
! {
! next = ringbuffer_head;
! while (next->next != 0)
! next = next->next;
! next->next = new_callback;
! }
! }
! if (ringbuffer_head != NULL)
! {
! t_sched_callback * idle_callback = ringbuffer_head;
! t_sched_callback * last = NULL;
! t_sched_callback * next;
! do
! {
! int status;
! status = (idle_callback->function)(idle_callback->argv);
!
! switch (status)
! {
! /* callbacks returning 0 will be deleted */
! case 0:
! next = idle_callback->next;
! freebytes (idle_callback->argv, idle_callback->argc);
! freebytes ((void*)idle_callback, sizeof(t_sched_callback));
!
! if (last == NULL)
! ringbuffer_head = next;
! else
! last->next = next;
!
! idle_callback = next;
!
! /* callbacks returning 1 will be run again */
! case 1:
! break;
! /* callbacks returning 2 will be run during the next idle callback */
! case 2:
! last = idle_callback;
! idle_callback = idle_callback->next;
! }
}
! while ((idle_callback != NULL));
}
}
--- 711,774 ----
void run_all_idle_callbacks(void)
{
! t_sched_callback * new_callback;
! /* append idle callback to ringbuffer */
! while (new_callback = (t_sched_callback*) fifo_get(callback_fifo))
! {
! t_sched_callback * next;
!
! /* set the next field to NULL ... it might be set in the fifo */
! new_callback->next = NULL;
! if (ringbuffer_head == NULL)
! {
! ringbuffer_head = new_callback;
! }
! else
! {
! next = ringbuffer_head;
! while (next->next != 0)
! next = next->next;
! next->next = new_callback;
! }
! }
! if (ringbuffer_head != NULL)
! {
! t_sched_callback * idle_callback = ringbuffer_head;
! t_sched_callback * last = NULL;
! t_sched_callback * next;
! do
! {
! int status;
! status = (idle_callback->function)(idle_callback->argv);
!
! switch (status)
! {
! /* callbacks returning 0 will be deleted */
! case 0:
! next = idle_callback->next;
! if (idle_callback->argv)
! freebytes (idle_callback->argv, idle_callback->argc);
! freebytes ((void*)idle_callback, sizeof(t_sched_callback));
!
! if (last == NULL)
! ringbuffer_head = next;
! else
! last->next = next;
!
! idle_callback = next;
!
! /* callbacks returning 1 will be run again */
! case 1:
! break;
! /* callbacks returning 2 will be run during the next idle callback */
! case 2:
! last = idle_callback;
! idle_callback = idle_callback->next;
! }
}
! while ((idle_callback != NULL));
}
}
***************
*** 767,848 ****
static void run_idle_callbacks(int microsec)
{
! t_sched_callback * new_callback;
! double stop;
! sys_unlock();
!
! stop = sys_getrealtime()*1.e6 + (double)microsec;
! /* append idle callback to ringbuffer */
! while (new_callback = (t_sched_callback*) fifo_get(callback_fifo))
! {
! t_sched_callback * next;
!
! /* set the next field to NULL ... it might be set in the fifo */
! new_callback->next = NULL;
! if (ringbuffer_head == NULL)
! {
! ringbuffer_head = new_callback;
! }
! else
! {
! next = ringbuffer_head;
! while (next->next != 0)
! next = next->next;
! next->next = new_callback;
! }
! }
! if (ringbuffer_head != NULL)
! {
double remain = stop - sys_getrealtime() * 1.e6;
! t_sched_callback * idle_callback = ringbuffer_head;
! t_sched_callback * last = NULL;
! t_sched_callback * next;
! do
! {
! int status;
! sys_lock();
! status = (idle_callback->function)(idle_callback->argv);
! sys_unlock();
!
! switch (status)
! {
! /* callbacks returning 0 will be deleted */
! case 0:
! next = idle_callback->next;
if (idle_callback->argc)
freebytes (idle_callback->argv, idle_callback->argc);
! freebytes ((void*)idle_callback, sizeof(t_sched_callback));
!
! if (last == NULL)
! ringbuffer_head = next;
! else
! last->next = next;
!
! idle_callback = next;
!
! /* callbacks returning 1 will be run again */
! case 1:
! break;
! /* callbacks returning 2 will be run during the next idle callback */
! case 2:
! last = idle_callback;
! idle_callback = idle_callback->next;
! }
remain = stop-sys_getrealtime()*1.e6;
}
! while ((idle_callback != NULL) && (remain > 0));
! /* sleep for the rest of the time */
! if(remain > 0)
! sys_microsleep(remain);
! }
else
! sys_microsleep(microsec);
! sys_lock();
}
/* } tb */
--- 776,857 ----
static void run_idle_callbacks(int microsec)
{
! t_sched_callback * new_callback;
! double stop;
! sys_unlock();
!
! stop = sys_getrealtime()*1.e6 + (double)microsec;
! /* append idle callback to ringbuffer */
! while (new_callback = (t_sched_callback*) fifo_get(callback_fifo))
! {
! t_sched_callback * next;
!
! /* set the next field to NULL ... it might be set in the fifo */
! new_callback->next = NULL;
! if (ringbuffer_head == NULL)
! {
! ringbuffer_head = new_callback;
! }
! else
! {
! next = ringbuffer_head;
! while (next->next != 0)
! next = next->next;
! next->next = new_callback;
! }
! }
! if (ringbuffer_head != NULL)
! {
double remain = stop - sys_getrealtime() * 1.e6;
! t_sched_callback * idle_callback = ringbuffer_head;
! t_sched_callback * last = NULL;
! t_sched_callback * next;
! do
! {
! int status;
! sys_lock();
! status = (idle_callback->function)(idle_callback->argv);
! sys_unlock();
!
! switch (status)
! {
! /* callbacks returning 0 will be deleted */
! case 0:
! next = idle_callback->next;
if (idle_callback->argc)
freebytes (idle_callback->argv, idle_callback->argc);
! freebytes ((void*)idle_callback, sizeof(t_sched_callback));
!
! if (last == NULL)
! ringbuffer_head = next;
! else
! last->next = next;
!
! idle_callback = next;
!
! /* callbacks returning 1 will be run again */
! case 1:
! break;
! /* callbacks returning 2 will be run during the next idle callback */
! case 2:
! last = idle_callback;
! idle_callback = idle_callback->next;
! }
remain = stop-sys_getrealtime()*1.e6;
}
! while ((idle_callback != NULL) && (remain > 0));
! /* sleep for the rest of the time */
! if(remain > 0)
! sys_microsleep(remain);
! }
else
! sys_microsleep(microsec);
! sys_lock();
}
/* } tb */
***************
*** 850,864 ****
void sys_setscheduler(int scheduler)
{
! sys_keepsched = 0;
! sys_callbackscheduler = scheduler;
! return;
}
int sys_getscheduler(void)
{
! return sys_callbackscheduler;
}
! static t_int sys_xrun_notification_callback(t_int * dumy)
{
t_symbol * pd = gensym("pd");
--- 859,873 ----
void sys_setscheduler(int scheduler)
{
! sys_keepsched = 0;
! sys_callbackscheduler = scheduler;
! return;
}
int sys_getscheduler(void)
{
! return sys_callbackscheduler;
}
! static t_int sys_xrun_notification_callback(t_int * dummy)
{
t_symbol * pd = gensym("pd");
***************
*** 877,881 ****
! static t_int sys_lock_timeout_notification_callback(t_int * dumy)
{
t_symbol * pd = gensym("pd");
--- 886,890 ----
! static t_int sys_lock_timeout_notification_callback(t_int * dummy)
{
t_symbol * pd = gensym("pd");
More information about the Pd-cvs
mailing list