On Mon, Apr 27, 2009 at 9:00 PM, Matt Provost <mprov...@termcap.net> wrote: > On Mon, Apr 27, 2009 at 08:49:27PM -0700, Andrew Pinski wrote: >> On Mon, Apr 27, 2009 at 8:37 PM, Matt Provost <mprov...@termcap.net> wrote: >> > void tdebug(const char *format, ...) { >> > ?? ??va_list ap; >> > ?? ??pthread_mutex_lock(&m); >> > ?? ??mylog.format = format; >> > ?? ??va_start(ap, format); >> > ?? ??va_copy(mylog.ap, ap); >> > ?? ??pthread_cond_signal(&c); >> > ?? ??pthread_mutex_unlock(&m); >> >> You are missing two va_end's here >> > > Yes I had a question about va_end in this situation. Putting one that > clears 'ap' seems fine but doesn't change anything. But if you va_end > the copy that you put in the struct, then what happens when the other > thread goes to use it? Or should the va_end for that be in the tprintlog > function after it's done with it? > > In any case none of those combinations seem to affect the output. >
va_list points to stack memory. Are you passing pointer to stack memory from one thread to another? How is this behavior defined? -- H.J.