// I am wondering if there are any MEMORY LEAKS in this code.. // I think I covered all possibilities.. but my program still has a nagging memory leak.. // and I suspect the dd = malloc() is never getting freed properly... // dsend() simply spawns a thread to write() data to a socket // Please advise :) typedef struct t_DSENDDATA { int connfd; char str[MAXINPUT]; } DSENDDATA; void dsend(int sockfd, char *fmt, ...) { va_list args; DSENDDATA* dd; pthread_t tid; int k; if( (dd = malloc(sizeof(DSENDDATA))) != NULL ) { dd->connfd = sockfd; va_start(args, fmt); vsnprintf(dd->str, sizeof(dd->str), fmt, args); va_end(args); while( (k = pthread_create(&tid, NULL, Thread_dsend, (void*)dd)) == EAGAIN ) { usleep(200000); // 1/5 of a second } if( k != 0 ) { free(dd); } else { pthread_detach(tid); } } } void Thread_dsend(void* arg) { DSENDDATA* dd = (DSENDDATA*)arg; writen(dd->connfd, dd->str, strlen(dd->str)+1); free(dd); } // taken from Unix Network Programming (UNP) by R. Stevens ssize_t writen(int fd, const void* vptr, size_t n) { size_t nleft; ssize_t nwritten; const char* ptr; ptr = vptr; nleft = n; while( nleft > 0 ) { if( (nwritten = write(fd, ptr, nleft)) <= 0 ) { if( errno == EINTR ) { nwritten = 0; // and call write() again } else { return -1; } } nleft -= nwritten; ptr += nwritten; } return n; }