]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
Constantine Sapuntzakis enhancements to make memory tracking log file writing
authorYang Tse <yangsita@gmail.com>
Mon, 18 Jan 2010 20:22:04 +0000 (20:22 +0000)
committerYang Tse <yangsita@gmail.com>
Mon, 18 Jan 2010 20:22:04 +0000 (20:22 +0000)
of messages atomic, on systems where an fwrite of a memory buffer is atomic.

lib/curl_addrinfo.c
lib/hostip6.c
lib/memdebug.c
lib/memdebug.h
src/writeenv.c

index a5d26165c8ae4281d15657fa9148d47a497029b1..07dc1e7f0124a36667f7c6e705296ec7d02ae486 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, 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) */
index a5bc55ce043d346f78e81e3fe543ddde9bcc18ca..518133365566d955f82dbf1e51da50cea2359a25 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, 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) */
index 37921fd763efebacd09f0d0c35e2d0f098338719..6261749fbf04bec78967cd45261a575104c5cbbd 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, 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 <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stdarg.h>
 
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
@@ -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 */
index ed1177b59c00763d55647581f74518ddf54bb937..417d1f429bf9a51d9e9789768c961a927f20a343 100644 (file)
@@ -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 *);
index b432de69ef7078da00d8da8395b4ae04d626c67a..6ee0e948ccd5ad73a07dcc373c6d832dbde8413e 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
 #define _MPRINTF_REPLACE /* use our functions only */
 #include <curl/mprintf.h>
 
+#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;
 }