From ccfe279117f197d2b3d0bb17bc754209024836a2 Mon Sep 17 00:00:00 2001 From: Yang Tse Date: Mon, 18 Jan 2010 20:22:04 +0000 Subject: Constantine Sapuntzakis enhancements to make memory tracking log file writing of messages atomic, on systems where an fwrite of a memory buffer is atomic. --- lib/curl_addrinfo.c | 23 +++++------ lib/hostip6.c | 18 ++++----- lib/memdebug.c | 113 +++++++++++++++++++++++++++++++++------------------- lib/memdebug.h | 1 + src/writeenv.c | 10 +++-- 5 files changed, 96 insertions(+), 69 deletions(-) diff --git a/lib/curl_addrinfo.c b/lib/curl_addrinfo.c index a5d26165c..07dc1e7f0 100644 --- a/lib/curl_addrinfo.c +++ b/lib/curl_addrinfo.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -447,9 +447,8 @@ curl_dofreeaddrinfo(struct addrinfo *freethis, int line, const char *source) { (freeaddrinfo)(freethis); - if(logfile) - fprintf(logfile, "ADDR %s:%d freeaddrinfo(%p)\n", - source, line, (void *)freethis); + curl_memlog("ADDR %s:%d freeaddrinfo(%p)\n", + source, line, (void *)freethis); } #endif /* defined(CURLDEBUG) && defined(HAVE_FREEADDRINFO) */ @@ -471,17 +470,13 @@ curl_dogetaddrinfo(const char *hostname, int line, const char *source) { int res=(getaddrinfo)(hostname, service, hints, result); - if(0 == res) { + if(0 == res) /* success */ - if(logfile) - fprintf(logfile, "ADDR %s:%d getaddrinfo() = %p\n", - source, line, (void *)*result); - } - else { - if(logfile) - fprintf(logfile, "ADDR %s:%d getaddrinfo() failed\n", - source, line); - } + curl_memlog("ADDR %s:%d getaddrinfo() = %p\n", + source, line, (void *)*result); + else + curl_memlog("ADDR %s:%d getaddrinfo() failed\n", + source, line); return res; } #endif /* defined(CURLDEBUG) && defined(HAVE_GETADDRINFO) */ diff --git a/lib/hostip6.c b/lib/hostip6.c index a5bc55ce0..518133365 100644 --- a/lib/hostip6.c +++ b/lib/hostip6.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -112,17 +112,13 @@ int curl_dogetnameinfo(GETNAMEINFO_QUAL_ARG1 GETNAMEINFO_TYPE_ARG1 sa, host, hostlen, serv, servlen, flags); - if(0 == res) { + if(0 == res) /* success */ - if(logfile) - fprintf(logfile, "GETNAME %s:%d getnameinfo()\n", - source, line); - } - else { - if(logfile) - fprintf(logfile, "GETNAME %s:%d getnameinfo() failed = %d\n", - source, line, res); - } + curl_memlog("GETNAME %s:%d getnameinfo()\n", + source, line); + else + curl_memlog("GETNAME %s:%d getnameinfo() failed = %d\n", + source, line, res); return res; } #endif /* defined(CURLDEBUG) && defined(HAVE_GETNAMEINFO) */ diff --git a/lib/memdebug.c b/lib/memdebug.c index 37921fd76..6261749fb 100644 --- a/lib/memdebug.c +++ b/lib/memdebug.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef HAVE_UNISTD_H #include @@ -104,12 +105,14 @@ static bool countcheck(const char *func, int line, const char *source) should not be made */ if(memlimit && source) { if(!memsize) { - if(logfile && source) - fprintf(logfile, "LIMIT %s:%d %s reached memlimit\n", - source, line, func); - if(source) + if(source) { + /* log to file */ + curl_memlog("LIMIT %s:%d %s reached memlimit\n", + source, line, func); + /* log to stderr also */ fprintf(stderr, "LIMIT %s:%d %s reached memlimit\n", source, line, func); + } SET_ERRNO(ENOMEM); return TRUE; /* RETURN ERROR! */ } @@ -117,9 +120,9 @@ static bool countcheck(const char *func, int line, const char *source) memsize--; /* countdown */ /* log the countdown */ - if(logfile && source) - fprintf(logfile, "LIMIT %s:%d %ld ALLOCS left\n", - source, line, memsize); + if(source) + curl_memlog("LIMIT %s:%d %ld ALLOCS left\n", + source, line, memsize); } @@ -146,9 +149,9 @@ void *curl_domalloc(size_t wantedsize, int line, const char *source) mem->size = wantedsize; } - if(logfile && source) - fprintf(logfile, "MEM %s:%d malloc(%zd) = %p\n", - source, line, wantedsize, mem ? mem->mem : 0); + if(source) + curl_memlog("MEM %s:%d malloc(%zd) = %p\n", + source, line, wantedsize, mem ? mem->mem : 0); return (mem ? mem->mem : NULL); } @@ -175,9 +178,9 @@ void *curl_docalloc(size_t wanted_elements, size_t wanted_size, mem->size = user_size; } - if(logfile && source) - fprintf(logfile, "MEM %s:%d calloc(%zu,%zu) = %p\n", - source, line, wanted_elements, wanted_size, mem ? mem->mem : 0); + if(source) + curl_memlog("MEM %s:%d calloc(%zu,%zu) = %p\n", + source, line, wanted_elements, wanted_size, mem?mem->mem:0); return (mem ? mem->mem : NULL); } @@ -197,9 +200,9 @@ char *curl_dostrdup(const char *str, int line, const char *source) if(mem) memcpy(mem, str, len); - if(logfile) - fprintf(logfile, "MEM %s:%d strdup(%p) (%zu) = %p\n", - source, line, str, len, mem); + if(source) + curl_memlog("MEM %s:%d strdup(%p) (%zu) = %p\n", + source, line, str, len, mem); return mem; } @@ -222,9 +225,9 @@ void *curl_dorealloc(void *ptr, size_t wantedsize, mem = (struct memdebug *)((char *)ptr - offsetof(struct memdebug, mem)); mem = (Curl_crealloc)(mem, size); - if(logfile) - fprintf(logfile, "MEM %s:%d realloc(%p, %zu) = %p\n", - source, line, ptr, wantedsize, mem?mem->mem:NULL); + if(source) + curl_memlog("MEM %s:%d realloc(%p, %zu) = %p\n", + source, line, ptr, wantedsize, mem?mem->mem:NULL); if(mem) { mem->size = wantedsize; @@ -248,17 +251,17 @@ void curl_dofree(void *ptr, int line, const char *source) /* free for real */ (Curl_cfree)(mem); - if(logfile) - fprintf(logfile, "MEM %s:%d free(%p)\n", source, line, ptr); + if(source) + curl_memlog("MEM %s:%d free(%p)\n", source, line, ptr); } int curl_socket(int domain, int type, int protocol, int line, const char *source) { int sockfd=socket(domain, type, protocol); - if(logfile && (sockfd!=-1)) - fprintf(logfile, "FD %s:%d socket() = %d\n", - source, line, sockfd); + if(source && (sockfd!=-1)) + curl_memlog("FD %s:%d socket() = %d\n", + source, line, sockfd); return sockfd; } @@ -268,18 +271,18 @@ int curl_accept(int s, void *saddr, void *saddrlen, struct sockaddr *addr = (struct sockaddr *)saddr; curl_socklen_t *addrlen = (curl_socklen_t *)saddrlen; int sockfd=accept(s, addr, addrlen); - if(logfile) - fprintf(logfile, "FD %s:%d accept() = %d\n", - source, line, sockfd); + if(source) + curl_memlog("FD %s:%d accept() = %d\n", + source, line, sockfd); return sockfd; } /* separate function to allow libcurl to mark a "faked" close */ void curl_mark_sclose(int sockfd, int line, const char *source) { - if(logfile) - fprintf(logfile, "FD %s:%d sclose(%d)\n", - source, line, sockfd); + if(source) + curl_memlog("FD %s:%d sclose(%d)\n", + source, line, sockfd); } /* this is our own defined way to close sockets on *ALL* platforms */ @@ -294,9 +297,9 @@ FILE *curl_fopen(const char *file, const char *mode, int line, const char *source) { FILE *res=fopen(file, mode); - if(logfile) - fprintf(logfile, "FILE %s:%d fopen(\"%s\",\"%s\") = %p\n", - source, line, file, mode, res); + if(source) + curl_memlog("FILE %s:%d fopen(\"%s\",\"%s\") = %p\n", + source, line, file, mode, res); return res; } @@ -305,9 +308,9 @@ FILE *curl_fdopen(int filedes, const char *mode, int line, const char *source) { FILE *res=fdopen(filedes, mode); - if(logfile) - fprintf(logfile, "FILE %s:%d fdopen(\"%d\",\"%s\") = %p\n", - source, line, filedes, mode, res); + if(source) + curl_memlog("FILE %s:%d fdopen(\"%d\",\"%s\") = %p\n", + source, line, filedes, mode, res); return res; } #endif @@ -319,9 +322,39 @@ int curl_fclose(FILE *file, int line, const char *source) assert(file != NULL); res=fclose(file); - if(logfile) - fprintf(logfile, "FILE %s:%d fclose(%p)\n", - source, line, file); + if(source) + curl_memlog("FILE %s:%d fclose(%p)\n", + source, line, file); return res; } + +#define LOGLINE_BUFSIZE 1024 + +/* this does the writting to the memory tracking log file */ +void curl_memlog(const char *format, ...) +{ + char *buf; + int nchars; + va_list ap; + + if(!logfile) + return; + + buf = (Curl_cmalloc)(LOGLINE_BUFSIZE); + if(!buf) + return; + + va_start(ap, format); + nchars = vsnprintf(buf, LOGLINE_BUFSIZE, format, ap); + va_end(ap); + + if(nchars > LOGLINE_BUFSIZE - 1) + nchars = LOGLINE_BUFSIZE - 1; + + if(nchars > 0) + fwrite(buf, 1, nchars, logfile); + + (Curl_cfree)(buf); +} + #endif /* CURLDEBUG */ diff --git a/lib/memdebug.h b/lib/memdebug.h index ed1177b59..417d1f429 100644 --- a/lib/memdebug.h +++ b/lib/memdebug.h @@ -54,6 +54,7 @@ CURL_EXTERN void curl_dofree(void *ptr, int line, const char *source); CURL_EXTERN char *curl_dostrdup(const char *str, int line, const char *source); CURL_EXTERN void curl_memdebug(const char *logname); CURL_EXTERN void curl_memlimit(long limit); +CURL_EXTERN void curl_memlog(const char *format, ...); /* file descriptor manipulators */ CURL_EXTERN int curl_socket(int domain, int type, int protocol, int line , const char *); diff --git a/src/writeenv.c b/src/writeenv.c index b432de69e..6ee0e948c 100644 --- a/src/writeenv.c +++ b/src/writeenv.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2010, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -35,6 +35,10 @@ #define _MPRINTF_REPLACE /* use our functions only */ #include +#if defined(CURLDEBUG) && defined(CURLTOOLDEBUG) +#include "memdebug.h" +#endif + static const struct { const char * name; @@ -69,9 +73,7 @@ static void internalSetEnv(const char * name, char * value) #ifdef __riscos__ _kernel_setenv(name, value); #elif defined (CURLDEBUG) - extern FILE *curl_debuglogfile; - if (curl_debuglogfile) - fprintf (curl_debuglogfile, "ENV %s = %s\n", name, value); + curl_memlog("ENV %s = %s\n", name, value); #endif return; } -- cgit v1.2.3