[PD-cvs] pd/src s_inter.c,1.5.4.9,1.5.4.10

Tim Blechmann timblech at users.sourceforge.net
Sat May 14 19:05:30 CEST 2005


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

Modified Files:
      Tag: devel_0_38
	s_inter.c 
Log Message:
microsleep


Index: s_inter.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_inter.c,v
retrieving revision 1.5.4.9
retrieving revision 1.5.4.10
diff -C2 -d -r1.5.4.9 -r1.5.4.10
*** s_inter.c	11 May 2005 16:41:16 -0000	1.5.4.9
--- s_inter.c	14 May 2005 17:05:27 -0000	1.5.4.10
***************
*** 159,162 ****
--- 159,163 ----
      t_fdpoll *fp;
  	fd_set readset, writeset, exceptset;
+ 
      timout.tv_sec = 0;
      timout.tv_usec = 0;
***************
*** 167,171 ****
  	for (fp = sys_fdpoll, i = sys_nfdpoll; i--; fp++)
  		FD_SET(fp->fdp_fd, &readset);
- 
  	select(sys_maxfd+1, &readset, &writeset, &exceptset, &timout);
  	for (i = 0; i < sys_nfdpoll; i++)
--- 168,171 ----
***************
*** 180,192 ****
  void sys_microsleep(int microsec)
  {
  #ifndef MSW
  	struct timespec rec, rem;
  	rec.tv_sec = 0;
! 	rec.tv_nsec = 100 * microsec;
  	nanosleep(&rec, &rem);
  #else
- 	/* tb: sleep granularity on windows only 1ms??? */
  	Sleep(microsec/1000);
  #endif
  }
  
--- 180,224 ----
  void sys_microsleep(int microsec)
  {
+ 	/* tb:
+ 	   sleep granularity on "modern" operating systems is only 1ms??? 
+ 
+ 	   linux: we might be better with the high precision posix timer kernel
+ 	   patches ...
+ 	   
+ 	   windows: win9x doesn't implement a SwitchToThread function, so we can't
+ 	   sleep for small timeslices
+ 
+ 	   osx: ???
+ 	*/
+ 
+ 	if (microsec < 1000)
+ 				microsec = 1000;
  #ifndef MSW
  	struct timespec rec, rem;
  	rec.tv_sec = 0;
! 	rec.tv_nsec = 1000 * microsec;
  	nanosleep(&rec, &rem);
  #else
  	Sleep(microsec/1000);
  #endif
+ 	
+ 	/* a solution for lower timeslices might be a busysleep but this might
+ 	   block a low-prority thread and won't work for win9x
+ 
+ #define _WIN32_WINNT 0x0400
+ 
+ 	   
+ 	double end = sys_getrealtime() + (double)microsec * 1e-6;
+ 	do
+ 	{
+ #ifdef MSW
+ 		SwitchToThread();
+ #else 
+ 		sched_yield()
+ #endif
+ 	}
+ 	while(sys_getrealtime() < end);
+ 
+ 	*/
  }
  
***************
*** 592,596 ****
          int bytestowrite = sys_guibuftail - sys_guibufhead;
          int written = 0;
!         while (1)
          {
              int res = send(sys_guisock,
--- 624,628 ----
          int bytestowrite = sys_guibuftail - sys_guibufhead;
          int written = 0;
! 		while (1)
          {
              int res = send(sys_guisock,
***************
*** 608,612 ****
              }
          }
!         sys_guibufhead = sys_guibuftail = 0;
      }
      else
--- 640,644 ----
              }
          }
! 		sys_guibufhead = sys_guibuftail = 0;
      }
      else





More information about the Pd-cvs mailing list