extended statusall output
added job/event-queue statistics added allocation statistics when using LEAK_DETECTIVE
This commit is contained in:
@@ -39,6 +39,7 @@
|
|||||||
#include <crypto/x509.h>
|
#include <crypto/x509.h>
|
||||||
#include <queues/jobs/initiate_job.h>
|
#include <queues/jobs/initiate_job.h>
|
||||||
#include <queues/jobs/route_job.h>
|
#include <queues/jobs/route_job.h>
|
||||||
|
#include <utils/leak_detective.h>
|
||||||
|
|
||||||
#define IKE_PORT 500
|
#define IKE_PORT 500
|
||||||
#define PATH_BUF 256
|
#define PATH_BUF 256
|
||||||
@@ -384,7 +385,8 @@ static void stroke_add_conn(private_stroke_t *this, stroke_msg_t *msg)
|
|||||||
proposal = proposal_create_from_string(PROTO_IKE, proposal_string);
|
proposal = proposal_create_from_string(PROTO_IKE, proposal_string);
|
||||||
if (proposal == NULL)
|
if (proposal == NULL)
|
||||||
{
|
{
|
||||||
this->logger->log(this->logger, ERROR, "invalid IKE proposal string: %s", msg->add_conn.algorithms.esp);
|
this->logger->log(this->logger, ERROR,
|
||||||
|
"invalid IKE proposal string: %s", proposal_string);
|
||||||
my_id->destroy(my_id);
|
my_id->destroy(my_id);
|
||||||
other_id->destroy(other_id);
|
other_id->destroy(other_id);
|
||||||
my_ts->destroy(my_ts);
|
my_ts->destroy(my_ts);
|
||||||
@@ -433,7 +435,7 @@ static void stroke_add_conn(private_stroke_t *this, stroke_msg_t *msg)
|
|||||||
if (proposal == NULL)
|
if (proposal == NULL)
|
||||||
{
|
{
|
||||||
this->logger->log(this->logger, ERROR,
|
this->logger->log(this->logger, ERROR,
|
||||||
"invalid ESP proposal string: %s", msg->add_conn.algorithms.esp);
|
"invalid ESP proposal string: %s", proposal_string);
|
||||||
policy->destroy(policy);
|
policy->destroy(policy);
|
||||||
connection->destroy(connection);
|
connection->destroy(connection);
|
||||||
return;
|
return;
|
||||||
@@ -615,14 +617,22 @@ static void stroke_status(private_stroke_t *this, stroke_msg_t *msg)
|
|||||||
linked_list_t *list;
|
linked_list_t *list;
|
||||||
host_t *host;
|
host_t *host;
|
||||||
|
|
||||||
|
leak_detective_status(this->stroke_logger);
|
||||||
|
|
||||||
|
this->stroke_logger->log(this->stroke_logger, CONTROL|LEVEL1,
|
||||||
|
"job queue load: %d",
|
||||||
|
charon->job_queue->get_count(charon->job_queue));
|
||||||
|
this->stroke_logger->log(this->stroke_logger, CONTROL|LEVEL1,
|
||||||
|
"scheduled events: %d",
|
||||||
|
charon->event_queue->get_count(charon->event_queue));
|
||||||
list = charon->socket->create_local_address_list(charon->socket);
|
list = charon->socket->create_local_address_list(charon->socket);
|
||||||
this->logger->log(this->logger, CONTROL|LEVEL1,
|
this->stroke_logger->log(this->stroke_logger, CONTROL|LEVEL1,
|
||||||
"listening on %d addresses:",
|
"listening on %d addresses:",
|
||||||
list->get_count(list));
|
list->get_count(list));
|
||||||
while (list->remove_first(list, (void**)&host) == SUCCESS)
|
while (list->remove_first(list, (void**)&host) == SUCCESS)
|
||||||
{
|
{
|
||||||
this->logger->log(this->logger, CONTROL|LEVEL1,
|
this->stroke_logger->log(this->stroke_logger, CONTROL|LEVEL1,
|
||||||
" %s", host->get_string(host));
|
" %s", host->get_string(host));
|
||||||
host->destroy(host);
|
host->destroy(host);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -632,8 +642,10 @@ static void stroke_status(private_stroke_t *this, stroke_msg_t *msg)
|
|||||||
{
|
{
|
||||||
pop_string(msg, &(msg->status.name));
|
pop_string(msg, &(msg->status.name));
|
||||||
}
|
}
|
||||||
charon->connections->log_connections(charon->connections, this->stroke_logger, msg->status.name);
|
charon->connections->log_connections(charon->connections,
|
||||||
charon->ike_sa_manager->log_status(charon->ike_sa_manager, this->stroke_logger, msg->status.name);
|
this->stroke_logger, msg->status.name);
|
||||||
|
charon->ike_sa_manager->log_status(charon->ike_sa_manager,
|
||||||
|
this->stroke_logger, msg->status.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -37,7 +37,6 @@
|
|||||||
#include "leak_detective.h"
|
#include "leak_detective.h"
|
||||||
|
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include <utils/logger_manager.h>
|
|
||||||
|
|
||||||
#ifdef LEAK_DETECTIVE
|
#ifdef LEAK_DETECTIVE
|
||||||
|
|
||||||
@@ -62,7 +61,10 @@ static void uninstall_hooks(void);
|
|||||||
static void *malloc_hook(size_t, const void *);
|
static void *malloc_hook(size_t, const void *);
|
||||||
static void *realloc_hook(void *, size_t, const void *);
|
static void *realloc_hook(void *, size_t, const void *);
|
||||||
static void free_hook(void*, const void *);
|
static void free_hook(void*, const void *);
|
||||||
static void load_excluded_functions();
|
|
||||||
|
static u_int count_malloc = 0;
|
||||||
|
static u_int count_free = 0;
|
||||||
|
static u_int count_realloc = 0;
|
||||||
|
|
||||||
typedef struct memory_header_t memory_header_t;
|
typedef struct memory_header_t memory_header_t;
|
||||||
|
|
||||||
@@ -269,6 +271,7 @@ void *malloc_hook(size_t bytes, const void *caller)
|
|||||||
memory_header_t *hdr;
|
memory_header_t *hdr;
|
||||||
|
|
||||||
pthread_mutex_lock(&mutex);
|
pthread_mutex_lock(&mutex);
|
||||||
|
count_malloc++;
|
||||||
uninstall_hooks();
|
uninstall_hooks();
|
||||||
hdr = malloc(bytes + sizeof(memory_header_t));
|
hdr = malloc(bytes + sizeof(memory_header_t));
|
||||||
/* set to something which causes crashes */
|
/* set to something which causes crashes */
|
||||||
@@ -307,6 +310,7 @@ void free_hook(void *ptr, const void *caller)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&mutex);
|
pthread_mutex_lock(&mutex);
|
||||||
|
count_free++;
|
||||||
uninstall_hooks();
|
uninstall_hooks();
|
||||||
if (hdr->magic != MEMORY_HEADER_MAGIC)
|
if (hdr->magic != MEMORY_HEADER_MAGIC)
|
||||||
{
|
{
|
||||||
@@ -352,6 +356,7 @@ void *realloc_hook(void *old, size_t bytes, const void *caller)
|
|||||||
hdr = old - sizeof(memory_header_t);
|
hdr = old - sizeof(memory_header_t);
|
||||||
|
|
||||||
pthread_mutex_lock(&mutex);
|
pthread_mutex_lock(&mutex);
|
||||||
|
count_realloc++;
|
||||||
uninstall_hooks();
|
uninstall_hooks();
|
||||||
if (hdr->magic != MEMORY_HEADER_MAGIC)
|
if (hdr->magic != MEMORY_HEADER_MAGIC)
|
||||||
{
|
{
|
||||||
@@ -399,4 +404,38 @@ void leak_detective_cleanup()
|
|||||||
report_leaks();
|
report_leaks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log memory allocation statistics
|
||||||
|
*/
|
||||||
|
void leak_detective_status(logger_t *logger)
|
||||||
|
{
|
||||||
|
u_int blocks = 0;
|
||||||
|
size_t bytes = 0;
|
||||||
|
memory_header_t *hdr = &first_header;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&mutex);
|
||||||
|
while ((hdr = hdr->next))
|
||||||
|
{
|
||||||
|
blocks++;
|
||||||
|
bytes += hdr->bytes;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&mutex);
|
||||||
|
|
||||||
|
logger->log(logger, CONTROL|LEVEL1, "allocation statistics:");
|
||||||
|
logger->log(logger, CONTROL|LEVEL1, " call stats: malloc: %d, free: %d, realloc: %d",
|
||||||
|
count_malloc, count_free, count_realloc);
|
||||||
|
logger->log(logger, CONTROL|LEVEL1, " allocated %d blocks, total size %d bytes (avg. %d bytes)",
|
||||||
|
blocks, bytes, bytes/blocks);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* !LEAK_DETECTION */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dummy when !using LEAK_DETECTIVE
|
||||||
|
*/
|
||||||
|
void leak_detective_status(logger_t *logger)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* LEAK_DETECTION */
|
#endif /* LEAK_DETECTION */
|
||||||
|
|||||||
@@ -23,6 +23,13 @@
|
|||||||
#define LEAK_DETECTIVE_H_
|
#define LEAK_DETECTIVE_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include <utils/logger_manager.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log status information about allocation
|
||||||
|
*/
|
||||||
|
void leak_detective_status(logger_t *logger);
|
||||||
|
|
||||||
#ifdef LEAK_DETECTIVE
|
#ifdef LEAK_DETECTIVE
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user