Fix memory leak in vpi_put_value.
Certain paths through vpi_put_value cause a vpip_put_value_event to be created with no path for deleting in. Add the capability in the schedule_generic method, so that it can be delete as soon as it is executed.
This commit is contained in:
parent
185860a4f1
commit
8c07d3b51c
|
|
@ -259,7 +259,7 @@ unsigned long count_assign_aword_pool(void) { return array_w_heap.pool; }
|
||||||
|
|
||||||
struct generic_event_s : public event_s {
|
struct generic_event_s : public event_s {
|
||||||
vvp_gen_event_t obj;
|
vvp_gen_event_t obj;
|
||||||
unsigned char val;
|
bool delete_obj_when_done;
|
||||||
void run_run(void);
|
void run_run(void);
|
||||||
|
|
||||||
static void* operator new(size_t);
|
static void* operator new(size_t);
|
||||||
|
|
@ -269,8 +269,11 @@ struct generic_event_s : public event_s {
|
||||||
void generic_event_s::run_run(void)
|
void generic_event_s::run_run(void)
|
||||||
{
|
{
|
||||||
count_gen_events += 1;
|
count_gen_events += 1;
|
||||||
if (obj)
|
if (obj) {
|
||||||
obj->run_run();
|
obj->run_run();
|
||||||
|
if (delete_obj_when_done)
|
||||||
|
delete obj;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const size_t GENERIC_CHUNK_COUNT = 131072 / sizeof(struct generic_event_s);
|
static const size_t GENERIC_CHUNK_COUNT = 131072 / sizeof(struct generic_event_s);
|
||||||
|
|
@ -660,13 +663,12 @@ void schedule_del_thr(vthread_t thr)
|
||||||
}
|
}
|
||||||
|
|
||||||
void schedule_generic(vvp_gen_event_t obj, vvp_time64_t delay,
|
void schedule_generic(vvp_gen_event_t obj, vvp_time64_t delay,
|
||||||
bool sync_flag, bool ro_flag)
|
bool sync_flag, bool ro_flag, bool delete_when_done)
|
||||||
{
|
{
|
||||||
struct generic_event_s*cur = new generic_event_s;
|
struct generic_event_s*cur = new generic_event_s;
|
||||||
|
|
||||||
cur->obj = obj;
|
cur->obj = obj;
|
||||||
cur->val = 0;
|
cur->delete_obj_when_done = delete_when_done;
|
||||||
|
|
||||||
schedule_event_(cur, delay,
|
schedule_event_(cur, delay,
|
||||||
sync_flag? (ro_flag?SEQ_ROSYNC:SEQ_RWSYNC) : SEQ_ACTIVE);
|
sync_flag? (ro_flag?SEQ_ROSYNC:SEQ_RWSYNC) : SEQ_ACTIVE);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,8 @@ extern void schedule_init_vector(vvp_net_ptr_t ptr, double val);
|
||||||
typedef struct vvp_gen_event_s *vvp_gen_event_t;
|
typedef struct vvp_gen_event_s *vvp_gen_event_t;
|
||||||
|
|
||||||
extern void schedule_generic(vvp_gen_event_t obj, vvp_time64_t delay,
|
extern void schedule_generic(vvp_gen_event_t obj, vvp_time64_t delay,
|
||||||
bool sync_flag, bool ro_flag =true);
|
bool sync_flag, bool ro_flag =true,
|
||||||
|
bool delete_obj_when_done =false);
|
||||||
|
|
||||||
/* Use this is schedule thread deletion (after rosync). */
|
/* Use this is schedule thread deletion (after rosync). */
|
||||||
extern void schedule_del_thr(vthread_t thr);
|
extern void schedule_del_thr(vthread_t thr);
|
||||||
|
|
|
||||||
|
|
@ -753,7 +753,7 @@ vpiHandle vpi_put_value(vpiHandle obj, s_vpi_value*vp,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
put->flags = flags;
|
put->flags = flags;
|
||||||
schedule_generic(put, dly, false);
|
schedule_generic(put, dly, false, true, true);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue