[PD-cvs] pd/src s_main.c, 1.7.4.17.2.22.2.6, 1.7.4.17.2.22.2.7 s_inter.c, 1.5.4.10.2.25.2.2, 1.5.4.10.2.25.2.3

Mathieu Bouchard matju at users.sourceforge.net
Fri Dec 1 20:27:21 CET 2006


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

Modified Files:
      Tag: desiredata
	s_main.c 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.2
retrieving revision 1.5.4.10.2.25.2.3
diff -C2 -d -r1.5.4.10.2.25.2.2 -r1.5.4.10.2.25.2.3
*** s_inter.c	30 Nov 2006 18:10:51 -0000	1.5.4.10.2.25.2.2
--- s_inter.c	1 Dec 2006 19:27:19 -0000	1.5.4.10.2.25.2.3
***************
*** 270,273 ****
--- 270,274 ----
  }
  
+ /* what is this for?? */
  static void sys_huphandler(int n)
  {
***************
*** 907,911 ****
  }
  
! int sys_startgui(const char *guidir)
  {
      pid_t childpid;
--- 908,914 ----
  }
  
! void sys_setpriority(void);
! 
! int sys_startgui(void)
  {
      pid_t childpid;
***************
*** 924,933 ****
      int stdinpipe[2];
  #endif
- 
      /* create an empty FD poll list */
      sys_fdpoll = (t_fdpoll *)t_getbytes(0);
      sys_nfdpoll = 0;
      inbinbuf = binbuf_new();
- 
  #ifdef UNISTD
      signal(SIGHUP, sys_huphandler);
--- 927,934 ----
***************
*** 937,992 ****
      signal(SIGIOT, sys_exithandler);
      signal(SIGFPE, SIG_IGN);
! /*	signal(SIGILL, sys_exithandler);
      signal(SIGBUS, sys_exithandler);
! 	signal(SIGSEGV, sys_exithandler); */
      signal(SIGPIPE, SIG_IGN);
      signal(SIGALRM, SIG_IGN);
! #if 0  /* GG says: don't use that */
!     signal(SIGSTKFLT, sys_exithandler);
! #endif
  #endif
  #ifdef _WIN32
      if (WSAStartup(version, &nobby)) sys_sockerror("WSAstartup");
  #endif /* _WIN32 */
! 
!     if (sys_nogui)
!     {
! 		sys_callback((t_int(*)(t_int*))fake_initfromgui,0,0);
!     }
!     else if (sys_guisetportnumber)  /* GUI exists and sent us a port number */
!     {
          struct sockaddr_in server;
          struct hostent *hp;
          /* create a socket */
          sys_guisock = socket(AF_INET, SOCK_STREAM, 0);
!         if (sys_guisock < 0)
!             sys_sockerror("socket");
! 
          /* connect socket using hostname provided in command line */
          server.sin_family = AF_INET;
- 
          hp = gethostbyname(LOCALHOST);
! 
!         if (hp == 0)
!         {
!             fprintf(stderr,
!                 "localhost not found (inet protocol not installed?)\n");
              exit(1);
          }
          memcpy((char *)&server.sin_addr, (char *)hp->h_addr, hp->h_length);
- 
          /* assign client port number */
          server.sin_port = htons((unsigned short)sys_guisetportnumber);
! 
!             /* try to connect */
!         if (connect(sys_guisock, (struct sockaddr *) &server, sizeof (server))
!             < 0)
!         {
              sys_sockerror("connecting stream socket");
              exit(1);
          }
!     }
!     else    /* default behavior: start up the GUI ourselves. */
!     {
  	fprintf(stderr,
  		"PureData in DesireData mode does not currently support starting without\n"
--- 938,975 ----
      signal(SIGIOT, sys_exithandler);
      signal(SIGFPE, SIG_IGN);
! /*  signal(SIGILL, sys_exithandler);
      signal(SIGBUS, sys_exithandler);
!     signal(SIGSEGV, sys_exithandler); */
      signal(SIGPIPE, SIG_IGN);
      signal(SIGALRM, SIG_IGN);
! /* GG says: don't set SIGSTKFLT */
  #endif
  #ifdef _WIN32
      if (WSAStartup(version, &nobby)) sys_sockerror("WSAstartup");
  #endif /* _WIN32 */
!     if (sys_nogui) {
! 	sys_callback((t_int(*)(t_int*))fake_initfromgui,0,0);
!     } else if (sys_guisetportnumber) {  /* GUI exists and sent us a port number */
          struct sockaddr_in server;
          struct hostent *hp;
          /* create a socket */
          sys_guisock = socket(AF_INET, SOCK_STREAM, 0);
!         if (sys_guisock < 0) sys_sockerror("socket");
          /* connect socket using hostname provided in command line */
          server.sin_family = AF_INET;
          hp = gethostbyname(LOCALHOST);
!         if (hp == 0) {
!             fprintf(stderr, "localhost not found (inet protocol not installed?)\n");
              exit(1);
          }
          memcpy((char *)&server.sin_addr, (char *)hp->h_addr, hp->h_length);
          /* assign client port number */
          server.sin_port = htons((unsigned short)sys_guisetportnumber);
!         /* try to connect */
!         if (connect(sys_guisock, (struct sockaddr *) &server, sizeof (server)) < 0) {
              sys_sockerror("connecting stream socket");
              exit(1);
          }
!     } else {
  	fprintf(stderr,
  		"PureData in DesireData mode does not currently support starting without\n"
***************
*** 996,1072 ****
  
  #if defined(__linux__) || defined(IRIX)
!         /* now that we've spun off the child process we can promote
!         our process's priority, if we can and want to.  If not specfied
!         (-1), we check root status.  This misses the case where we might
!         have permission from a "security module" (linux 2.6) -- I don't
!         know how to test for that.  The "-rt" flag must b eset in that
!         case. */
!     if (sys_hipriority == -1)
!         sys_hipriority = (!getuid() || !geteuid());
!     
!     if (sys_hipriority)
!     {
! #ifndef WATCHDOGTHREAD
!             /* To prevent lockup, we fork off a watchdog process with
!             higher real-time priority than ours.  The GUI has to send
!             a stream of ping messages to the watchdog THROUGH the Pd
!             process which has to pick them up from the GUI and forward
!             them.  If any of these things aren't happening the watchdog
!             starts sending "stop" and "cont" signals to the Pd process
!             to make it timeshare with the rest of the system.  (Version
!             0.33P2 : if there's no GUI, the watchdog pinging is done
!             from the scheduler idle routine in this process instead.) */
! 
!         int pipe9[2], watchpid;
!         if (pipe(pipe9) < 0)
!         {
!             setuid(getuid());      /* lose setuid priveliges */
!             sys_sockerror("pipe");
!             return (1);
!         }
!         watchpid = fork();
!         if (watchpid < 0)
!         {
!             setuid(getuid());      /* lose setuid priveliges */
!             if (errno)
!                 perror("sys_startgui");
!             else fprintf(stderr, "sys_startgui failed\n");
!             return (1);
!         }
!         else if (!watchpid)             /* we're the child */
!         {
!             sys_set_priority(1);
!             setuid(getuid());      /* lose setuid priveliges */
!             if (pipe9[1] != 0)
!             {
!                 dup2(pipe9[0], 0);
!                 close(pipe9[0]);
!             }
!             close(pipe9[1]);
  
!             sprintf(cmdbuf, "%s/pd-watchdog\n", guidir);
!             if (sys_verbose) fprintf(stderr, "%s", cmdbuf);
!             execl("/bin/sh", "sh", "-c", cmdbuf, (char*)0);
!             perror("pd: exec");
!             _exit(1);
!         }
!         else                            /* we're the parent */
!         {
!             sys_set_priority(0);
!             setuid(getuid());      /* lose setuid priveliges */
              close(pipe9[0]);
-             sys_watchfd = pipe9[1];
-                 /* We also have to start the ping loop in the GUI;
-                 this is done later when the socket is open. */
          }
  #else
! 		sys_start_watchdog_thread();
! 		sys_set_priority(0);
  #endif
-     }
- 
-     setuid(getuid());          /* lose setuid priveliges */
  #endif /* __linux__ */
- 
  #ifdef MSW
      if (!SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS))
--- 979,1050 ----
  
  #if defined(__linux__) || defined(IRIX)
! /* now that we've spun off the child process we can promote our process's
!    priority, if we can and want to.  If not specfied (-1), we check root
!    status.  This misses the case where we might have permission from a
!    "security module" (linux 2.6) -- I don't know how to test for that.
!    The "-rt" flag must be set in that case. */
!     if (sys_hipriority == -1) sys_hipriority = !getuid() || !geteuid();
! #endif
!     if (sys_hipriority) sys_setpriority();
!     setuid(getuid());
!     if (!sys_nogui) {
!         char buf[256], buf2[256];
!         sys_socketreceiver = socketreceiver_new(0,0,0,0);
!         sys_addpollfn(sys_guisock, (t_fdpollfn)socketreceiver_read, sys_socketreceiver);
! 	sys_get_audio_apis(buf);
! 	sys_get_midi_apis(buf2);
! 	sys_vgui("pdtk_pd_startup {%s} %s %s\n", pd_version, buf, buf2);
!     }
!     return 0;
! }
  
! /* To prevent lockup, we fork off a watchdog process with higher real-time
!    priority than ours.  The GUI has to send a stream of ping messages to the
!    watchdog THROUGH the Pd process which has to pick them up from the GUI
!    and forward them.  If any of these things aren't happening the watchdog
!    starts sending "stop" and "cont" signals to the Pd process to make it
!    timeshare with the rest of the system.  (Version 0.33P2 : if there's no
!    GUI, the watchdog pinging is done from the scheduler idle routine in this
!    process instead.) */
! void sys_setpriority(void) {
! #if defined(__linux__) || defined(IRIX)
! #ifndef WATCHDOGTHREAD
!     int pipe9[2], watchpid;
!     if (pipe(pipe9) < 0) {
!         setuid(getuid());
!         sys_sockerror("pipe");
!         return 1;
!     }
!     watchpid = fork();
!     if (watchpid < 0) {
!         setuid(getuid());
!         if (errno) perror("sys_startgui"); else fprintf(stderr, "sys_startgui failed\n");
!         return 1;
!     } else if (!watchpid) { /* we're the child */
!         sys_set_priority(1);
!         setuid(getuid());
!         if (pipe9[1]) {
!             dup2(pipe9[0], 0);
              close(pipe9[0]);
          }
+         close(pipe9[1]);
+         sprintf(cmdbuf, "%s/pd-watchdog\n", guidir);
+         if (sys_verbose) fprintf(stderr, "%s", cmdbuf);
+         execl("/bin/sh", "sh", "-c", cmdbuf, (char*)0);
+         perror("pd: exec");
+         _exit(1);
+     } else { /* we're the parent */
+         sys_set_priority(0);
+         setuid(getuid());
+         close(pipe9[0]);
+         sys_watchfd = pipe9[1];
+         /* We also have to start the ping loop in the GUI;
+            this is done later when the socket is open. */
+     }
  #else
! 	sys_start_watchdog_thread();
! 	sys_set_priority(0);
  #endif
  #endif /* __linux__ */
  #ifdef MSW
      if (!SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS))
***************
*** 1074,1112 ****
  #endif
  #ifdef __APPLE__
!     if (sys_hipriority)
!     {
          struct sched_param param;
          int policy = SCHED_RR;
          int err;
          param.sched_priority = 80; /* adjust 0 : 100 */
- 
          err = pthread_setschedparam(pthread_self(), policy, &param);
!         if (err)
!             post("warning: high priority scheduling failed\n");
      }
  #endif /* __APPLE__ */
  
!     if (!sys_nogui && !sys_guisetportnumber)
!     {
!         if (sys_verbose)
!             fprintf(stderr, "Waiting for connection request... \n");
          if (listen(xsock, 5) < 0) sys_sockerror("listen");
! 
!         sys_guisock = accept(xsock, (struct sockaddr *) &server, 
!             (socklen_t *)&len);
! #ifdef OOPS
!         close(xsock);
! #endif
          if (sys_guisock < 0) sys_sockerror("accept");
!         if (sys_verbose)
!             fprintf(stderr, "... connected\n");
      }
      if (!sys_nogui)
      {
-          char buf[256], buf2[256];
-          sys_socketreceiver = socketreceiver_new(0, 0, 0, 0);
-          sys_addpollfn(sys_guisock, (t_fdpollfn)socketreceiver_read,
-              sys_socketreceiver);
- 
              /* here is where we start the pinging. */
  #if defined(__linux__) || defined(IRIX)
--- 1052,1078 ----
  #endif
  #ifdef __APPLE__
!     if (sys_hipriority) {
          struct sched_param param;
          int policy = SCHED_RR;
          int err;
          param.sched_priority = 80; /* adjust 0 : 100 */
          err = pthread_setschedparam(pthread_self(), policy, &param);
!         if (err) post("warning: high priority scheduling failed\n");
      }
  #endif /* __APPLE__ */
  
! #if 0
!     if (!sys_nogui && !sys_guisetportnumber) {
!         if (sys_verbose) fprintf(stderr, "Waiting for connection request... \n");
          if (listen(xsock, 5) < 0) sys_sockerror("listen");
!         sys_guisock = accept(xsock, (struct sockaddr *) &server, (socklen_t *)&len);
!         close(xsock); //OOPS
          if (sys_guisock < 0) sys_sockerror("accept");
!         if (sys_verbose) fprintf(stderr, "... connected\n");
      }
+ #endif
+ 
      if (!sys_nogui)
      {
              /* here is where we start the pinging. */
  #if defined(__linux__) || defined(IRIX)
***************
*** 1116,1128 ****
  #endif
  #endif
-          sys_get_audio_apis(buf);
- 		 sys_get_midi_apis(buf2);
-          sys_vgui("pdtk_pd_startup {%s} %s %s {%s}\n", pd_version, buf, buf2, 666);
      }
-     return (0);
- 
  }
  
- 
  /* This is called when something bad has happened, like a segfault.
  Call glob_quit() below to exit cleanly.
--- 1082,1088 ----

Index: s_main.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_main.c,v
retrieving revision 1.7.4.17.2.22.2.6
retrieving revision 1.7.4.17.2.22.2.7
diff -C2 -d -r1.7.4.17.2.22.2.6 -r1.7.4.17.2.22.2.7
*** s_main.c	1 Dec 2006 18:07:38 -0000	1.7.4.17.2.22.2.6
--- s_main.c	1 Dec 2006 19:27:19 -0000	1.7.4.17.2.22.2.7
***************
*** 43,47 ****
  int sys_argparse(int argc, char **argv);
  void sys_findprogdir(char *progname);
! int sys_startgui(const char *guipath);
  void sys_init_idle_callbacks(void);
  int sys_rcfile(void);
--- 43,47 ----
  int sys_argparse(int argc, char **argv);
  void sys_findprogdir(char *progname);
! int sys_startgui(void);
  void sys_init_idle_callbacks(void);
  int sys_rcfile(void);
***************
*** 63,67 ****
  char *sys_guicmd;
  t_symbol *sys_libdir;
- static t_symbol *sys_guidir;
  t_namelist *sys_externlist;
  static t_namelist *sys_openlist=NULL;
--- 63,66 ----
***************
*** 205,210 ****
          return (0);
  
!     if (sys_startgui(sys_guidir->s_name))       /* start the gui */
!         return(1);
  	
  	/* tb: { *
--- 204,208 ----
          return (0);
  
!     if (sys_startgui()) return 1;      /* start the gui */
  	
  	/* tb: { *
***************
*** 448,475 ****
  #ifdef MSW
      sys_libdir = gensym(sbuf2);
-     sys_guidir = &s_;   /* in MSW the guipath just depends on the libdir */
  #else
      strncpy(sbuf, sbuf2, MAXPDSTRING-30);
      sbuf[MAXPDSTRING-30] = 0;
      strcat(sbuf, "/lib/pd");
!     if (stat(sbuf, &statbuf) >= 0)
!     {
!             /* complicated layout: lib dir is the one we just stat-ed above */
          sys_libdir = gensym(sbuf);
!             /* gui lives in .../lib/pd/bin */
!         strncpy(sbuf, sbuf2, MAXPDSTRING-30);
!         sbuf[MAXPDSTRING-30] = 0;
!         strcat(sbuf, "/lib/pd/bin");
!         sys_guidir = gensym(sbuf);
!     }
!     else
!     {
!             /* simple layout: lib dir is the parent */
          sys_libdir = gensym(sbuf2);
-             /* gui lives in .../bin */
-         strncpy(sbuf, sbuf2, MAXPDSTRING-30);
-         sbuf[MAXPDSTRING-30] = 0;
-         strcat(sbuf, "/bin");
-         sys_guidir = gensym(sbuf);
      }
  #endif
--- 446,457 ----
  #ifdef MSW
      sys_libdir = gensym(sbuf2);
  #else
      strncpy(sbuf, sbuf2, MAXPDSTRING-30);
      sbuf[MAXPDSTRING-30] = 0;
      strcat(sbuf, "/lib/pd");
!     if (stat(sbuf, &statbuf) >= 0) {
          sys_libdir = gensym(sbuf);
!     } else {
          sys_libdir = gensym(sbuf2);
      }
  #endif





More information about the Pd-cvs mailing list