[PD-cvs] pd/src m_pd.h, 1.4.4.11.2.33.2.1, 1.4.4.11.2.33.2.2 s_inter.c, 1.5.4.10.2.25.2.3, 1.5.4.10.2.25.2.4 m_sched.c, 1.5.4.35.2.21, 1.5.4.35.2.21.2.1 s_main.c, 1.7.4.17.2.22.2.7, 1.7.4.17.2.22.2.8 desire.tk, 1.1.2.600.2.2, 1.1.2.600.2.3 s_stuff.h, 1.5.4.10.2.8, 1.5.4.10.2.8.2.1 x_net.c, 1.2.4.2.2.2, 1.2.4.2.2.2.2.1

Mathieu Bouchard matju at users.sourceforge.net
Sat Dec 2 04:12:15 CET 2006


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

Modified Files:
      Tag: desiredata
	m_pd.h s_inter.c m_sched.c s_main.c desire.tk s_stuff.h 
	x_net.c 
Log Message:
new gui socket system using [netreceive]


Index: desire.tk
===================================================================
RCS file: /cvsroot/pure-data/pd/src/Attic/desire.tk,v
retrieving revision 1.1.2.600.2.2
retrieving revision 1.1.2.600.2.3
diff -C2 -d -r1.1.2.600.2.2 -r1.1.2.600.2.3
*** desire.tk	1 Dec 2006 21:00:02 -0000	1.1.2.600.2.2
--- desire.tk	2 Dec 2006 03:12:12 -0000	1.1.2.600.2.3
***************
*** 717,720 ****
--- 717,721 ----
  }
  
+ # this is becoming obsolete (2006.12.01)
  proc accept_pd {s addr port} {
  	global sock
***************
*** 764,769 ****
  }
  
  set server_port 13666
! set server_sock [socket -server accept_pd $server_port]
  
  if {$cmdline(valgrind)} {
--- 765,784 ----
  }
  
+ proc pd_connect {} {
+ 	global sock
+ 	if {[catch {set sock [socket localhost 13666]}]} {
+ 		post "can't connect... wait a second"
+ 		after 1000 pd_connect
+ 		return
+ 	}
+ 	post "connected!"
+ 	fconfigure $sock -blocking 0 -buffering line
+ 	pd pd init
+ 	poll_sock
+ }
+ 
  set server_port 13666
! #set server_sock [socket -server accept_pd $server_port]
! after 1000 pd_connect
  
  if {$cmdline(valgrind)} {

Index: s_main.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_main.c,v
retrieving revision 1.7.4.17.2.22.2.7
retrieving revision 1.7.4.17.2.22.2.8
diff -C2 -d -r1.7.4.17.2.22.2.7 -r1.7.4.17.2.22.2.8
*** s_main.c	1 Dec 2006 19:27:19 -0000	1.7.4.17.2.22.2.7
--- s_main.c	2 Dec 2006 03:12:12 -0000	1.7.4.17.2.22.2.8
***************
*** 57,63 ****
  int sys_verbose;
  int sys_noloadbang;
- int sys_nogui;
  int sys_hipriority = -1;    /* -1 = don't care; 0 = no; 1 = yes */
! int sys_guisetportnumber;   /* if started from the GUI, this is the port # */
  
  char *sys_guicmd;
--- 57,62 ----
  int sys_verbose;
  int sys_noloadbang;
  int sys_hipriority = -1;    /* -1 = don't care; 0 = no; 1 = yes */
! int sys_guisetportnumber = 5400;
  
  char *sys_guicmd;
***************
*** 131,135 ****
  }
  
! /* for DesireData this should be eventually nuked */
  void glob_initfromgui(void *dummy, t_symbol *s)
  {
--- 130,138 ----
  }
  
! extern t_text *sys_netreceive;
! extern t_socketreceiver *sys_socketreceiver;
! t_socketreceiver *netreceive_newest_receiver(t_text *x);
! 
! /* this should be rethought for multi-client */
  void glob_initfromgui(void *dummy, t_symbol *s)
  {
***************
*** 137,140 ****
--- 140,146 ----
      t_namelist *nl;
      getcwd(cwd,665);
+     sys_socketreceiver=netreceive_newest_receiver(sys_netreceive);
+     fprintf(stderr,"sys_socketreceiver=%p\n",sys_socketreceiver);
+ 
      /* load dynamic libraries specified with "-lib" args */
      for  (nl = sys_externlist; nl; nl = nl->nl_next)
***************
*** 347,353 ****
  "-noloadbang      -- suppress all loadbangs\n",
  "-stderr          -- send printout to standard error instead of GUI\n",
! "-nogui           -- suppress starting the GUI\n",
! "-guiport <n>     -- connect to pre-existing GUI over port <n>\n",
! "-guicmd \"cmd...\" -- start alternatve GUI program (e.g., remote via ssh)\n",
  "-send \"msg...\"   -- send a message at startup, after patches are loaded\n",
  #ifdef UNISTD
--- 353,357 ----
  "-noloadbang      -- suppress all loadbangs\n",
  "-stderr          -- send printout to standard error instead of GUI\n",
! "-guiport <n>     -- set port that the GUI should connect to\n",
  "-send \"msg...\"   -- send a message at startup, after patches are loaded\n",
  #ifdef UNISTD
***************
*** 645,649 ****
  	}
          if (ARG("-noloadbang",1)) {sys_noloadbang = 1; NEXT(1);}
!         if (ARG("-nogui",1)) {sys_printtostderr = sys_nogui = 1; NEXT(1);}
          if (ARG("-guiport",2)) {
  		if (sscanf(argv[1], "%d", &sys_guisetportnumber)<1) goto usage;
--- 649,657 ----
  	}
          if (ARG("-noloadbang",1)) {sys_noloadbang = 1; NEXT(1);}
!         if (ARG("-nogui",1)) {
! 		sys_printtostderr = 1;
! 		fprintf(stderr,"Warning: -nogui is obsolete: nowadays it does just like -stderr instead\n");
! 		NEXT(1);
! 	}
          if (ARG("-guiport",2)) {
  		if (sscanf(argv[1], "%d", &sys_guisetportnumber)<1) goto usage;
***************
*** 651,655 ****
  	}
          if (ARG("-stderr",1)) {sys_printtostderr = 1; NEXT(1);}
!         if (ARG("-guicmd",2)) {sys_guicmd = argv[1]; NEXT(2);}
          if (ARG("-send",2)) {
              sys_messagelist = namelist_append(sys_messagelist, argv[1], 1);
--- 659,666 ----
  	}
          if (ARG("-stderr",1)) {sys_printtostderr = 1; NEXT(1);}
!         if (ARG("-guicmd",2)) {
! 		fprintf(stderr,"Warning: -guicmd ignored");
! 		NEXT(2);
! 	}
          if (ARG("-send",2)) {
              sys_messagelist = namelist_append(sys_messagelist, argv[1], 1);

Index: m_sched.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_sched.c,v
retrieving revision 1.5.4.35.2.21
retrieving revision 1.5.4.35.2.21.2.1
diff -C2 -d -r1.5.4.35.2.21 -r1.5.4.35.2.21.2.1
*** m_sched.c	23 Nov 2006 05:59:42 -0000	1.5.4.35.2.21
--- m_sched.c	2 Dec 2006 03:12:12 -0000	1.5.4.35.2.21.2.1
***************
*** 294,298 ****
          where we arrange to ping the watchdog every 2 seconds. */
  #ifdef __linux__
!     if (sys_nogui && sys_hipriority && (sched_diddsp - sched_nextpingtime > 0))
      {
          glob_watchdog(0);
--- 294,298 ----
          where we arrange to ping the watchdog every 2 seconds. */
  #ifdef __linux__
!     if (sys_hipriority && (sched_diddsp - sched_nextpingtime > 0))
      {
          glob_watchdog(0);

Index: s_stuff.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_stuff.h,v
retrieving revision 1.5.4.10.2.8
retrieving revision 1.5.4.10.2.8.2.1
diff -C2 -d -r1.5.4.10.2.8 -r1.5.4.10.2.8.2.1
*** s_stuff.h	25 Nov 2006 08:06:19 -0000	1.5.4.10.2.8
--- s_stuff.h	2 Dec 2006 03:12:13 -0000	1.5.4.10.2.8.2.1
***************
*** 167,181 ****
  
  EXTERN void sys_microsleep(int microsec);
- 
  EXTERN void sys_bail(int exitcode);
  EXTERN int sys_pollgui(void);
- 
- EXTERN_STRUCT _socketreceiver;
- #define t_socketreceiver struct _socketreceiver
- 
  typedef void (*t_socketnotifier)(void *x);
  typedef void (*t_socketreceivefn)(void *x, t_binbuf *b);
  
! EXTERN t_socketreceiver *socketreceiver_new(void *owner,
      t_socketnotifier notifier, t_socketreceivefn socketreceivefn, int udp);
  EXTERN void socketreceiver_read(t_socketreceiver *x, int fd);
--- 167,190 ----
  
  EXTERN void sys_microsleep(int microsec);
  EXTERN void sys_bail(int exitcode);
  EXTERN int sys_pollgui(void);
  typedef void (*t_socketnotifier)(void *x);
  typedef void (*t_socketreceivefn)(void *x, t_binbuf *b);
  
! typedef struct _socketreceiver {
!     char *inbuf;
!     int inhead;
!     int intail;
!     void *owner;
!     int udp;
!     t_socketnotifier notifier;
!     t_socketreceivefn socketreceivefn;
! /* for sending only: */
!     int fd;
!     char *outbuf;
!     struct _socketreceiver *next;
! } t_socketreceiver;
! 
! EXTERN t_socketreceiver *socketreceiver_new(t_pd *owner, int fd,
      t_socketnotifier notifier, t_socketreceivefn socketreceivefn, int udp);
  EXTERN void socketreceiver_read(t_socketreceiver *x, int fd);

Index: s_inter.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_inter.c,v
retrieving revision 1.5.4.10.2.25.2.3
retrieving revision 1.5.4.10.2.25.2.4
diff -C2 -d -r1.5.4.10.2.25.2.3 -r1.5.4.10.2.25.2.4
*** s_inter.c	1 Dec 2006 19:27:19 -0000	1.5.4.10.2.25.2.3
--- s_inter.c	2 Dec 2006 03:12:12 -0000	1.5.4.10.2.25.2.4
***************
*** 84,98 ****
  #define INBUFSIZE 4096
  
- struct _socketreceiver
- {
-     char *sr_inbuf;
-     int sr_inhead;
-     int sr_intail;
-     void *sr_owner;
-     int sr_udp;
-     t_socketnotifier sr_notifier;
-     t_socketreceivefn sr_socketreceivefn;
- };
- 
  extern char pd_version[];
  extern int sys_guisetportnumber;
--- 84,87 ----
***************
*** 101,108 ****
  static t_fdpoll *sys_fdpoll;
  static int sys_maxfd;
! static int sys_guisock;
! 
  static t_binbuf *inbinbuf;
! static t_socketreceiver *sys_socketreceiver;
  extern int sys_addhist(int phase);
  
--- 90,96 ----
  static t_fdpoll *sys_fdpoll;
  static int sys_maxfd;
! t_text *sys_netreceive;
  static t_binbuf *inbinbuf;
! t_socketreceiver *sys_socketreceiver;
  extern int sys_addhist(int phase);
  
***************
*** 429,466 ****
  }
  
! t_socketreceiver *socketreceiver_new(void *owner, t_socketnotifier notifier,
      t_socketreceivefn socketreceivefn, int udp)
  {
      t_socketreceiver *x = (t_socketreceiver *)getbytes(sizeof(*x));
!     x->sr_inhead = x->sr_intail = 0;
!     x->sr_owner = owner;
!     x->sr_notifier = notifier;
!     x->sr_socketreceivefn = socketreceivefn;
!     x->sr_udp = udp;
!     if (!(x->sr_inbuf = (char *)malloc(INBUFSIZE))) bug("t_socketreceiver");;
!     return (x);
  }
  
  void socketreceiver_free(t_socketreceiver *x)
  {
!     free(x->sr_inbuf);
      freebytes(x, sizeof(*x));
  }
  
!     /* this is in a separately called subroutine so that the buffer isn't
!     sitting on the stack while the messages are getting passed. */
  static int socketreceiver_doread(t_socketreceiver *x)
  {
      char messbuf[INBUFSIZE], *bp = messbuf;
      int indx;
!     int inhead = x->sr_inhead;
!     int intail = x->sr_intail;
!     char *inbuf = x->sr_inbuf;
!     if (intail == inhead) return (0);
      for (indx = intail; indx != inhead; indx = (indx+1)&(INBUFSIZE-1))
      {
!             /* if we hit a semi that isn't preceeded by a \, it's a message
!             boundary.  LATER we should deal with the possibility that the
!             preceeding \ might itself be escaped! */
          char c = *bp++ = inbuf[indx];
          if (c == ';' && (!indx || inbuf[indx-1] != '\\'))
--- 417,457 ----
  }
  
! t_socketreceiver *socketreceiver_new(t_pd *owner, int fd, t_socketnotifier notifier,
      t_socketreceivefn socketreceivefn, int udp)
  {
      t_socketreceiver *x = (t_socketreceiver *)getbytes(sizeof(*x));
!     x->inhead = x->intail = 0;
!     x->owner = owner;
!     x->notifier = notifier;
!     x->socketreceivefn = socketreceivefn;
!     x->udp = udp;
!     x->fd = fd;
!     x->outbuf = 0;
!     x->next = 0;
!     if (!(x->inbuf = (char *)malloc(INBUFSIZE))) bug("t_socketreceiver");;
!     return x;
  }
  
  void socketreceiver_free(t_socketreceiver *x)
  {
!     free(x->inbuf);
      freebytes(x, sizeof(*x));
  }
  
! /* this is in a separately called subroutine so that the buffer isn't
!    sitting on the stack while the messages are getting passed. */
  static int socketreceiver_doread(t_socketreceiver *x)
  {
      char messbuf[INBUFSIZE], *bp = messbuf;
      int indx;
!     int inhead = x->inhead;
!     int intail = x->intail;
!     char *inbuf = x->inbuf;
!     if (intail == inhead) return 0;
      for (indx = intail; indx != inhead; indx = (indx+1)&(INBUFSIZE-1))
      {
!         /* if we hit a semi that isn't preceeded by a \, it's a message
!            boundary.  LATER we should deal with the possibility that the
!            preceding \ might itself be escaped! */
          char c = *bp++ = inbuf[indx];
          if (c == ';' && (!indx || inbuf[indx-1] != '\\'))
***************
*** 473,478 ****
                  write(2, "\n", 1);
              }
!             x->sr_inhead = inhead;
!             x->sr_intail = intail;
              return (1);
          }
--- 464,469 ----
                  write(2, "\n", 1);
              }
!             x->inhead = inhead;
!             x->intail = intail;
              return (1);
          }
***************
*** 511,517 ****
              binbuf_text(inbinbuf, buf, strlen(buf));
              outlet_setstacklim();
!             if (x->sr_socketreceivefn)
!                 (*x->sr_socketreceivefn)(x->sr_owner, inbinbuf);
!             else bug("socketreceiver_getudp");
          }
      }
--- 502,506 ----
              binbuf_text(inbinbuf, buf, strlen(buf));
              outlet_setstacklim();
!             x->socketreceivefn(x->owner, inbinbuf);
          }
      }
***************
*** 520,589 ****
  void sys_exit(void);
  
! void binbuf_eval_from_client(t_binbuf *b);
! 
! void socketreceiver_read(t_socketreceiver *x, int fd)
! {
!     if (x->sr_udp)   /* UDP ("datagram") socket protocol */
!         socketreceiver_getudp(x, fd);
!     else  /* TCP ("streaming") socket protocol */
!     {
!         char *semi;
!         int readto =
!             (x->sr_inhead >= x->sr_intail ? INBUFSIZE : x->sr_intail-1);
!         int ret;
! 
!             /* the input buffer might be full.  If so, drop the whole thing */
!         if (readto == x->sr_inhead)
!         {
!             fprintf(stderr, "pd: dropped message from gui\n");
!             x->sr_inhead = x->sr_intail = 0;
!             readto = INBUFSIZE;
!         }
!         else
!         {
!             ret = recv(fd, x->sr_inbuf + x->sr_inhead,
!                 readto - x->sr_inhead, 0);
!             if (ret < 0)
!             {
!                 sys_sockerror("recv");
!                 if (x == sys_socketreceiver) sys_bail(1);
!                 else
!                 {
!                     if (x->sr_notifier) (*x->sr_notifier)(x->sr_owner);
!                     sys_rmpollfn(fd);
!                     sys_closesocket(fd);
!                 }
!             }
!             else if (ret == 0)
!             {
!                 if (x == sys_socketreceiver)
!                 {
!                     fprintf(stderr, "pd: exiting\n");
!                     sys_exit();
!                     return;
!                 }
!                 else
!                 {
!                     post("EOF on socket %d\n", fd);
!                     if (x->sr_notifier) (*x->sr_notifier)(x->sr_owner);
!                     sys_rmpollfn(fd);
!                     sys_closesocket(fd);
!                 }
!             }
!             else
!             {
!                 x->sr_inhead += ret;
!                 if (x->sr_inhead >= INBUFSIZE) x->sr_inhead = 0;
!                 while (socketreceiver_doread(x))
!                 {
!                     outlet_setstacklim();
!                     if (x->sr_socketreceivefn)
!                         (*x->sr_socketreceivefn)(x->sr_owner, inbinbuf);
!                     else {
! 			binbuf_eval_from_client(inbinbuf);
! 		    }
!                 }
!             }
!         }
      }
  }
--- 509,537 ----
  void sys_exit(void);
  
! void socketreceiver_read(t_socketreceiver *x, int fd) {
!     int readto;
!     if (x->udp) {socketreceiver_getudp(x, fd); return;}
!     /* else TCP */
!     readto = x->inhead >= x->intail ? INBUFSIZE : x->intail-1;
!     /* the input buffer might be full.  If so, drop the whole thing */
!     if (readto == x->inhead) {
! 	fprintf(stderr, "pd: dropped message from gui\n");
! 	x->inhead = x->intail = 0;
! 	readto = INBUFSIZE;
!     } else {
! 	int ret = recv(fd, x->inbuf+x->inhead, readto-x->inhead, 0);
!         if (ret<=0) {
! 	    if (ret<0) sys_sockerror("recv"); else post("EOF on socket %d\n", fd);
! 	    if (x->notifier) x->notifier(x->owner);
! 	    sys_rmpollfn(fd);
! 	    sys_closesocket(fd);
! 	    return;
! 	}
! 	x->inhead += ret;
! 	if (x->inhead >= INBUFSIZE) x->inhead = 0;
! 	while (socketreceiver_doread(x)) {
! 	    outlet_setstacklim();
! 	    x->socketreceivefn(x->owner, inbinbuf);
! 	}
      }
  }
***************
*** 604,616 ****
  #define GUI_BYTESPERPING 1024 /* how much we send up per ping */
  
- typedef struct _guiqueue
- {
-     void *gq_client;
-     t_glist *gq_glist;
-     t_guicallbackfn gq_fn;
-     struct _guiqueue *gq_next;
- } t_guiqueue;
- 
- static t_guiqueue *sys_guiqueuehead;
  static char *sys_guibuf;
  static int sys_guibufhead;
--- 552,555 ----
***************
*** 620,687 ****
  static int sys_bytessincelastping;
  
! static void sys_trytogetmoreguibuf(int newsize)
! {
      char *newbuf = (char *)realloc(sys_guibuf, newsize);
! #if 0
!     static int sizewas;
!     if (newsize > 70000 && sizewas < 70000)
!     {
!         int i;
!         for (i = sys_guibuftail; i < sys_guibufhead; i++)
!             fputc(sys_guibuf[i], stderr);
!     }
!     sizewas = newsize;
! #endif
! #if 0
!     fprintf(stderr, "new size %d (head %d, tail %d)\n",
!         newsize, sys_guibufhead, sys_guibuftail);
! #endif
! 
!         /* if realloc fails, make a last-ditch attempt to stay alive by
!         synchronously writing out the existing contents.  LATER test
!         this by intentionally setting newbuf to zero */
!     if (!newbuf)
!     {
!         int bytestowrite = sys_guibuftail - sys_guibufhead;
!         int written = 0;
!         while (1)
!         {
!             int res = send(sys_guisock,
!                 sys_guibuf + sys_guibuftail + written, bytestowrite, 0);
!             if (res < 0)
!             {
!                 perror("pd output pipe");
!                 sys_bail(1);
!             }
!             else
!             {
!                 written += res;
!                 if (written >= bytestowrite)
!                     break;
!             }
!         }
!         sys_guibufhead = sys_guibuftail = 0;
!     }
!     else
!     {
!         sys_guibufsize = newsize;
!         sys_guibuf = newbuf;
!     }
  }
  
! void sys_vgui(char *fmt, ...)
! {
!     int msglen, bytesleft, headwas, nwrote;
      va_list ap;
! 
!     if (sys_nogui)
!         return;
!     if (!sys_guibuf)
!     {
!         if (!(sys_guibuf = (char *)malloc(GUI_ALLOCCHUNK)))
!         {
!             fprintf(stderr, "Pd: couldn't allocate GUI buffer\n");
!             sys_bail(1);
!         }
          sys_guibufsize = GUI_ALLOCCHUNK;
          sys_guibufhead = sys_guibuftail = 0;
--- 559,574 ----
  static int sys_bytessincelastping;
  
! static void sys_trytogetmoreguibuf(int newsize) {
      char *newbuf = (char *)realloc(sys_guibuf, newsize);
!     sys_guibufsize = newsize;
!     sys_guibuf = newbuf;
  }
  
! void sys_vgui(char *fmt, ...) {
! //    t_socketreceiver *self = sys_socketreceiver;
!     int msglen;
      va_list ap;
!     if (!sys_guibuf) {
!         sys_guibuf = (char *)malloc(GUI_ALLOCCHUNK);
          sys_guibufsize = GUI_ALLOCCHUNK;
          sys_guibufhead = sys_guibuftail = 0;
***************
*** 690,877 ****
          sys_trytogetmoreguibuf(sys_guibufsize + GUI_ALLOCCHUNK);
      va_start(ap, fmt);
!     msglen = vsnprintf(sys_guibuf + sys_guibufhead,
!         sys_guibufsize - sys_guibufhead, fmt, ap);
      va_end(ap);
!     if(msglen < 0) 
!     {
          fprintf(stderr, "Pd: buffer space wasn't sufficient for long GUI string\n");
          return;
      }
!     if (msglen >= sys_guibufsize - sys_guibufhead)
!     {
!         int msglen2, newsize = sys_guibufsize + 1 +
!             (msglen > GUI_ALLOCCHUNK ? msglen : GUI_ALLOCCHUNK);
          sys_trytogetmoreguibuf(newsize);
- 
          va_start(ap, fmt);
          msglen2 = vsnprintf(sys_guibuf + sys_guibufhead,
              sys_guibufsize - sys_guibufhead, fmt, ap);
          va_end(ap);
!         if (msglen2 != msglen)
!             bug("sys_vgui");
!         if (msglen >= sys_guibufsize - sys_guibufhead)
!             msglen = sys_guibufsize - sys_guibufhead;
      }
!     if (sys_debuglevel & DEBUG_MESSUP)
!         fprintf(stderr, "%s",  sys_guibuf + sys_guibufhead);
      sys_guibufhead += msglen;
      sys_bytessincelastping += msglen;
  }
  
! void sys_gui(char *s)
! {
!     sys_vgui("%s", s);
! }
  
! static int sys_flushtogui( void)
! {
      int writesize = sys_guibufhead - sys_guibuftail, nwrote = 0;
!     if (writesize > 0)
!         nwrote = send(sys_guisock, sys_guibuf + sys_guibuftail, writesize, 0);
! 
! #if 0   
!     if (writesize)
!         fprintf(stderr, "wrote %d of %d\n", nwrote, writesize);
! #endif
! 
!     if (nwrote < 0)
!     {
          perror("pd-to-gui socket");
          sys_bail(1);
!     }
!     else if (!nwrote)
!         return (0);
!     else if (nwrote >= sys_guibufhead - sys_guibuftail)
           sys_guibufhead = sys_guibuftail = 0;
!     else if (nwrote)
!     {
          sys_guibuftail += nwrote;
!         if (sys_guibuftail > (sys_guibufsize >> 2))
!         {
!             memmove(sys_guibuf, sys_guibuf + sys_guibuftail,
!                 sys_guibufhead - sys_guibuftail);
              sys_guibufhead = sys_guibufhead - sys_guibuftail;
              sys_guibuftail = 0;
          }
      }
!     return (1);
! }
! 
! void glob_ping(t_pd *dummy)
! {
!     sys_waitingforping = 0;
! }
! 
! static int sys_flushqueue(void )
! {
!     int wherestop = sys_bytessincelastping + GUI_UPDATESLICE;
!     if (wherestop + (GUI_UPDATESLICE >> 1) > GUI_BYTESPERPING)
!         wherestop = 0x7fffffff;
!     if (sys_waitingforping)
!         return (0);
!     if (!sys_guiqueuehead)
!         return (0);
!     while (1)
!     {
!         if (sys_bytessincelastping >= GUI_BYTESPERPING)
!         {
!             sys_gui("pdtk_ping\n");
!             sys_bytessincelastping = 0;
!             sys_waitingforping = 1;
!             return (1);
!         }
!         if (sys_guiqueuehead)
!         {
!             t_guiqueue *headwas = sys_guiqueuehead;
!             sys_guiqueuehead = headwas->gq_next;
!             (*headwas->gq_fn)((t_gobj *)headwas->gq_client, headwas->gq_glist);
!             t_freebytes(headwas, sizeof(*headwas));
!             if (sys_bytessincelastping >= wherestop)
!                 break;
!         }
!         else break;
!     }
!     sys_flushtogui();
!     return (1);
! }
! 
!     /* flush output buffer and update queue to gui in small time slices */
! static int sys_poll_togui(void) /* returns 1 if did anything */
! {
!     if (sys_nogui)
!         return (0);
!         /* see if there is stuff still in the buffer, if so we
!             must have fallen behind, so just try to clear that. */
!     if (sys_flushtogui())
!         return (1);
!         /* if the flush wasn't complete, wait. */
!     if (sys_guibufhead > sys_guibuftail)
!         return (0);
!     
!         /* check for queued updates */
!     if (sys_flushqueue())
!         return (1);
!     
!     return (0);
! }
! 
!     /* if some GUI object is having to do heavy computations, it can tell
!     us to back off from doing more updates by faking a big one itself. */
! void sys_pretendguibytes(int n)
! {
!     sys_bytessincelastping += n;
! }
! 
! void sys_queuegui(void *client, t_glist *glist, t_guicallbackfn f)
! {
!     t_guiqueue **gqnextptr, *gq;
!     if (!sys_guiqueuehead)
!         gqnextptr = &sys_guiqueuehead;
!     else
!     {
!         for (gq = sys_guiqueuehead; gq->gq_next; gq = gq->gq_next)
!             if (gq->gq_client == client)
!                 return;
!         gqnextptr = &gq->gq_next;
!     }
!     gq = (t_guiqueue *)t_getbytes(sizeof(*gq));
!     gq->gq_next = 0;
!     gq->gq_client = client;
!     gq->gq_glist = glist;
!     gq->gq_fn = f;
!     gq->gq_next = 0;
!     *gqnextptr = gq;
  }
  
! void sys_unqueuegui(void *client)
! {
!     t_guiqueue *gq, *gq2;
!     if (!sys_guiqueuehead)
!         return;
!     if (sys_guiqueuehead->gq_client == client)
!     {
!         t_freebytes(sys_guiqueuehead, sizeof(*sys_guiqueuehead));
!         sys_guiqueuehead = 0;
!     }
!     else for (gq = sys_guiqueuehead; gq2 = gq->gq_next; gq = gq2)
!         if (gq2->gq_client == client)
!     {
!         gq->gq_next = gq2->gq_next;
!         t_freebytes(gq2, sizeof(*gq2));
!         break;
!     }
! }
  
! int sys_pollgui(void)
! {
! 	return (sys_pollsockets() || sys_poll_togui());
  }
  
- 
- 
  /* --------------------- starting up the GUI connection ------------- */
  
- static int sys_watchfd;
- 
  #ifdef __linux__
  void glob_watchdog(t_pd *dummy)
--- 577,635 ----
          sys_trytogetmoreguibuf(sys_guibufsize + GUI_ALLOCCHUNK);
      va_start(ap, fmt);
!     msglen = vsnprintf(sys_guibuf + sys_guibufhead, sys_guibufsize - sys_guibufhead, fmt, ap);
      va_end(ap);
!     if(msglen < 0) {
          fprintf(stderr, "Pd: buffer space wasn't sufficient for long GUI string\n");
          return;
      }
!     if (msglen >= sys_guibufsize - sys_guibufhead) {
!         int msglen2, newsize = sys_guibufsize + 1 + (msglen > GUI_ALLOCCHUNK ? msglen : GUI_ALLOCCHUNK);
          sys_trytogetmoreguibuf(newsize);
          va_start(ap, fmt);
          msglen2 = vsnprintf(sys_guibuf + sys_guibufhead,
              sys_guibufsize - sys_guibufhead, fmt, ap);
          va_end(ap);
!         if (msglen2 != msglen) bug("sys_vgui");
!         if (msglen >= sys_guibufsize - sys_guibufhead) msglen = sys_guibufsize - sys_guibufhead;
      }
!     if (sys_debuglevel & DEBUG_MESSUP) fprintf(stderr, "%s",  sys_guibuf + sys_guibufhead);
      sys_guibufhead += msglen;
      sys_bytessincelastping += msglen;
  }
  
! void sys_gui(char *s) {sys_vgui("%s", s);}
  
! static int sys_flushtogui(t_socketreceiver *self) {
      int writesize = sys_guibufhead - sys_guibuftail, nwrote = 0;
!     if (!writesize) return 0;
!     fprintf(stderr,"sys_flushtogui self=%p writesize=%d\n",self,writesize);
!     nwrote = send(self->fd, sys_guibuf + sys_guibuftail, writesize, 0);
!     if (nwrote < 0) {
          perror("pd-to-gui socket");
          sys_bail(1);
!     } else if (!nwrote) {
!         return 0;
!     } else if (nwrote >= sys_guibufhead - sys_guibuftail) {
           sys_guibufhead = sys_guibuftail = 0;
!     } else if (nwrote) {
          sys_guibuftail += nwrote;
!         if (sys_guibuftail > (sys_guibufsize >> 2)) {
!             memmove(sys_guibuf, sys_guibuf + sys_guibuftail, sys_guibufhead - sys_guibuftail);
              sys_guibufhead = sys_guibufhead - sys_guibuftail;
              sys_guibuftail = 0;
          }
      }
!     return 1;
  }
  
! void glob_ping(t_pd *dummy) {sys_waitingforping = 0;}
  
! int sys_pollgui(void) {
! 	if (sys_socketreceiver) sys_flushtogui(sys_socketreceiver);
! 	return sys_pollsockets();
  }
  
  /* --------------------- starting up the GUI connection ------------- */
  
  #ifdef __linux__
  void glob_watchdog(t_pd *dummy)
***************
*** 887,934 ****
  #endif
  
! #define FIRSTPORTNUM 5400
! 
! static int sys_start_watchdog_thread(void);
! 
! static t_int fake_initfromgui(t_int* dummy)
! {
! 	char cmdbuf[4*MAXPDSTRING];
! 	int i;
! #ifdef MSW
! 	if (GetCurrentDirectory(MAXPDSTRING, cmdbuf) == 0)
! 		strcpy(cmdbuf, ".");
! #endif
! #ifdef UNISTD
! 	if (!getcwd(cmdbuf, MAXPDSTRING))
! 		strcpy(cmdbuf, ".");
! 	
! #endif
! 	glob_initfromgui(0,0);
! 	return 0;
! }
! 
! void sys_setpriority(void);
! 
! int sys_startgui(void)
! {
!     pid_t childpid;
!     char cmdbuf[4*MAXPDSTRING];
!     struct sockaddr_in server;
!     int msgsock;
!     char buf[15];
!     int len = sizeof(server);
!     int ntry = 0, portno = FIRSTPORTNUM;
!     int xsock = -1;
! #ifdef _WIN32
!     short version = MAKEWORD(2, 0);
!     WSADATA nobby;
! #endif /* _WIN32 */
! #ifdef UNISTD
!     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);
--- 645,649 ----
  #endif
  
! static void sys_setsignals(void) {
  #ifdef UNISTD
      signal(SIGHUP, sys_huphandler);
***************
*** 945,980 ****
  /* 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"
! 		"a -guiport option. Please start using the command 'wish desire.tk' instead.\n");
! 	exit(1);
!     }
  
  #if defined(__linux__) || defined(IRIX)
--- 660,695 ----
  /* GG says: don't set SIGSTKFLT */
  #endif
+ }
+ 
+ //t_pd *pd_new3(const char *s);
+ 
+ void *netreceive_new(t_symbol *compatflag, t_floatarg fportno, t_floatarg udpflag);
+ static int sys_start_watchdog_thread(void);
+ static void sys_setpriority(void);
+ extern t_text *manager;
+ 
+ int sys_startgui(void) {
+     t_text *printer0;
+     t_text *printer1;
  #ifdef _WIN32
+     short version = MAKEWORD(2, 0);
+     WSADATA nobby;
      if (WSAStartup(version, &nobby)) sys_sockerror("WSAstartup");
  #endif /* _WIN32 */
!     /* create an empty FD poll list */
!     sys_fdpoll = (t_fdpoll *)t_getbytes(0);
!     sys_nfdpoll = 0;
!     inbinbuf = binbuf_new();
!     sys_setsignals();
! 
!     fprintf(stderr,"sys_guisetportnumber=%d\n",sys_guisetportnumber);
!     sys_netreceive = netreceive_new(&s_,sys_guisetportnumber,0);
!     fprintf(stderr,"sys_netreceive=%p\n",sys_netreceive);
!     if (!sys_netreceive) return;
!     printer0 = (t_text *)pd_new3("print left");
!     printer1 = (t_text *)pd_new3("print right");
!     obj_connect(sys_netreceive,0,printer0,0);
!     obj_connect(sys_netreceive,1,printer1,0);
!     obj_connect(sys_netreceive,0,manager,0);
  
  #if defined(__linux__) || defined(IRIX)
***************
*** 988,999 ****
      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;
  }
--- 703,712 ----
      if (sys_hipriority) sys_setpriority();
      setuid(getuid());
! /*
          char buf[256], buf2[256];
  	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;
  }
***************
*** 1062,1076 ****
  #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)
      {
--- 775,778 ----
***************
*** 1106,1119 ****
  void glob_closeall(void *dummy, t_floatarg fforce);
  
! void glob_quit(void *dummy)
! {
      glob_closeall(0, 1);
!     sys_vgui("exit\n");
!     if (!sys_nogui)
!     {
!         close(sys_guisock);
!         sys_rmpollfn(sys_guisock);
!     }
!     sys_bail(0); 
  }
  
--- 808,814 ----
  void glob_closeall(void *dummy, t_floatarg fforce);
  
! void glob_quit(void *dummy) {
      glob_closeall(0, 1);
!     sys_bail(0);
  }
  

Index: m_pd.h
===================================================================
RCS file: /cvsroot/pure-data/pd/src/m_pd.h,v
retrieving revision 1.4.4.11.2.33.2.1
retrieving revision 1.4.4.11.2.33.2.2
diff -C2 -d -r1.4.4.11.2.33.2.1 -r1.4.4.11.2.33.2.2
*** m_pd.h	30 Nov 2006 03:30:36 -0000	1.4.4.11.2.33.2.1
--- m_pd.h	2 Dec 2006 03:12:12 -0000	1.4.4.11.2.33.2.2
***************
*** 459,464 ****
      char *result,int resultsize);
  EXTERN t_symbol *canvas_getdir(t_glist *x);
- EXTERN int sys_fontwidth(int fontsize);
- EXTERN int sys_fontheight(int fontsize);
  EXTERN void canvas_dataproperties(t_glist *x, t_scalar *sc, t_binbuf *b);
  
--- 459,462 ----
***************
*** 817,827 ****
  
  /* ------- GUI interface - functions to send strings to TK --------- */
- typedef void (*t_guicallbackfn)(t_gobj *client, t_glist *glist);
- 
  EXTERN void sys_vgui(char *fmt, ...);
  EXTERN void sys_gui(char *s);
- EXTERN void sys_pretendguibytes(int n);
- EXTERN void sys_queuegui(void *client, t_glist *glist, t_guicallbackfn f);
- EXTERN void sys_unqueuegui(void *client);
      /* dialog window creation and destruction */
  EXTERN void gfxstub_new(t_pd *owner, void *key, const char *cmd);
--- 815,820 ----
***************
*** 878,879 ****
--- 871,877 ----
  #define __m_pd_h_
  #endif /* __m_pd_h_ */
+ 
+ /* removed features:
+    sys_fontwidth, sys_fontheight, t_widgetbehavior, class_setproperties, class_setwidget,
+    sys_pretendguibytes, sys_queuegui, sys_unqueuegui
+  */

Index: x_net.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/x_net.c,v
retrieving revision 1.2.4.2.2.2
retrieving revision 1.2.4.2.2.2.2.1
diff -C2 -d -r1.2.4.2.2.2 -r1.2.4.2.2.2.2.1
*** x_net.c	30 Nov 2005 13:36:58 -0000	1.2.4.2.2.2
--- x_net.c	2 Dec 2006 03:12:13 -0000	1.2.4.2.2.2.2.1
***************
*** 192,195 ****
--- 192,197 ----
      int x_nconnections;
      int x_udp;
+ /* only used for sending */
+     t_socketreceiver *sr;
  } t_netreceive;
  
***************
*** 201,208 ****
  static void netreceive_doit(void *z, t_binbuf *b)
  {
-     t_atom messbuf[1024];
      t_netreceive *x = (t_netreceive *)z;
      int msg, natom = binbuf_getnatom(b);
      t_atom *at = binbuf_getvec(b);
      for (msg = 0; msg < natom;)
      {
--- 203,210 ----
  static void netreceive_doit(void *z, t_binbuf *b)
  {
      t_netreceive *x = (t_netreceive *)z;
      int msg, natom = binbuf_getnatom(b);
      t_atom *at = binbuf_getvec(b);
+     fprintf(stderr,"%s\n",__PRETTY_FUNCTION__);
      for (msg = 0; msg < natom;)
      {
***************
*** 241,254 ****
      else
      {
!         t_socketreceiver *y = socketreceiver_new((void *)x, 
!             (t_socketnotifier)netreceive_notify,
!                 (x->x_msgout ? netreceive_doit : 0), 0);
          sys_addpollfn(fd, (t_fdpollfn)socketreceiver_read, y);
          outlet_float(x->x_connectout, ++x->x_nconnections);
      }
  }
  
! static void *netreceive_new(t_symbol *compatflag,
!     t_floatarg fportno, t_floatarg udpflag)
  {
      t_netreceive *x;
--- 243,257 ----
      else
      {
!         t_socketreceiver *y = socketreceiver_new((t_pd *)x, fd,
!             (t_socketnotifier)netreceive_notify, x->x_msgout?netreceive_doit:0, 0);
          sys_addpollfn(fd, (t_fdpollfn)socketreceiver_read, y);
          outlet_float(x->x_connectout, ++x->x_nconnections);
+ 	y->next = x->sr;
+ 	x->sr = y;
      }
  }
  
! void *netreceive_new(t_symbol *compatflag,
! t_floatarg fportno, t_floatarg udpflag)
  {
      t_netreceive *x;
***************
*** 271,275 ****
  
  #if 1
!         /* ask OS to allow another Pd to repoen this port after we close it. */
      intarg = 1;
      if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
--- 274,278 ----
  
  #if 1
!         /* ask OS to allow another Pd to reopen this port after we close it. */
      intarg = 1;
      if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
***************
*** 312,316 ****
      {
          t_socketreceiver *y = socketreceiver_new((void *)x, 
!             (t_socketnotifier)netreceive_notify,
                  (x->x_msgout ? netreceive_doit : 0), 1);
          sys_addpollfn(sockfd, (t_fdpollfn)socketreceiver_read, y);
--- 315,319 ----
      {
          t_socketreceiver *y = socketreceiver_new((void *)x, 
!             (t_socketnotifier)netreceive_notify, sockfd,
                  (x->x_msgout ? netreceive_doit : 0), 1);
          sys_addpollfn(sockfd, (t_fdpollfn)socketreceiver_read, y);
***************
*** 334,338 ****
      x->x_nconnections = 0;
      x->x_udp = udp;
! 
      return (x);
  }
--- 337,341 ----
      x->x_nconnections = 0;
      x->x_udp = udp;
!     x->sr = 0;
      return (x);
  }
***************
*** 362,363 ****
--- 365,369 ----
  }
  
+ t_socketreceiver *netreceive_newest_receiver(t_netreceive *x) {
+ 	return x->sr;
+ }
\ No newline at end of file





More information about the Pd-cvs mailing list