diff --git a/vvp/array.cc b/vvp/array.cc index 5fff2c28a..918177259 100644 --- a/vvp/array.cc +++ b/vvp/array.cc @@ -1513,25 +1513,43 @@ void memory_delete(vpiHandle item) if (arr->vals_words) delete [] (arr->vals_words-1); if (arr->vals4) { +// Delete the individual words? +// constant_delete(handle)? delete arr->vals4; -// Delete the individual words. -// constant_delete(handle) } if (arr->valsr) { +// Delete the individual words? +// constant_delete(handle)? delete arr->valsr; -// Delete the individual words. -// constant_delete(handle) } if (arr->nets) { for (unsigned idx = 0; idx < arr->array_count; idx += 1) { + if (struct __vpiSignal*sig = + vpip_signal_from_handle(arr->nets[idx])) { +// Delete the individual words? + constant_delete(sig->id.index); + /* These should only be the real words. */ + } else { + assert(arr->nets[idx]->vpi_type->type_code == + vpiRealVar); + struct __vpiRealVar *sig = (struct __vpiRealVar *) + arr->nets[idx]; + constant_delete(sig->id.index); // Why are only the real words still here? -// Delete the individual words. -// constant_delete(handle) + free(arr->nets[idx]); + } } free(arr->nets); } + + while (arr->vpi_callbacks) { + struct __vpiCallback*tmp = arr->vpi_callbacks->next; + delete_vpi_callback(arr->vpi_callbacks); + arr->vpi_callbacks = tmp; + } + free(arr); } diff --git a/vvp/event.cc b/vvp/event.cc index f1f52c0cf..7bb4aed4d 100644 --- a/vvp/event.cc +++ b/vvp/event.cc @@ -783,6 +783,14 @@ void compile_named_event(char*label, char*name) #ifdef CHECK_WITH_VALGRIND void named_event_delete(struct __vpiHandle*handle) { - free(handle); + struct __vpiNamedEvent *obj = (struct __vpiNamedEvent *) handle; + + while (obj->callbacks) { + struct __vpiCallback*tmp = obj->callbacks->next; + delete_vpi_callback(obj->callbacks); + obj->callbacks = tmp; + } + + free(obj); } #endif diff --git a/vvp/vpi_callback.cc b/vvp/vpi_callback.cc index 90f0f3926..bafc05745 100644 --- a/vvp/vpi_callback.cc +++ b/vvp/vpi_callback.cc @@ -520,7 +520,7 @@ void vvp_vpi_callback::add_vpi_callback(__vpiCallback*cb) void vvp_vpi_callback::clear_all_callbacks() { while (vpi_callbacks_) { - __vpiCallback*tmp = vpi_callbacks_->next; + struct __vpiCallback*tmp = vpi_callbacks_->next; delete_vpi_callback(vpi_callbacks_); vpi_callbacks_ = tmp; } diff --git a/vvp/vpi_real.cc b/vvp/vpi_real.cc index abc058029..25414080b 100644 --- a/vvp/vpi_real.cc +++ b/vvp/vpi_real.cc @@ -226,3 +226,15 @@ vpiHandle vpip_make_real_var(const char*name, vvp_net_t*net) return &obj->base; } + +#ifdef CHECK_WITH_VALGRIND +void real_delete(vpiHandle item) +{ + struct __vpiRealVar*obj = (struct __vpiRealVar*) item; + + vvp_fun_signal_real*fun = (vvp_fun_signal_real*) obj->net->fun; + fun->clear_all_callbacks(); + + free(obj); +} +#endif diff --git a/vvp/vpi_scope.cc b/vvp/vpi_scope.cc index 3aafd2bb9..4a54ace32 100644 --- a/vvp/vpi_scope.cc +++ b/vvp/vpi_scope.cc @@ -65,7 +65,6 @@ static void delete_sub_scopes(struct __vpiScope *scope) vthreads_delete(lscope->threads); delete (scope->intern)[idx]; break; - case vpiIntegerVar: break; case vpiMemory: @@ -75,7 +74,6 @@ static void delete_sub_scopes(struct __vpiScope *scope) /* The destination ModPath is cleaned up later. */ free((scope->intern)[idx]); break; - break; case vpiNamedEvent: named_event_delete((scope->intern)[idx]); break; @@ -87,7 +85,7 @@ static void delete_sub_scopes(struct __vpiScope *scope) parameter_delete((scope->intern)[idx]); break; case vpiRealVar: - free((scope->intern)[idx]); + real_delete((scope->intern)[idx]); break; default: fprintf(stderr, "Need support for type: %d\n", diff --git a/vvp/vvp_cleanup.h b/vvp/vvp_cleanup.h index bd7f21bdd..3de17aef9 100644 --- a/vvp/vvp_cleanup.h +++ b/vvp/vvp_cleanup.h @@ -45,6 +45,7 @@ extern void memory_delete(struct __vpiHandle *item); extern void named_event_delete(struct __vpiHandle *item); extern void parameter_delete(struct __vpiHandle *item); extern void signal_delete(struct __vpiHandle *item); +extern void real_delete(struct __vpiHandle *item); extern void thread_vthr_delete(struct __vpiHandle *item); extern void thread_word_delete(struct __vpiHandle *item); extern void vpi_call_delete(struct __vpiHandle *item);