[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Problem with the queue in ListScheduler



Hi

Im having a problem with a timer. When I after almost a minute into a
simulation want to rescheduler my timer I encounter an addressing error
and it gives me a segm. fault. I've tracked this down to be in
ListScheduler::insert while searching through the sorted list of events
looking for the right spot to put this event in. This search goes on as
long as there are more events in the list and the event I'm looking at
right now expires before my event does. When the search comes to the end
of the list or my event expires before the one in the list I'm looking
at it inserts my event in the list.

My problem is that the last event in the list is only 'almost the
NULL-pointer' which gives the error. My queestion is if anyone else has
encountered this problem, and if so, how'd you solve it? One way of
handling this is to make an extra check if the event in the list I'm
looking at expires before the event before it in the list. Since the
list is sorted that should not happen. But this feels kind of hacky, if
any one else has a better idea pleace tell me.

I've used this timer many times, both in other simulations based on this
code, but it's also called numerous times within this simulation before
this call, and it hasn't been any problems until now.

I have attached below both the insert function in ListScheduler and
below that the debug-printing from this function.

Regards
/Johan Nielsen

 
void ListScheduler::insert(Event* e)
{
        cout << "ListScheduler::insert, start" << endl;
        double t = e->time_;
        Event** p;
        cout << "ListScheduler::insert, 1, t = " << t << endl;

#if defined(MONARCH) && defined(DEBUG_INSERTIONS)
        struct hb ** hbp = event_check.find(e);
        if (0 != hbp) abort();
        event_check.insert(e);
        event_count++;
#endif
        cout << "ListScheduler::insert, 2" << endl;
        for (p = &queue_; *p != 0; p = &(*p)->next_)
          {
            cout << "ListScheduler::insert, *p = " << *p << ", p = "
                 << p << endl;
            cout << "ListScheduler::insert, *p->next = " << (*p)->next_
<< endl;
            cout << "ListScheduler::insert, queuetime = "
                 << (*p)->time_ << endl;

            // check for dupes
            if (*p == e) abort();
                if (t < (*p)->time_)
                  {
                    cout << "ListScheduler::insert, in if" << endl;
                        break;
                  }
          }
        cout << "ListScheduler::insert, 3" << endl;
        e->next_ = *p;
        *p = e;
  cout << "ListScheduler::insert, end" << endl;
}
 

ListScheduler::insert, start
ListScheduler::insert, 1, t = 55.2629
ListScheduler::insert, 2

ListScheduler::insert, *p = 0x83e4480, p = 1
ListScheduler::insert, *p->next = 0x83bf100
ListScheduler::insert, queuetime = 53.9888

ListScheduler::insert, *p = 0x83bf100, p = 1
ListScheduler::insert, *p->next = 0x83c8488
ListScheduler::insert, queuetime = 53.9901

ListScheduler::insert, *p = 0x83c8488, p = 1
ListScheduler::insert, *p->next = 0x83bf708
ListScheduler::insert, queuetime = 53.996

ListScheduler::insert, *p = 0x83bf708, p = 1
ListScheduler::insert, *p->next = 0x8455448
ListScheduler::insert, queuetime = 54.006

ListScheduler::insert, *p = 0x8455448, p = 1
ListScheduler::insert, *p->next = 0x84553c8
ListScheduler::insert, queuetime = 54.0108

ListScheduler::insert, *p = 0x84553c8, p = 1
ListScheduler::insert, *p->next = 0x8455348
ListScheduler::insert, queuetime = 54.0279

ListScheduler::insert, *p = 0x8455348, p = 1
ListScheduler::insert, *p->next = 0x8458520
ListScheduler::insert, queuetime = 54.0347

ListScheduler::insert, *p = 0x8458520, p = 1
ListScheduler::insert, *p->next = 0x8458540
ListScheduler::insert, queuetime = 54.178

ListScheduler::insert, *p = 0x8458540, p = 1
ListScheduler::insert, *p->next = 0x84584a0
ListScheduler::insert, queuetime = 54.2583

ListScheduler::insert, *p = 0x84584a0, p = 1
ListScheduler::insert, *p->next = 0x83a3e80
ListScheduler::insert, queuetime = 54.5492

ListScheduler::insert, *p = 0x83a3e80, p = 1
ListScheduler::insert, *p->next = 0x2
ListScheduler::insert, queuetime = 1.25604e-314

ListScheduler::insert, *p = 0x2, p = 1
Segmentation fault (core dumped)


void ListScheduler::insert(Event* e)
{
        cout << "ListScheduler::insert, start" << endl;
	double t = e->time_;
	Event** p;
	cout << "ListScheduler::insert, 1, t = " << t << endl;

#if defined(MONARCH) && defined(DEBUG_INSERTIONS)
	struct hb ** hbp = event_check.find(e);
	if (0 != hbp) abort();
	event_check.insert(e);
	event_count++;
#endif
	cout << "ListScheduler::insert, 2" << endl;
	for (p = &queue_; *p != 0; p = &(*p)->next_)
	  {
	    cout << "ListScheduler::insert, *p = " << *p << ", p = "
		 << p << endl;
	    cout << "ListScheduler::insert, *p->next = " << (*p)->next_ << endl;
	    cout << "ListScheduler::insert, queuetime = "
		 << (*p)->time_ << endl;

	    // check for dupes
	    if (*p == e) abort();
		if (t < (*p)->time_)
		  {
		    cout << "ListScheduler::insert, in if" << endl;
			break;
		  }
	  }
  cout << "ListScheduler::insert, 3" << endl;
	e->next_ = *p;
	*p = e;
  cout << "ListScheduler::insert, end" << endl;
}






TimerHandler::resched, 1
TimerHandler::resched, 3
Scheduler::schedule, start
Scheduler::schedule, 1
Scheduler::schedule, 2
Scheduler::schedule, 3
Scheduler::schedule, 4
Scheduler::schedule, 5
ListScheduler::insert, start
ListScheduler::insert, 1, t = 55.2629
ListScheduler::insert, 2
ListScheduler::insert, *p = 0x83e4480, p = 1
ListScheduler::insert, *p->next = 0x83bf100
ListScheduler::insert, queuetime = 53.9888
ListScheduler::insert, *p = 0x83bf100, p = 1
ListScheduler::insert, *p->next = 0x83c8488
ListScheduler::insert, queuetime = 53.9901
ListScheduler::insert, *p = 0x83c8488, p = 1
ListScheduler::insert, *p->next = 0x83bf708
ListScheduler::insert, queuetime = 53.996
ListScheduler::insert, *p = 0x83bf708, p = 1
ListScheduler::insert, *p->next = 0x8455448
ListScheduler::insert, queuetime = 54.006
ListScheduler::insert, *p = 0x8455448, p = 1
ListScheduler::insert, *p->next = 0x84553c8
ListScheduler::insert, queuetime = 54.0108
ListScheduler::insert, *p = 0x84553c8, p = 1
ListScheduler::insert, *p->next = 0x8455348
ListScheduler::insert, queuetime = 54.0279
ListScheduler::insert, *p = 0x8455348, p = 1
ListScheduler::insert, *p->next = 0x8458520
ListScheduler::insert, queuetime = 54.0347
ListScheduler::insert, *p = 0x8458520, p = 1
ListScheduler::insert, *p->next = 0x8458540
ListScheduler::insert, queuetime = 54.178
ListScheduler::insert, *p = 0x8458540, p = 1
ListScheduler::insert, *p->next = 0x84584a0
ListScheduler::insert, queuetime = 54.2583
ListScheduler::insert, *p = 0x84584a0, p = 1
ListScheduler::insert, *p->next = 0x83a3e80
ListScheduler::insert, queuetime = 54.5492
ListScheduler::insert, *p = 0x83a3e80, p = 1
ListScheduler::insert, *p->next = 0x2
ListScheduler::insert, queuetime = 1.25604e-314
ListScheduler::insert, *p = 0x2, p = 1
Segmentation fault (core dumped)
winet5:>

____________________________________________________________________
Get free email and a permanent address at http://www.netaddress.com/?N=1