Hi.. yup absolutely , theres something wrong with the way my code is interacting with pd and threads .. however what I'm doing is so simple I have to conclude there is something very strange amiss..
On Tue, 2008-04-15 at 14:56 -0400, Hans-Christoph Steiner wrote:
I'd say it's most likely your code. I would be very surprised if libc is leaking memory. There are thousands of eyes looking at that code, and many millions using it in many ways. Pd code could have leaks, but mostly it is good.
Try posting your code.
I've stripped this down to the simplest example possible. When this external is used, it has a bang method that launches a thread that does absolutely nothing. It also mallocs 1000000 bytes and frees them immediately (not even within the thread).
The test patch is::
#N canvas 0 0 450 300 10; #X obj 31 88 thread; #X obj 42 47 metro 1000; #X obj 39 8 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0 1 ; #X obj 126 109 bng 15 250 50 0 empty empty empty 0 -6 0 10 -262144 -1 -1; #X connect 1 0 0 0; #X connect 1 0 3 0; #X connect 2 0 1 0;
As far as I can see, this leaks all of the memory that its allocating. The VIRT column of the pd entry in 'top' climbs at more than 1 meg per second.
However, if I comment out pthread_create then pd's memory use doesnt grow at all.
Heres the code...what am I doing wrong?
#include "m_pd.h" #include <stdlib.h>
#include <pthread.h>
pthread_attr_t gen_attr;
static t_class *thread_class;
typedef struct _thread { t_object x_obj; } t_thread;
void *threadtester( void* x_obj ) { t_thread *x= (t_thread *) x_obj;
//do nothing in particular
return 0; }
void thread_bang(t_thread *x) { char* temp=(char*)malloc(1000000); free(temp);
pthread_t stest; pthread_create (&stest,&gen_attr,threadtester,(void *) x); post("hello world!"); }
void *thread_new(void) { t_thread *x = (t_thread *)pd_new(thread_class);
return (void *)x; }
void thread_setup(void) { // //create parameters for low priority thread pthread_attr_init(&gen_attr); struct sched_param param; param.sched_priority = 15; //LOW priority (-20..20) pthread_attr_setschedparam( &gen_attr, ¶m );
thread_class = class_new(gensym("thread"), (t_newmethod)thread_new, 0, sizeof(t_thread), CLASS_DEFAULT, 0); class_addbang(thread_class, thread_bang); }