home *** CD-ROM | disk | FTP | other *** search
- /*
- --- 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
-
-