Public feed #890232

Unnamed

public text v1 · immutable
Raw Edit
·published 2008-02-03 16:02 UTC
rendered paste body
// 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;
}