[PD-cvs] SF.net SVN: pure-data: [10038] branches/pd-extended/v0-40/externals/maxlib/ src/netclient.c

eighthave at users.sourceforge.net eighthave at users.sourceforge.net
Thu Jun 19 00:58:19 CEST 2008


Revision: 10038
          http://pure-data.svn.sourceforge.net/pure-data/?rev=10038&view=rev
Author:   eighthave
Date:     2008-06-18 15:58:18 -0700 (Wed, 18 Jun 2008)

Log Message:
-----------
fixed double freeing of inbinbuf, but I now wonder whether all of the instances of [netclient] should really be sharing the same static, global inbinbuf as a buffer...

Modified Paths:
--------------
    branches/pd-extended/v0-40/externals/maxlib/src/netclient.c

Modified: branches/pd-extended/v0-40/externals/maxlib/src/netclient.c
===================================================================
--- branches/pd-extended/v0-40/externals/maxlib/src/netclient.c	2008-06-18 21:06:16 UTC (rev 10037)
+++ branches/pd-extended/v0-40/externals/maxlib/src/netclient.c	2008-06-18 22:58:18 UTC (rev 10038)
@@ -47,10 +47,11 @@
 
 #define INBUFSIZE 4096	/* maximum numbers of characters to read */
 
-static char *version = "netclient v0.3, written by Olaf Matthes <olaf.matthes at gmx.de>";
+static char *version = "netclient v0.3.1, written by Olaf Matthes <olaf.matthes at gmx.de>";
 
 static t_class *netclient_class;
 static t_binbuf *inbinbuf;
+static int netclient_instance_count;
 
 typedef struct _netclient
 {
@@ -71,10 +72,6 @@
 	pthread_attr_t x_threadattr;     /* attributes of child thread */
 } t_netclient;
 
-#ifdef USE_CIRCULAR
-static t_binbuf *inbinbuf;
-#endif
-
 	/* one lonlely prototype */
 static void netclient_rcv(t_netclient *x);
 
@@ -243,16 +240,12 @@
 {
 	int fd = x->x_fd;
 	int ret;
-    char resp[INBUFSIZE];
 	fd_set readset;
 	fd_set exceptset;
     struct timeval ztout;
 		/* output data */
-	t_binbuf *binbuf;
-    t_atom messbuf[1024];
     int msg, natom;
     t_atom *at;
-	int i;
 	
 	if(x->x_connectstate)
 	{
@@ -340,7 +333,8 @@
     x->x_outdata = outlet_new(&x->x_obj, &s_anything);	/* received data */
     x->x_outconnect = outlet_new(&x->x_obj, &s_float);	/* connection state */
     x->x_clock = clock_new(x, (t_method)netclient_tick);
-	inbinbuf = binbuf_new();
+    if(netclient_instance_count == 0)
+        inbinbuf = binbuf_new();
     x->x_fd = -1;
     x->x_protocol = (udpflag != 0 ? SOCK_DGRAM : SOCK_STREAM);
 		/* prepare child thread */
@@ -348,6 +342,7 @@
        post("netclient: warning: could not prepare child thread" );
     if(pthread_attr_setdetachstate(&x->x_threadattr, PTHREAD_CREATE_DETACHED) < 0)
        post("netclient: warning: could not prepare child thread" );
+	netclient_instance_count++;
     return (x);
 }
 
@@ -355,7 +350,9 @@
 {
     netclient_disconnect(x);
     clock_free(x->x_clock);
-	binbuf_free(inbinbuf);
+	netclient_instance_count--;
+    if(netclient_instance_count == 0)
+        binbuf_free(inbinbuf);
 }
 
 #ifndef MAXLIB


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Pd-cvs mailing list