Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19631
Modified Files:
Tag: desiredata
s_inter.c
Log Message:
cleanup.
Index: s_inter.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_inter.c,v
retrieving revision 1.5.4.10.2.25.2.6
retrieving revision 1.5.4.10.2.25.2.7
diff -C2 -d -r1.5.4.10.2.25.2.6 -r1.5.4.10.2.25.2.7
*** s_inter.c 2 Dec 2006 05:21:51 -0000 1.5.4.10.2.25.2.6
--- s_inter.c 3 Dec 2006 00:20:33 -0000 1.5.4.10.2.25.2.7
***************
*** 11,14 ****
--- 11,15 ----
#include "s_stuff.h"
#include "m_imp.h"
+ #include "pthread.h"
#ifdef UNISTD
#include <unistd.h>
***************
*** 147,196 ****
}
!
! int sys_pollsockets (void)
! {
struct timeval timout;
int didsomething = 0;
! int i;
t_fdpoll *fp;
! fd_set readset, writeset, exceptset;
!
timout.tv_sec = 0;
timout.tv_usec = 0;
-
FD_ZERO(&writeset);
FD_ZERO(&readset);
FD_ZERO(&exceptset);
! 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++)
if (FD_ISSET(sys_fdpoll[i].fdp_fd, &readset))
{
! (*sys_fdpoll[i].fdp_fn)(sys_fdpoll[i].fdp_ptr, sys_fdpoll[i].fdp_fd);
didsomething = 1;
}
! return (didsomething);
}
! 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 (!sys_callbackscheduler && microsec < 1000)
! if (500 < microsec)
! microsec = 1000;
! else
! return;
#ifndef MSW
struct timeval timeout;
--- 148,182 ----
}
! int sys_pollsockets (void) {
struct timeval timout;
int didsomething = 0;
! int i;
t_fdpoll *fp;
! fd_set readset, writeset, exceptset;
timout.tv_sec = 0;
timout.tv_usec = 0;
FD_ZERO(&writeset);
FD_ZERO(&readset);
FD_ZERO(&exceptset);
! 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++)
if (FD_ISSET(sys_fdpoll[i].fdp_fd, &readset))
{
! sys_fdpoll[i].fdp_fn(sys_fdpoll[i].fdp_ptr, sys_fdpoll[i].fdp_fd);
didsomething = 1;
}
! return didsomething;
}
! void sys_microsleep(int microsec) {
! /* Tim says: 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 (!sys_callbackscheduler && microsec < 1000) {
! if (500 < microsec) microsec = 1000; else return;
! }
#ifndef MSW
struct timeval timeout;
***************
*** 202,212 ****
Sleep(microsec/1000);
#endif
-
/* a solution for lower timeslices might be a busysleep but this might
block a low-priority thread and won't work for win9x
-
#define _WIN32_WINNT 0x0400
-
-
double end = sys_getrealtime() + (double)microsec * 1e-6;
do
--- 188,194 ----
***************
*** 219,223 ****
}
while(sys_getrealtime() < end);
-
*/
}
--- 201,204 ----
***************
*** 472,500 ****
}
! static void socketreceiver_getudp(t_socketreceiver *x, int fd)
! {
char buf[INBUFSIZE+1];
int ret = recv(fd, buf, INBUFSIZE, 0);
! if (ret < 0)
! {
sys_sockerror("recv");
sys_rmpollfn(fd);
sys_closesocket(fd);
! }
! else if (ret > 0)
! {
buf[ret] = 0;
! #if 0
! post("%s", buf);
! #endif
! if (buf[ret-1] != '\n')
! {
! #if 0
! buf[ret] = 0;
! error("dropped bad buffer %s\n", buf);
! #endif
! }
! else
! {
char *semi = strchr(buf, ';');
if (semi)
--- 453,466 ----
}
! static void socketreceiver_getudp(t_socketreceiver *x, int fd) {
char buf[INBUFSIZE+1];
int ret = recv(fd, buf, INBUFSIZE, 0);
! if (ret < 0) {
sys_sockerror("recv");
sys_rmpollfn(fd);
sys_closesocket(fd);
! } else if (ret > 0) {
buf[ret] = 0;
! if (buf[ret-1] == '\n') {
char *semi = strchr(buf, ';');
if (semi)
***************
*** 503,507 ****
outlet_setstacklim();
x->socketreceivefn(x->owner, inbinbuf);
! }
}
}
--- 469,473 ----
outlet_setstacklim();
x->socketreceivefn(x->owner, inbinbuf);
! } else {/*bad buffer ignored */}
}
}
***************
*** 597,601 ****
int writesize = self->ohead-self->otail, nwrote = 0;
if (!writesize) return 0;
- fprintf(stderr,"sys_flushtogui self=%p writesize=%d\n",self,writesize);
nwrote = send(self->fd, self->obuf+self->otail, writesize, 0);
if (nwrote < 0) {
--- 563,566 ----
***************
*** 803,807 ****
}
- #include "pthread.h"
static pthread_t watchdog_id;
static pthread_t main_pd_thread;
--- 768,771 ----
***************
*** 809,828 ****
static pthread_cond_t watchdog_cond = PTHREAD_COND_INITIALIZER;
! static void * watchdog_thread(void*);
/* start a high priority watchdog thread */
! static int sys_start_watchdog_thread(void)
! {
pthread_attr_t w_attr;
int status;
-
- /* get parent thread ID */
main_pd_thread = pthread_self();
-
- /* set up attributes */
pthread_attr_init(&w_attr);
-
pthread_attr_setschedpolicy(&w_attr, SCHED_FIFO); /* use rt scheduling */
-
status = pthread_create(&watchdog_id, &w_attr, (void*(*)(void*)) watchdog_thread, NULL);
return status; /* what is this function supposed to return anyway? it tried returning void though declared as int */
--- 773,785 ----
static pthread_cond_t watchdog_cond = PTHREAD_COND_INITIALIZER;
! static void *watchdog_thread(void *);
/* start a high priority watchdog thread */
! static int sys_start_watchdog_thread(void) {
pthread_attr_t w_attr;
int status;
main_pd_thread = pthread_self();
pthread_attr_init(&w_attr);
pthread_attr_setschedpolicy(&w_attr, SCHED_FIFO); /* use rt scheduling */
status = pthread_create(&watchdog_id, &w_attr, (void*(*)(void*)) watchdog_thread, NULL);
return status; /* what is this function supposed to return anyway? it tried returning void though declared as int */
***************
*** 849,886 ****
*/
! static void * watchdog_thread(void* dummy)
! {
sys_set_priority(1);
post("watchdog thread started");
-
sys_microsleep(6e7); /* start polling after 60 seconds ... hoping that everything is set up */
-
post("watchdog thread active");
!
! while (1)
! {
! /* - register idle callback
! - wait for condition variable
! - in case of timeout kill the parent thread
! - sleep
! */
struct timespec timeout;
struct timeval now;
-
int status;
-
gettimeofday(&now,0);
timeout.tv_sec = now.tv_sec + 15; /* timeout: 15 seconds */
timeout.tv_nsec = now.tv_usec * 1000;
-
sys_callback((t_int(*)(t_int*))watchdog_callback, 0, 0);
status = pthread_cond_timedwait(&watchdog_cond, &watchdog_mutex, &timeout);
!
! if (status)
! {
#if defined(__linux__) || defined(IRIX)
fprintf(stderr, "watchdog killing");
! /* kill parent thread */
! kill(0,9);
#endif
}
--- 806,827 ----
*/
! static void * watchdog_thread(void* dummy) {
sys_set_priority(1);
post("watchdog thread started");
sys_microsleep(6e7); /* start polling after 60 seconds ... hoping that everything is set up */
post("watchdog thread active");
! while (1) {
struct timespec timeout;
struct timeval now;
int status;
gettimeofday(&now,0);
timeout.tv_sec = now.tv_sec + 15; /* timeout: 15 seconds */
timeout.tv_nsec = now.tv_usec * 1000;
sys_callback((t_int(*)(t_int*))watchdog_callback, 0, 0);
status = pthread_cond_timedwait(&watchdog_cond, &watchdog_mutex, &timeout);
! if (status) {
#if defined(__linux__) || defined(IRIX)
fprintf(stderr, "watchdog killing");
! kill(0,9); /* kill parent thread */
#endif
}