vpi_free_object doesnot free callback out from under runtime.

This commit is contained in:
steve 2007-04-10 04:32:05 +00:00
parent fbc731d19e
commit 65baeaed8f
1 changed files with 26 additions and 12 deletions

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#ifdef HAVE_CVS_IDENT #ifdef HAVE_CVS_IDENT
#ident "$Id: vpi_callback.cc,v 1.45 2007/01/16 05:44:16 steve Exp $" #ident "$Id: vpi_callback.cc,v 1.46 2007/04/10 04:32:05 steve Exp $"
#endif #endif
/* /*
@ -39,12 +39,15 @@
#endif #endif
# include <stdlib.h> # include <stdlib.h>
/*
* The vpi_free_object() call to a callback doesn't actually delete
* anything, we instead allow the object to run its course and delete
* itself. The semantics of vpi_free_object for a callback is that it
* deletes the *handle*, and not the object itself, so given the vvp
* implementation, there is nothing to do here.
*/
static int free_simple_callback(vpiHandle ref) static int free_simple_callback(vpiHandle ref)
{ {
assert(ref);
assert(ref->vpi_type);
assert(ref->vpi_type->type_code == vpiCallback);
delete ref;
return 1; return 1;
} }
@ -100,6 +103,14 @@ struct __vpiCallback* new_vpi_callback()
return obj; return obj;
} }
static void delete_vpi_callback(struct __vpiCallback* ref)
{
assert(ref);
assert(ref->base.vpi_type);
assert(ref->base.vpi_type->type_code == vpiCallback);
delete ref;
}
/* /*
* A value change callback is tripped when a bit of a signal * A value change callback is tripped when a bit of a signal
@ -192,7 +203,7 @@ void sync_cb::run_run()
vpi_mode_flag = VPI_MODE_NONE; vpi_mode_flag = VPI_MODE_NONE;
} }
vpi_free_object(&cur->base); delete_vpi_callback(cur);
} }
static struct __vpiCallback* make_sync(p_cb_data data, bool readonly_flag) static struct __vpiCallback* make_sync(p_cb_data data, bool readonly_flag)
@ -287,14 +298,14 @@ void vpiPresim(void) {
cur = EndOfCompile; cur = EndOfCompile;
EndOfCompile = cur->next; EndOfCompile = cur->next;
(cur->cb_data.cb_rtn)(&cur->cb_data); (cur->cb_data.cb_rtn)(&cur->cb_data);
vpi_free_object(&cur->base); delete_vpi_callback(cur);
} }
while (StartOfSimulation) { while (StartOfSimulation) {
cur = StartOfSimulation; cur = StartOfSimulation;
StartOfSimulation = cur->next; StartOfSimulation = cur->next;
(cur->cb_data.cb_rtn)(&cur->cb_data); (cur->cb_data.cb_rtn)(&cur->cb_data);
vpi_free_object(&cur->base); delete_vpi_callback(cur);
} }
vpi_mode_flag = VPI_MODE_NONE; vpi_mode_flag = VPI_MODE_NONE;
@ -313,7 +324,7 @@ void vpiPostsim(void) {
cur = EndOfSimulation; cur = EndOfSimulation;
EndOfSimulation = cur->next; EndOfSimulation = cur->next;
(cur->cb_data.cb_rtn)(&cur->cb_data); (cur->cb_data.cb_rtn)(&cur->cb_data);
vpi_free_object(&cur->base); delete_vpi_callback(cur);
} }
vpi_mode_flag = VPI_MODE_NONE; vpi_mode_flag = VPI_MODE_NONE;
@ -331,7 +342,7 @@ void vpiNextSimTime(void)
cur = NextSimTime; cur = NextSimTime;
NextSimTime = cur->next; NextSimTime = cur->next;
(cur->cb_data.cb_rtn)(&cur->cb_data); (cur->cb_data.cb_rtn)(&cur->cb_data);
vpi_free_object(&cur->base); delete_vpi_callback(cur);
} }
} }
@ -487,13 +498,13 @@ void vvp_vpi_callback::run_vpi_callbacks()
vpi_callbacks_ = next; vpi_callbacks_ = next;
cur->next = 0; cur->next = 0;
vpi_free_object(&cur->base); delete_vpi_callback(cur);
} else { } else {
assert(prev->next == cur); assert(prev->next == cur);
prev->next = next; prev->next = next;
cur->next = 0; cur->next = 0;
vpi_free_object(&cur->base); delete_vpi_callback(cur);
} }
} }
} }
@ -588,6 +599,9 @@ void vvp_fun_signal_real::get_value(struct t_vpi_value*vp)
/* /*
* $Log: vpi_callback.cc,v $ * $Log: vpi_callback.cc,v $
* Revision 1.46 2007/04/10 04:32:05 steve
* vpi_free_object doesnot free callback out from under runtime.
*
* Revision 1.45 2007/01/16 05:44:16 steve * Revision 1.45 2007/01/16 05:44:16 steve
* Major rework of array handling. Memories are replaced with the * Major rework of array handling. Memories are replaced with the
* more general concept of arrays. The NetMemory and NetEMemory * more general concept of arrays. The NetMemory and NetEMemory