[PD-cvs] pd/src m_sched.c,1.5.4.15,1.5.4.16

Tim Blechmann timblech at users.sourceforge.net
Sun Jan 16 22:51:23 CET 2005


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3819

Modified Files:
      Tag: devel_0_38
	m_sched.c 
Log Message:
improved idle callbacks

Index: m_sched.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_sched.c,v
retrieving revision 1.5.4.15
retrieving revision 1.5.4.16
diff -C2 -d -r1.5.4.15 -r1.5.4.16
*** m_sched.c	16 Jan 2005 16:07:45 -0000	1.5.4.15
--- m_sched.c	16 Jan 2005 21:51:20 -0000	1.5.4.16
***************
*** 629,635 ****
  	t_int* argv;
  	t_int argc;
  } t_sched_callback;
  
- static t_sched_callback * idle_callback = NULL;
  
  void sys_callback(t_int (*callback) (t_int* argv), t_int* argv, t_int argc)
--- 629,635 ----
  	t_int* argv;
  	t_int argc;
+ 	struct _sched_callback* next; /* next callback in ringbuffer */
  } t_sched_callback;
  
  
  void sys_callback(t_int (*callback) (t_int* argv), t_int* argv, t_int argc)
***************
*** 641,644 ****
--- 641,645 ----
  	new->argv = (t_int*) copybytes (argv, argc * sizeof (t_int));
  	new->argc = argc;
+ 	new->next = NULL;
  
  	if (callback_fifo == NULL)
***************
*** 648,651 ****
--- 649,655 ----
  }
  
+ #if 0 /* old version, todo: profiling */
+ static t_sched_callback * idle_callback = NULL;
+ 
  static t_int run_idle_callbacks(void)
  {
***************
*** 671,675 ****
  				freebytes ((void*)idle_callback, sizeof(t_sched_callback));
  				idle_callback = fifo_get(callback_fifo);
! 
  				/* callbacks returning 1 will be run again */
  			case 1:
--- 675,679 ----
  				freebytes ((void*)idle_callback, sizeof(t_sched_callback));
  				idle_callback = fifo_get(callback_fifo);
! 				
  				/* callbacks returning 1 will be run again */
  			case 1:
***************
*** 678,687 ****
  				/* callbacks returning 2 will be run during the next idle callback */
  			case 2:
! 				return 0;
  			}
  		}
  		while ((idle_callback != NULL) && (remain > 0));
  
!         /* sleep for the rest of the time */
          if(remain > 100) sys_microsleep(remain);
  		return 0; 
--- 682,692 ----
  				/* callbacks returning 2 will be run during the next idle callback */
  			case 2:
! 				goto sleep;
  			}
  		}
  		while ((idle_callback != NULL) && (remain > 0));
  
! 	sleep:
! 		/* sleep for the rest of the time */
          if(remain > 100) sys_microsleep(remain);
  		return 0; 
***************
*** 691,693 ****
--- 696,774 ----
  }
  
+ 
+ #else /* improved ringbuffer version */
+ static t_sched_callback *ringbuffer_head;
+ 
+ static t_int run_idle_callbacks(void)
+ {
+ 	t_sched_callback * new_callback;
+ 
+ 	/* append idle callback to ringbuffer */
+ 	new_callback = (t_sched_callback*) fifo_get(callback_fifo);
+ 	while (new_callback != NULL)
+ 	{
+ 		t_sched_callback * next;
+ 		if (ringbuffer_head == NULL)
+ 		{
+ 			ringbuffer_head = new_callback;
+ 		}
+ 		else
+ 		{
+ 			next = ringbuffer_head;
+ 			while (next->next != 0)
+ 				next = next->next;
+ 			next->next = new_callback;
+ 		}
+ 		new_callback = (t_sched_callback*) fifo_get(callback_fifo);
+ 	}
+ 
+ 	if (ringbuffer_head != NULL)
+ 	{
+         double remain;
+ 		double stop = sys_getrealtime() + sys_sleepgrain;
+ 		t_sched_callback * idle_callback = ringbuffer_head;
+ 		t_sched_callback * last = NULL;
+ 		t_sched_callback * next;
+ 
+ 		do
+ 		{
+ 			int status = (idle_callback->function)(idle_callback->argv);
+ 			remain = stop-sys_getrealtime();
+ 
+ 			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) && (remain > 0));
+ 
+ 	sleep:
+ 		/* sleep for the rest of the time */
+         if(remain > 100) sys_microsleep(remain);
+ 		return 0; 
+ 	}
+ 	else
+ 		return 1; /* sleep */
+ }
+ #endif
  /* } tb */





More information about the Pd-cvs mailing list