[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [libmicrohttpd] Memory leak?
From: |
Erik Slagter |
Subject: |
Re: [libmicrohttpd] Memory leak? |
Date: |
Sun, 31 Oct 2010 12:00:20 +0100 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.9) Gecko/20100921 Fedora/3.1.4-1.fc13 Mnenhy/0.8.3 Thunderbird/3.1.4 ThunderBrowse/3.3.2 |
Other than that, even after a look at the code I cannot explain what you're
experiencing (a testcase would be very welcome...).
With r13472 (today) I am having the same issue. Here follow some code
excerpts. Sorry for the lousy layout due to mail formatting.
I hope this makes sense.
/* start function */
/* ... */
daemon = MHD_start_daemon(MHD_USE_THREAD_PER_CONNECTION | MHD_USE_IPv6
| MHD_USE_DEBUG,
tcp_port, 0, 0, &HttpServer::access_handler_callback, this,
MHD_OPTION_NOTIFY_COMPLETED,
&HttpServer::callback_request_completed, this,
MHD_OPTION_END);
/* ... */
/* access handler callback */
int HttpServer::access_handler_callback(void * void_http_server,
struct MHD_Connection * connection,
const char * url, const char * method,
const char * version,
const char * upload_data, size_t * upload_data_size,
void ** con_cls)
{
HttpServer * http_server = (HttpServer *)void_http_server;
if(*con_cls == 0)
{
ConnectionData * ncd = new(ConnectionData);
ncd->callback_count = 0;
ncd->postprocessor =
MHD_create_post_processor(connection, 1024,
callback_postdata_iterator, ncd);
ncd->magic = ConnectionData::connection_data_magic;
*con_cls = (void *)ncd;
fprintf(stderr, "*** new ConnectionData, con_cls = %p,"
"*con_cls = %p\n", con_cls, *con_cls);
}
else
{
(**(ConnectionData **)con_cls).callback_count++;
fprintf(stderr, "*** update ConnectionData, con_cls ="
" %p, *con_cls = %p, count = %d\n",
con_cls, *con_cls,
(**(ConnectionData **)con_cls).callback_count);
}
/* ... */
/* request completed callback */
void * HttpServer::callback_request_completed(void * cls,
void ** con_cls, struct MHD_Connection *,
enum MHD_RequestTerminationCode)
{
fprintf(stderr, "*** callback_request_completed\n");
fprintf(stderr, "*** cls = %p, con_cls = %p, *con_cls = %p\n",
cls, con_cls, con_cls ? *con_cls : con_cls);
if(con_cls && *con_cls)
{
ConnectionData * cdp = (ConnectionData *)*con_cls;
if(cdp->magic == ConnectionData::connection_data_magic)
{
if(cdp->postprocessor)
{
MHD_destroy_post_processor
(cdp->postprocessor);
cdp->postprocessor = 0;
}
fprintf(stderr, "*** delete ConnectionData\n");
delete(cdp);
}
else
vlog("HttpServer::callback_request_compled: invalid magic number in
ConnectionData\n");
*con_cls = 0;
}
return(0);
}
/* output */
*** new ConnectionData, con_cls = 0x7f0eac0008e8, *con_cls = 0x7f0ea4008900
*** update ConnectionData, con_cls = 0x7f0eac0008e8, *con_cls =
0x7f0ea4008900, count = 1
*** update ConnectionData, con_cls = 0x7f0eac0008e8, *con_cls =
0x7f0ea4008900, count = 2
*** callback_request_completed
*** cls = 0x136fc00, con_cls = 0x7f0eac0008c0, *con_cls = (nil)
*** new ConnectionData, con_cls = 0x7f0eac0008e8, *con_cls = 0x7f0ea4008f40
*** update ConnectionData, con_cls = 0x7f0eac0008e8, *con_cls =
0x7f0ea4008f40, count = 1
*** update ConnectionData, con_cls = 0x7f0eac0008e8, *con_cls =
0x7f0ea4008f40, count = 2
*** callback_request_completed
*** cls = 0x136fc00, con_cls = 0x7f0eac0008c0, *con_cls = (nil)
smime.p7s
Description: S/MIME Cryptographic Signature