[PD-cvs] pd/src m_sched.c,1.5.4.35.2.6,1.5.4.35.2.7
Tim Blechmann
timblech at users.sourceforge.net
Sun Nov 6 22:11:19 CET 2005
Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv710
Modified Files:
Tag: devel_0_39
m_sched.c
Log Message:
reverting to oldschool list for clock callbacks ...
we need a heap to gain more efficiency
Index: m_sched.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_sched.c,v
retrieving revision 1.5.4.35.2.6
retrieving revision 1.5.4.35.2.7
diff -C2 -d -r1.5.4.35.2.6 -r1.5.4.35.2.7
*** m_sched.c 28 Oct 2005 12:18:23 -0000 1.5.4.35.2.6
--- m_sched.c 6 Nov 2005 21:11:17 -0000 1.5.4.35.2.7
***************
*** 50,68 ****
typedef void (*t_clockmethod)(void *client);
struct _clock
{
! double c_settime; /* -1 if unset */
void *c_owner;
t_clockmethod c_fn;
! struct _clock *c_next_time; /* clocks with settimes > c_settime */
! struct _clock *c_next; /* clocks with settimes == c_settime */
};
t_clock *clock_setlist;
-
- #ifdef UNISTD
- #include <unistd.h>
- #endif
-
t_clock *clock_new(void *owner, t_method fn)
{
--- 50,66 ----
typedef void (*t_clockmethod)(void *client);
+ #ifdef UNISTD
+ #include <unistd.h>
+ #endif
+
struct _clock
{
! double c_settime;
void *c_owner;
t_clockmethod c_fn;
! struct _clock *c_next;
};
t_clock *clock_setlist;
t_clock *clock_new(void *owner, t_method fn)
{
***************
*** 71,182 ****
x->c_owner = owner;
x->c_fn = (t_clockmethod)fn;
- x->c_next_time = 0;
x->c_next = 0;
return (x);
}
void clock_unset(t_clock *x)
{
! if (x->c_settime == -1)
! return;
!
! assert (clock_setlist);
! if (x == clock_setlist)
! {
! if (x->c_next == 0)
! clock_setlist = x->c_next_time;
! else
! {
! x->c_next->c_next_time = x->c_next_time;
! clock_setlist = x->c_next;
! }
! }
! else
! {
! t_clock *x2 = clock_setlist;
! t_clock *x_before = 0;
!
! /* find correct settime list */
! while (x2->c_settime != x->c_settime)
! {
! assert (x2->c_next_time != 0);
!
! x_before = x2;
! x2 = x2->c_next_time;
! }
!
! if (x2 == x) /* we're the first in the settime list */
! {
! if (x->c_next == NULL) /* we're the only one in the list */
! x_before->c_next_time = x->c_next_time;
! else
! {
! x_before->c_next_time = x->c_next;
! x->c_next->c_next_time = x->c_next_time;
! }
! }
! else
! {
! while (x2->c_next != x)
! {
! x2 = x2->c_next;
! assert(x2->c_next);
! }
! x2->c_next = x->c_next;
! }
! }
! x->c_settime = -1;
}
! /* set the clock to call back at an absolute system time */
void clock_set(t_clock *x, double setticks)
{
if (setticks < sys_time) setticks = sys_time;
clock_unset(x);
! x->c_settime = setticks;
!
if (clock_setlist && clock_setlist->c_settime <= setticks)
{
! if (clock_setlist->c_settime == setticks)
! {
! /* our slot is the first in the list */
! x->c_next_time = 0;
! x->c_next = clock_setlist->c_next;
! clock_setlist->c_next = x;
! }
! else
! {
! t_clock *cbefore = clock_setlist;
! t_clock *cafter = clock_setlist->c_next_time;
!
! while (cafter && cafter->c_settime < setticks)
! {
! cbefore = cafter;
! cafter = cafter->c_next_time;
! }
!
! if (cafter && cafter->c_settime == setticks)
! {
! /* we found our slot */
! x->c_next_time = 0;
! x->c_next = cafter->c_next;
! cafter->c_next = x;
! }
! else
! {
! /* we have to create our slot */
! x->c_next_time = cafter;
! x->c_next = 0;
! cbefore->c_next_time = x;
! }
! }
}
! else
! {
! /* we have to create a new slot and prepend it */
! x->c_next = 0;
! x->c_next_time = clock_setlist;
! clock_setlist = x;
! }
}
--- 69,113 ----
x->c_owner = owner;
x->c_fn = (t_clockmethod)fn;
x->c_next = 0;
return (x);
}
+
void clock_unset(t_clock *x)
{
! if (x->c_settime >= 0)
! {
! if (x == clock_setlist) clock_setlist = x->c_next;
! else
! {
! t_clock *x2 = clock_setlist;
! while (x2->c_next != x) x2 = x2->c_next;
! x2->c_next = x->c_next;
! }
! x->c_settime = -1;
! }
}
! /* set the clock to call back at an absolute system time */
void clock_set(t_clock *x, double setticks)
{
if (setticks < sys_time) setticks = sys_time;
clock_unset(x);
! x->c_settime = setticks;
if (clock_setlist && clock_setlist->c_settime <= setticks)
{
! t_clock *cbefore, *cafter;
! for (cbefore = clock_setlist, cafter = clock_setlist->c_next;
! cbefore; cbefore = cafter, cafter = cbefore->c_next)
! {
! if (!cafter || cafter->c_settime > setticks)
! {
! cbefore->c_next = x;
! x->c_next = cafter;
! return;
! }
! }
}
! else x->c_next = clock_setlist, clock_setlist = x;
}
***************
*** 187,190 ****
--- 118,122 ----
}
+
/* get current logical time. We don't specify what units this is in;
use clock_gettimesince() to measure intervals from time of this call.
More information about the Pd-cvs
mailing list