Browse Source

Reuse memory for queued events.

Patch #109 - 2 provided by Giles Atkinson
pre-master-46
Holger Vogt 4 years ago
parent
commit
9308c6b077
  1. 42
      src/xspice/evt/evtaccept.c
  2. 8
      src/xspice/evt/evtdeque.c

42
src/xspice/evt/evtaccept.c

@ -93,12 +93,29 @@ void EVTaccept(
num_modified = inst_queue->num_modified; num_modified = inst_queue->num_modified;
/* Loop through list of items modified since last time */ /* Loop through list of items modified since last time */
for(i = 0; i < num_modified; i++) { for(i = 0; i < num_modified; i++) {
Evt_Inst_Event_t *stale, *next;
/* Get the index of the inst modified */ /* Get the index of the inst modified */
index = inst_queue->modified_index[i]; index = inst_queue->modified_index[i];
/* Update last_step for this index */
inst_queue->last_step[index] = inst_queue->current[index];
/* Reset the modified flag */ /* Reset the modified flag */
inst_queue->modified[index] = MIF_FALSE; inst_queue->modified[index] = MIF_FALSE;
/* Move stale entries to the free list. */
next = inst_queue->head[index];
while (next) {
if (next->event_time >= time ||
&next->next == inst_queue->current[index]) {
break;
}
stale = next;
next = next->next;
stale->next = inst_queue->free[index];
inst_queue->free[index] = stale;
}
inst_queue->head[index] = next;
if (!next)
inst_queue->current[index] = &inst_queue->head[index];
/* Update last_step for this index */
inst_queue->last_step[index] = inst_queue->current[index];
} }
/* Record the new last_time and reset number modified to zero */ /* Record the new last_time and reset number modified to zero */
inst_queue->last_time = time; inst_queue->last_time = time;
@ -109,12 +126,29 @@ void EVTaccept(
num_modified = output_queue->num_modified; num_modified = output_queue->num_modified;
/* Loop through list of items modified since last time */ /* Loop through list of items modified since last time */
for(i = 0; i < num_modified; i++) { for(i = 0; i < num_modified; i++) {
Evt_Output_Event_t *stale, *next;
/* Get the index of the output modified */ /* Get the index of the output modified */
index = output_queue->modified_index[i]; index = output_queue->modified_index[i];
/* Update last_step for this index */
output_queue->last_step[index] = output_queue->current[index];
/* Reset the modified flag */ /* Reset the modified flag */
output_queue->modified[index] = MIF_FALSE; output_queue->modified[index] = MIF_FALSE;
/* Move stale entries to the free list. */
next = output_queue->head[index];
while (next) {
if (next->event_time >= time ||
&next->next == output_queue->current[index]) {
break;
}
stale = next;
next = next->next;
stale->next = output_queue->free[index];
output_queue->free[index] = stale;
}
output_queue->head[index] = next;
if (!next)
output_queue->current[index] = &output_queue->head[index];
/* Update last_step for this index */
output_queue->last_step[index] = output_queue->current[index];
} }
/* Record the new last_time and reset number modified to zero */ /* Record the new last_time and reset number modified to zero */
output_queue->last_time = time; output_queue->last_time = time;

8
src/xspice/evt/evtdeque.c

@ -132,8 +132,8 @@ static void EVTdequeue_output(
/* Get pointer to next event in queue at this index */ /* Get pointer to next event in queue at this index */
output = *(output_queue->current[index]); output = *(output_queue->current[index]);
/* If event time does not match current time, skip */
if(output->event_time != time)
/* If cleaned or event time does not match current time, skip */
if(!output || output->event_time != time)
continue; continue;
/* It must match, so pull the event from the queue and process it */ /* It must match, so pull the event from the queue and process it */
@ -232,8 +232,8 @@ void EVTdequeue_inst(
/* Get pointer to next event in queue at this index */ /* Get pointer to next event in queue at this index */
inst = *(inst_queue->current[index]); inst = *(inst_queue->current[index]);
/* If event time does not match current time, skip */
if(inst->event_time != time)
/* If cleaned or event time does not match current time, skip */
if(!inst || inst->event_time != time)
continue; continue;
/* It must match, so pull the event from the queue and process it */ /* It must match, so pull the event from the queue and process it */

Loading…
Cancel
Save