Public feed
#890232
// 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;
}