home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frostbyte's 1980s DOS Shareware Collection
/
floppyshareware.zip
/
floppyshareware
/
DOOG
/
CTASK.ZIP
/
TSKSNAP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-12-20
|
11KB
|
345 lines
/*
--- Version 2.0 89-12-14 13:29 ---
TSKSNAP.C - CTask State Snaphot
Public Domain Software written by
Thomas Wagner
Patschkauer Weg 31
D-1000 Berlin 33
West Germany
This file is new with Version 1.1
*/
#include "tsk.h"
#include "tsklocal.h"
#include "tsksup.h"
#include <stdarg.h>
#define DBPSP 0 /* If defined nonzero, the PSP info is displayed in place
of stack-pointer and stack-bottom in dump_tasks. */
#if (DOS)
local char *sn_state [] = { "*???*", "Stop", "Delay", "Wait", "Elig", "Run" };
local char *sn_kind [] = { "*Undef*", "Task", "Flag", "Resource", "Counter",
"Mailbox", "Pipe", "Wpipe", "Buffer" };
local int crow, ccol, maxrow;
local char far *screenptr, far *screen;
local void putscreen (byte c)
{
if (crow >= maxrow)
return;
switch (c)
{
case 0x0d: ccol = 0;
screenptr = &screen [crow * 160];
break;
case 0x0a: while (ccol < 80)
{
*screenptr++ = ' ';
*screenptr++ = 0x07;
ccol++;
}
crow++;
ccol = 0;
screenptr = &screen [crow * 160];
break;
default: *screenptr++ = c;
*screenptr++ = 0x07;
if (++ccol >= 80)
{
ccol = 0;
crow++;
screenptr = &screen [crow * 160];
}
}
}
local int xprintf (FILE *f, char *format, ...);
local int xprintf (f, format)
FILE *f;
char *format;
{
va_list argptr;
char buf [256];
int res, i;
va_start (argptr, format);
if (f != NULL)
res = vfprintf (f, format, argptr);
else
{
res = vsprintf (buf, format, argptr);
for (i = 0; i < res; i++)
putscreen (buf [i]);
}
va_end (argptr);
return res;
}
local int sn_wlist (FILE *f, char *str, queheadptr list, int col)
{
queptr curr;
curr = list->first;
if (!curr->kind)
return col;
if (col)
xprintf (f, "\n%31c", ' ');
col = 52;
xprintf (f, "%6s(%Fp): ", str, list);
while (curr->kind)
{
if (col >= 60)
{
xprintf (f, "\n%51c", ' ');
col = 52;
}
xprintf (f, "%-8s(%Fp) ", ((tcbptr)curr)->name.name, curr);
col += 20;
curr = curr->next;
}
return col;
}
local void dgroup (FILE *f, gcbptr group)
{
xprintf (f, ">> Group %-8s (%Fp), C:%-8s (%Fp), B:%Fp, L:%Fp\n",
group->namelist.name, group,
group->creator->name.name, group->creator,
group->branch, group->level);
}
local void event_group (FILE *f, gcbptr base)
{
queptr curr;
int col;
flagptr fl;
counterptr ct;
resourceptr rs;
mailboxptr mb;
pipeptr pp;
wpipeptr wp;
bufferptr bp;
gcbptr group;
for (group = base; group != NULL; group = group->level)
{
dgroup (f, group);
for (curr = group->namelist.list.first; curr->kind; curr = curr->next)
if (curr->kind != TYP_TCB)
{
xprintf (f, "%-8s %-8s ", ((nameptr)curr)->name,
sn_kind [curr->kind]);
switch (curr->kind)
{
case TYP_FLAG: fl = (flagptr) ((nameptr)curr)->strucp;
xprintf (f, "%8s ", (fl->state) ? "Set" : "Clear");
col = sn_wlist (f, "Set", &fl->wait_set, 0);
sn_wlist (f, "Clear", &fl->wait_clear, col);
break;
case TYP_COUNTER: ct = (counterptr) ((nameptr)curr)->strucp;
xprintf (f, "%8ld ", ct->state);
col = sn_wlist (f, "Set", &ct->wait_set, 0);
sn_wlist (f, "Clear", &ct->wait_clear, col);
break;
case TYP_RESOURCE: rs = (resourceptr) ((nameptr)curr)->strucp;
if (rs->count)
{
xprintf (f, "%8u ", rs->count);
xprintf (f, "Owner (%Fp): ", &rs->owner);
xprintf (f, "%-8s(%Fp) ", rs->owner->name.name,
rs->owner);
col = 70;
}
else
{
xprintf (f, " Free ");
col = 0;
}
sn_wlist (f, "Wait", &rs->waiting, col);
break;
case TYP_MAILBOX: mb = (mailboxptr) ((nameptr)curr)->strucp;
xprintf (f, "%8s ", (mb->mail_first == NULL)
? "Empty" : "Mail");
sn_wlist (f, "Mail", &mb->waiting, 0);
break;
case TYP_PIPE: pp = (pipeptr) ((nameptr)curr)->strucp;
xprintf (f, "%8u ", pp->filled);
col = sn_wlist (f, "Read", &pp->wait_read, 0);
col = sn_wlist (f, "Write", &pp->wait_write, col);
sn_wlist (f, "Clear", &pp->wait_clear, col);
break;
case TYP_WPIPE: wp = (wpipeptr) ((nameptr)curr)->strucp;
xprintf (f, "%8u ", wp->filled);
col = sn_wlist (f, "Read", &wp->wait_read, 0);
col = sn_wlist (f, "Write", &wp->wait_write, col);
sn_wlist (f, "Clear", &wp->wait_clear, col);
break;
case TYP_BUFFER: bp = (bufferptr) ((nameptr)curr)->strucp;
xprintf (f, "%8u ", bp->msgcnt);
col = sn_wlist (f, "Read", &bp->buf_read.waiting, 0);
sn_wlist (f, "Write", &bp->buf_write.waiting, col);
break;
default: xprintf (f, "*Invalid Type %02x", curr->kind);
break;
}
xprintf (f, "\n");
}
if (group->branch != NULL)
event_group (f, group->branch);
}
}
local void dump_events (FILE *f)
{
xprintf (f, "List of Events:\n");
/* 1234567890123456789012345678901234567890123456789012345
12345678 12345678 12345678 123456(123456789): */
xprintf (f, "Name Type State Waitfor(Queue) Tasks\n");
event_group (f, &GLOBDATA group);
xprintf (f, "\n");
}
local void task_group (FILE *f, gcbptr base, word oldpri)
{
queptr curr;
tcbptr task;
gcbptr group;
for (group = base; group != NULL; group = group->level)
{
dgroup (f, group);
for (curr = group->namelist.list.first; curr->kind;
curr = curr->next)
if (curr->kind == TYP_TCB)
{
task = (tcbptr) ((nameptr)curr)->strucp;
xprintf (f, "%-8s %-5s %Fp ",
((nameptr)curr)->name,
sn_state [(task->state <= 5)
? task->state : 0],
task->qhead);
switch (task->timerq.tstate)
{
case TSTAT_REMOVE:
case TSTAT_IDLE: xprintf (f, "%8s", "-"); break;
case TSTAT_WATCH:
case TSTAT_CONTWATCH: xprintf (f, " Watch ");
if ((task->timerq.elkind & 0xf0)
== TELEM_MEM)
xprintf (f, "M");
else
xprintf (f, "P");
break;
case TSTAT_COUNTDOWN:
case TSTAT_REPEAT: xprintf (f, "%8ld",
task->timerq.link.el.ticks);
break;
default: xprintf (f, " ?%5d",
task->timerq.tstate);
break;
}
#if (DBPSP)
xprintf (f, " %Fp %Fp %Fp %Fp",
task,
task->stack,
task->stkbot,
((struct task_stack *)task->stack)->retn);
#else
xprintf (f, " %Fp %04X %04X %Fp %Fp",
task,
task->base_psp,
*((word *)(&task->swap_area [0x10])),
task->psp_sssp,
((struct task_stack *)task->stack)->retn);
#endif
if (task != GLOBDATA current_task)
xprintf (f, " %5u\n", task->cqueue.el.pri.prior);
else
xprintf (f, "*%5u\n", oldpri);
}
if (group->branch != NULL)
task_group (f, group->branch, oldpri);
}
}
local void dump_tasks (FILE *f, word oldpri)
{
xprintf (f, "\nTask List:\n");
#if (DBPSP)
xprintf (f, "Name State Queue Timeout TCB-addr Stackptr Stackbot Instrptr Prior\n");
#else
xprintf (f, "Name State Queue Timeout TCB-addr BPSP CPSP PSP-SSSP Instrptr Prior\n");
#endif
task_group (f, &GLOBDATA group, oldpri);
xprintf (f, "\n");
}
void snapshot (FILE *f)
{
word oldpri;
oldpri = get_priority (GLOBDATA current_task);
set_priority (GLOBDATA current_task, 0xffff);
dump_tasks (f, oldpri);
dump_events (f);
set_priority (GLOBDATA current_task, oldpri);
}
void screensnap (char far *scr, int max)
{
word oldpri;
static word counter = 0;
oldpri = get_priority (GLOBDATA current_task);
set_priority (GLOBDATA current_task, 0xffff);
screen = screenptr = scr;
crow = ccol = 0;
maxrow = max;
dump_tasks (NULL, oldpri);
dump_events (NULL);
xprintf (NULL, "%6u", counter++);
while (crow < max)
xprintf (NULL, "\n");
set_priority (GLOBDATA current_task, oldpri);
}
#endif