More valgrind cleanup (local nets).
This patch adds code to cleanup local nets and changes a few of memory cleanup messages.
This commit is contained in:
parent
d098db0a06
commit
c7d05eefb4
|
|
@ -953,8 +953,8 @@ void signal_pool_delete()
|
||||||
{
|
{
|
||||||
if (RUNNING_ON_VALGRIND && (signal_count != signal_dels)) {
|
if (RUNNING_ON_VALGRIND && (signal_count != signal_dels)) {
|
||||||
fflush(NULL);
|
fflush(NULL);
|
||||||
VALGRIND_PRINTF("Error: vvp missed deleting %lu signal(s).",
|
VALGRIND_PRINTF("Error: vvp missed deleting %ld of %lu signal(s).",
|
||||||
signal_count - signal_dels);
|
(long) signal_count - signal_dels, signal_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned idx = 0; idx < signal_pool_count; idx += 1) {
|
for (unsigned idx = 0; idx < signal_pool_count; idx += 1) {
|
||||||
|
|
|
||||||
|
|
@ -55,4 +55,6 @@ extern void exec_ufunc_delete(vvp_code_t euf_code);
|
||||||
extern void vthreads_delete(vthread_t base);
|
extern void vthreads_delete(vthread_t base);
|
||||||
extern void vvp_net_delete(vvp_net_t *item);
|
extern void vvp_net_delete(vvp_net_t *item);
|
||||||
|
|
||||||
|
extern void pool_local_net(vvp_net_t *net);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,16 @@ void* vvp_net_t::operator new (size_t size)
|
||||||
#ifdef CHECK_WITH_VALGRIND
|
#ifdef CHECK_WITH_VALGRIND
|
||||||
static map<vvp_net_t*, bool> vvp_net_map;
|
static map<vvp_net_t*, bool> vvp_net_map;
|
||||||
static map<sfunc_core*, bool> sfunc_map;
|
static map<sfunc_core*, bool> sfunc_map;
|
||||||
|
static vvp_net_t **local_net_pool = 0;
|
||||||
|
static unsigned local_net_pool_count = 0;
|
||||||
|
|
||||||
|
void pool_local_net(vvp_net_t*net)
|
||||||
|
{
|
||||||
|
local_net_pool_count += 1;
|
||||||
|
local_net_pool = (vvp_net_t **) realloc(local_net_pool,
|
||||||
|
local_net_pool_count*sizeof(vvp_net_t **));
|
||||||
|
local_net_pool[local_net_pool_count-1] = net;
|
||||||
|
}
|
||||||
|
|
||||||
void vvp_net_delete(vvp_net_t *item)
|
void vvp_net_delete(vvp_net_t *item)
|
||||||
{
|
{
|
||||||
|
|
@ -97,21 +107,31 @@ void vvp_net_pool_delete()
|
||||||
{
|
{
|
||||||
unsigned long vvp_nets_del = 0;
|
unsigned long vvp_nets_del = 0;
|
||||||
|
|
||||||
|
for (unsigned idx = 0; idx < local_net_pool_count; idx += 1) {
|
||||||
|
vvp_net_delete(local_net_pool[idx]);
|
||||||
|
}
|
||||||
|
free(local_net_pool);
|
||||||
|
local_net_pool = 0;
|
||||||
|
local_net_pool_count = 0;
|
||||||
|
|
||||||
map<vvp_net_t*, bool>::iterator iter;
|
map<vvp_net_t*, bool>::iterator iter;
|
||||||
for (iter = vvp_net_map.begin(); iter != vvp_net_map.end(); iter++) {
|
for (iter = vvp_net_map.begin(); iter != vvp_net_map.end(); iter++) {
|
||||||
vvp_nets_del += 1;
|
vvp_nets_del += 1;
|
||||||
VALGRIND_MEMPOOL_FREE(iter->first->pool, iter->first);
|
VALGRIND_MEMPOOL_FREE(iter->first->pool, iter->first);
|
||||||
}
|
}
|
||||||
|
vvp_net_map.clear();
|
||||||
|
|
||||||
map<sfunc_core*, bool>::iterator siter;
|
map<sfunc_core*, bool>::iterator siter;
|
||||||
for (siter = sfunc_map.begin(); siter != sfunc_map.end(); siter++) {
|
for (siter = sfunc_map.begin(); siter != sfunc_map.end(); siter++) {
|
||||||
delete siter->first;
|
delete siter->first;
|
||||||
}
|
}
|
||||||
|
sfunc_map.clear();
|
||||||
|
|
||||||
if (RUNNING_ON_VALGRIND && (vvp_nets_del != count_vvp_nets)) {
|
if (RUNNING_ON_VALGRIND && (vvp_nets_del != count_vvp_nets)) {
|
||||||
fflush(NULL);
|
fflush(NULL);
|
||||||
VALGRIND_PRINTF("Error: vvp missed deleting %lu net(s).",
|
VALGRIND_PRINTF("Error: vvp missed deleting %ld of %lu net(s).",
|
||||||
count_vvp_nets - vvp_nets_del);
|
(long) count_vvp_nets - vvp_nets_del,
|
||||||
|
count_vvp_nets);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned idx = 0; idx < vvp_net_pool_count; idx += 1) {
|
for (unsigned idx = 0; idx < vvp_net_pool_count; idx += 1) {
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,9 @@
|
||||||
# include "vvp_net_sig.h"
|
# include "vvp_net_sig.h"
|
||||||
# include "logic.h"
|
# include "logic.h"
|
||||||
# include "schedule.h"
|
# include "schedule.h"
|
||||||
|
#ifdef CHECK_WITH_VALGRIND
|
||||||
|
# include "vvp_cleanup.h"
|
||||||
|
#endif
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
# include <stdlib.h>
|
# include <stdlib.h>
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
|
|
@ -261,6 +264,9 @@ static void __compile_net2(vvp_net_t*node, vvp_array_t array,
|
||||||
/* This attaches the label to the vpiHandle */
|
/* This attaches the label to the vpiHandle */
|
||||||
compile_vpi_symbol(my_label, obj);
|
compile_vpi_symbol(my_label, obj);
|
||||||
}
|
}
|
||||||
|
#ifdef CHECK_WITH_VALGRIND
|
||||||
|
else pool_local_net(node);
|
||||||
|
#endif
|
||||||
|
|
||||||
// REMOVE ME! Giving the net a label is a legacy of the times
|
// REMOVE ME! Giving the net a label is a legacy of the times
|
||||||
// when the .net was a functor of its own. In the long run, we
|
// when the .net was a functor of its own. In the long run, we
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue