home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1999 mARCH
/
PCWK3A99.iso
/
Linux
/
DDD331
/
DDD-3_1_.000
/
DDD-3_1_
/
ddd-3.1.1
/
ddd
/
TimeOut.C
< prev
next >
Wrap
C/C++ Source or Header
|
1998-04-16
|
6KB
|
203 lines
// $Id: TimeOut.C,v 1.10 1998/04/16 13:49:23 zeller Exp $ -*- C++ -*-
// Xt TimeOut debugging routines
// Copyright (C) 1997 Technische Universitaet Braunschweig, Germany.
// Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
//
// This file is part of DDD.
//
// DDD is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// DDD is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with DDD -- see the file COPYING.
// If not, write to the Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// DDD is the data display debugger.
// For details, see the DDD World-Wide-Web page,
// `http://www.cs.tu-bs.de/softech/ddd/',
// or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
char TimeOut_rcsid[] =
"$Id: TimeOut.C,v 1.10 1998/04/16 13:49:23 zeller Exp $";
#ifdef __GNUG__
#pragma implementation
#endif
#include "TimeOut.h"
#include "strclass.h"
#include "assert.h"
#include "bool.h"
#include <iostream.h>
#include <stdlib.h> // abort()
#undef XtAppAddTimeOut
#undef XtRemoveTimeOut
// Set this to 1 to log all timer actions
#define LOG_TIMERS 0
struct TimerInfo {
XtIntervalId timer; // The id as received from XtAppAddTimeOut()
XtIntervalId tic; // The unique id we use instead
unsigned long interval; // INTERVAL arg given to XtAppAddTimeOut()
XtTimerCallbackProc proc; // PROC arg given to XtAppAddTimeOut()
XtPointer closure; // CLOSURE arg given to XtAppAddTimeOut()
string file; // The file where XtAppAddTimeOut() was called
int line; // The line where XtAppAddTimeOut() was called
TimerInfo *next; // Next pending timer
TimerInfo()
: timer(0), tic(0), interval(0), proc(0), closure(0), file(), line(0),
next(0)
{}
private:
TimerInfo(const TimerInfo&)
: timer(0), tic(0), interval(0), proc(0), closure(0), file(), line(0),
next(0)
{
assert(0);
}
TimerInfo& operator = (const TimerInfo&)
{
assert(0); return *this;
}
};
// List of pending timers
static TimerInfo *pending_timers = 0;
// Counter
static XtIntervalId timer_tics = 0;
// Return number of pending timers (i.e. not yet called)
int MyPendingTimeOuts()
{
int count = 0;
for (TimerInfo *ti = pending_timers; ti != 0; ti = ti->next)
count++;
return count;
}
// When timer is called, remove TimerInfo from list
static void MyTimerProc(XtPointer client_data, XtIntervalId *)
{
TimerInfo *tm = (TimerInfo *)client_data;
// Remove from pending list
bool removed = false;
TimerInfo *tp = 0;
for (TimerInfo *ti = pending_timers; ti != 0; tp = ti, ti = ti->next)
{
if (ti == tm)
{
if (tp != 0)
tp->next = ti->next;
else
pending_timers = ti->next;
removed = true;
break;
}
}
assert(removed);
if (!removed) // Just use it
abort();
#if LOG_TIMERS
clog << "TimeOut: " << tm->file << ":" << tm->line << ": timer "
<< tm->tic << " (" << XtPointer(tm->timer) << ")"
<< " expired (" << MyPendingTimeOuts() << " still pending)\n";
#endif
tm->proc(tm->closure, &tm->tic);
delete tm;
return;
}
// Like XtAppAddTimeOut(), but also register timer in internal list.
XtIntervalId MyAppAddTimeOut(XtAppContext app_context,
unsigned long interval,
XtTimerCallbackProc proc,
XtPointer closure,
String file, int line)
{
TimerInfo *tm = new TimerInfo;
tm->timer = XtAppAddTimeOut(app_context, interval,
MyTimerProc, XtPointer(tm));
tm->interval = interval;
tm->proc = proc;
tm->closure = closure;
tm->file = (file ? file : "");
tm->line = line;
tm->tic = ++timer_tics;
tm->next = pending_timers;
pending_timers = tm;
#if LOG_TIMERS
clog << "TimeOut: "
<< file << ":" << line << ": timer "
<< tm->tic << " (" << XtPointer(tm->timer) << ") added "
<< "(" << MyPendingTimeOuts() << " still pending)\n";
#endif
// Note: we return a private XtIntervalId instead of the one
// returned by XtAppAddInput. This gives every timer a unique id
// and thus enables us to check for expired timers.
return tm->tic;
}
// Like XtRemoveTimeOut(), but unregister TIMER from internal list.
// Trigger an error if TIMER is not found (i.e. expired or removed)
void MyRemoveTimeOut(XtIntervalId tic, String file, int line)
{
TimerInfo *tp = 0;
for (TimerInfo *ti = pending_timers; ti != 0; tp = ti, ti = ti->next)
{
if (tic == ti->tic)
{
#if LOG_TIMERS
clog << "TimeOut: " << file << ":" << line << ": timer "
<< ti->tic << " (" << XtPointer(ti->timer) << ") removed "
<< "(" << MyPendingTimeOuts() << " still pending)\n"
<< "TimeOut: " << ti->file << ":" << ti->line
<< ": this is the location where the timer was added.\n";
#endif
XtRemoveTimeOut(ti->timer);
if (tp != 0)
tp->next = ti->next;
else
pending_timers = ti->next;
delete ti;
return;
}
}
// Timer not found - either already called or removed
cerr << "TimeOut: " << file << ":" << line << ": timer "
<< tic << " expired\n";
// `It is an error to remove a timer that has already gone off.'
// (Asente/Swick, X WINDOW SYSTEM TOOLKIT, 6.4 `Timers').
abort();
}