mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
MemoryTracking: fix logging of free() calls done where Curl_safefree is called
Just internal stuff... Curl_safefree is now a macro defined in memdebug.h instead of a function prototyped in url.h and implemented in url.c, so inclusion of url.h is no longer required in order to simply use Curl_safefree. Provide definition of macro WHILE_FALSE in setup_once.h in order to allow other macros such as DEBUGF and DEBUGASSERT, and code using it, to compile without 'conditional expression is constant' warnings. The WHILE_FALSE stuff fixes 150+ MSVC compiler warnings.
This commit is contained in:
parent
749dbfbc87
commit
9194e17003
@ -1,6 +1,6 @@
|
|||||||
#ifdef CURLDEBUG
|
|
||||||
#ifndef HEADER_CURL_MEMDEBUG_H
|
#ifndef HEADER_CURL_MEMDEBUG_H
|
||||||
#define HEADER_CURL_MEMDEBUG_H
|
#define HEADER_CURL_MEMDEBUG_H
|
||||||
|
#ifdef CURLDEBUG
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
* _ _ ____ _
|
* _ _ ____ _
|
||||||
* Project ___| | | | _ \| |
|
* Project ___| | | | _ \| |
|
||||||
@ -139,9 +139,21 @@ CURL_EXTERN int curl_fclose(FILE *file, int line, const char *source);
|
|||||||
|
|
||||||
#endif /* MEMDEBUG_NODEFINES */
|
#endif /* MEMDEBUG_NODEFINES */
|
||||||
|
|
||||||
#endif /* HEADER_CURL_MEMDEBUG_H */
|
|
||||||
#endif /* CURLDEBUG */
|
#endif /* CURLDEBUG */
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Following section applies even when CURLDEBUG is not defined.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef fake_sclose
|
#ifndef fake_sclose
|
||||||
#define fake_sclose(x)
|
#define fake_sclose(x) do { } WHILE_FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Curl_safefree defined as a macro to allow MemoryTracking feature
|
||||||
|
* to log free() calls at same location where Curl_safefree is used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define Curl_safefree(ptr) do {if((ptr)) free((ptr));} WHILE_FALSE
|
||||||
|
|
||||||
|
#endif /* HEADER_CURL_MEMDEBUG_H */
|
||||||
|
@ -103,7 +103,7 @@ static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|||||||
done++; \
|
done++; \
|
||||||
else \
|
else \
|
||||||
return done; /* return immediately on failure */ \
|
return done; /* return immediately on failure */ \
|
||||||
} while(0)
|
} WHILE_FALSE
|
||||||
|
|
||||||
/* Data type to read from the arglist */
|
/* Data type to read from the arglist */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -952,8 +952,8 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
|
|||||||
data = easy->easy_handle;
|
data = easy->easy_handle;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/* this is a do-while loop just to allow a break to skip to the end
|
/* this is a single-iteration do-while loop just to allow a
|
||||||
of it */
|
break to skip to the end of it */
|
||||||
bool disconnect_conn = FALSE;
|
bool disconnect_conn = FALSE;
|
||||||
|
|
||||||
/* Handle the case when the pipe breaks, i.e., the connection
|
/* Handle the case when the pipe breaks, i.e., the connection
|
||||||
@ -1657,7 +1657,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
|
|||||||
else if(easy->easy_conn && Curl_pgrsUpdate(easy->easy_conn))
|
else if(easy->easy_conn && Curl_pgrsUpdate(easy->easy_conn))
|
||||||
easy->result = CURLE_ABORTED_BY_CALLBACK;
|
easy->result = CURLE_ABORTED_BY_CALLBACK;
|
||||||
}
|
}
|
||||||
} while(0);
|
} WHILE_FALSE; /* just to break out from! */
|
||||||
|
|
||||||
if(CURLM_STATE_COMPLETED == easy->state) {
|
if(CURLM_STATE_COMPLETED == easy->state) {
|
||||||
if(data->dns.hostcachetype == HCACHE_MULTI) {
|
if(data->dns.hostcachetype == HCACHE_MULTI) {
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
/* Winsock and TPF sockets are not in range [0..FD_SETSIZE-1] */
|
/* Winsock and TPF sockets are not in range [0..FD_SETSIZE-1] */
|
||||||
|
|
||||||
#if defined(USE_WINSOCK) || defined(TPF)
|
#if defined(USE_WINSOCK) || defined(TPF)
|
||||||
#define VERIFY_SOCK(x) do { } while(0)
|
#define VERIFY_SOCK(x) do { } WHILE_FALSE
|
||||||
#else
|
#else
|
||||||
#define VALID_SOCK(s) (((s) >= 0) && ((s) < FD_SETSIZE))
|
#define VALID_SOCK(s) (((s) >= 0) && ((s) < FD_SETSIZE))
|
||||||
#define VERIFY_SOCK(x) do { \
|
#define VERIFY_SOCK(x) do { \
|
||||||
@ -57,7 +57,7 @@
|
|||||||
SET_SOCKERRNO(EINVAL); \
|
SET_SOCKERRNO(EINVAL); \
|
||||||
return -1; \
|
return -1; \
|
||||||
} \
|
} \
|
||||||
} while(0)
|
} WHILE_FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Convenience local macros */
|
/* Convenience local macros */
|
||||||
|
@ -302,6 +302,27 @@ struct timeval {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macro WHILE_FALSE may be used to build single-iteration do-while loops,
|
||||||
|
* avoiding compiler warnings. Mostly intended for other macro definitions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define WHILE_FALSE while(0)
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && !defined(__POCC__)
|
||||||
|
# undef WHILE_FALSE
|
||||||
|
# if (_MSC_VER < 1500)
|
||||||
|
# define WHILE_FALSE while(1, 0)
|
||||||
|
# else
|
||||||
|
# define WHILE_FALSE \
|
||||||
|
__pragma(warning(push)) \
|
||||||
|
__pragma(warning(disable:4127)) \
|
||||||
|
while(0) \
|
||||||
|
__pragma(warning(pop))
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type.
|
* Typedef to 'int' if sig_atomic_t is not an available 'typedefed' type.
|
||||||
*/
|
*/
|
||||||
@ -339,7 +360,7 @@ typedef int sig_atomic_t;
|
|||||||
#ifdef DEBUGBUILD
|
#ifdef DEBUGBUILD
|
||||||
#define DEBUGF(x) x
|
#define DEBUGF(x) x
|
||||||
#else
|
#else
|
||||||
#define DEBUGF(x) do { } while (0)
|
#define DEBUGF(x) do { } WHILE_FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -350,7 +371,7 @@ typedef int sig_atomic_t;
|
|||||||
#if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H)
|
#if defined(DEBUGBUILD) && defined(HAVE_ASSERT_H)
|
||||||
#define DEBUGASSERT(x) assert(x)
|
#define DEBUGASSERT(x) assert(x)
|
||||||
#else
|
#else
|
||||||
#define DEBUGASSERT(x) do { } while (0)
|
#define DEBUGASSERT(x) do { } WHILE_FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -800,6 +800,9 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
|
|||||||
/*
|
/*
|
||||||
* We loop here to do the READ and SEND loop until we run out of
|
* We loop here to do the READ and SEND loop until we run out of
|
||||||
* data to send or until we get EWOULDBLOCK back
|
* data to send or until we get EWOULDBLOCK back
|
||||||
|
*
|
||||||
|
* FIXME: above comment is misleading. Currently no looping is
|
||||||
|
* actually done in do-while loop below.
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
|
|
||||||
@ -971,7 +974,7 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
|
|||||||
|
|
||||||
Curl_pgrsSetUploadCounter(data, k->writebytecount);
|
Curl_pgrsSetUploadCounter(data, k->writebytecount);
|
||||||
|
|
||||||
} while(0); /* just to break out from! */
|
} WHILE_FALSE; /* just to break out from! */
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
@ -252,12 +252,6 @@ static const struct Curl_handler Curl_handler_dummy = {
|
|||||||
PROTOPT_NONE /* flags */
|
PROTOPT_NONE /* flags */
|
||||||
};
|
};
|
||||||
|
|
||||||
void Curl_safefree(void *ptr)
|
|
||||||
{
|
|
||||||
if(ptr)
|
|
||||||
free(ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void close_connections(struct SessionHandle *data)
|
static void close_connections(struct SessionHandle *data)
|
||||||
{
|
{
|
||||||
/* Loop through all open connections and kill them one by one */
|
/* Loop through all open connections and kill them one by one */
|
||||||
|
@ -42,7 +42,6 @@ CURLcode Curl_disconnect(struct connectdata *, bool dead_connection);
|
|||||||
CURLcode Curl_protocol_connect(struct connectdata *conn, bool *done);
|
CURLcode Curl_protocol_connect(struct connectdata *conn, bool *done);
|
||||||
CURLcode Curl_protocol_connecting(struct connectdata *conn, bool *done);
|
CURLcode Curl_protocol_connecting(struct connectdata *conn, bool *done);
|
||||||
CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done);
|
CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done);
|
||||||
void Curl_safefree(void *ptr);
|
|
||||||
CURLcode Curl_setup_conn(struct connectdata *conn,
|
CURLcode Curl_setup_conn(struct connectdata *conn,
|
||||||
bool *protocol_done);
|
bool *protocol_done);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user