Fix for building outside the source tree.
[cake.git] / workbench / c / StackSnoop.c
blobe6ffbe754f0895d8fc3948b9aaa056966e20534b
1 /*
2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc:
6 Lang: English
7 */
9 #include <exec/exec.h>
10 #include <exec/execbase.h>
11 #include <exec/tasks.h>
12 #include <dos/dos.h>
13 #include <proto/exec.h>
14 #include <proto/dos.h>
16 #include <aros/debug.h>
18 #include <stdio.h>
19 #include <string.h>
20 #include <stdlib.h>
22 #define ARG_TEMPLATE "TASK/K,STDOUT/S"
24 #define ARG_TASK 0
25 #define ARG_STDOUT 1
26 #define NUM_ARGS 2
28 static struct RDArgs *MyArgs;
29 static IPTR Args[NUM_ARGS];
30 static char s[256];
32 static UBYTE outbuffer[20000];
33 static LONG outbuffer_size;
34 static BOOL to_stdout;
36 static void Cleanup(char *msg)
38 WORD rc;
40 if (msg)
42 printf("stacksnoop: %s\n",msg);
43 rc = RETURN_WARN;
44 } else {
45 rc = RETURN_OK;
48 if (MyArgs) FreeArgs(MyArgs);
50 exit(rc);
53 static void OpenLibs(void)
58 static void GetArguments(void)
60 if (!(MyArgs = ReadArgs(ARG_TEMPLATE,Args,0)))
62 Fault(IoErr(),0,s,255);
63 Cleanup(s);
66 if (Args[ARG_STDOUT]) to_stdout = TRUE;
69 static int out (const UBYTE * fmt, ...)
71 va_list ap;
72 int result;
74 va_start (ap, fmt);
75 if (to_stdout)
77 result = vsprintf(&outbuffer[outbuffer_size], fmt, ap);
78 outbuffer_size += result;
80 else
82 result = vkprintf(fmt, ap);
84 va_end (ap);
86 return result;
90 static void CheckTaskStack(struct Task *task)
92 UBYTE *startcheck, *endcheck;
93 LONG stacksize, stackinc, unusedstack = 0;
95 stacksize = (LONG)( ((UBYTE *)task->tc_SPUpper) - ((UBYTE *)task->tc_SPLower) );
97 #if AROS_STACK_GROWS_DOWNWARDS
98 startcheck = (UBYTE *)task->tc_SPLower;
99 endcheck = ((UBYTE *)task->tc_SPUpper) - 1;
100 stackinc = 1;
101 #else
102 startcheck = ((UBYTE *)task->tc_SPUpper) - 1;
103 endcheck = (UBYTE *)task->tc_SPLower;
104 stackinc = -1;
105 #endif
107 for(; startcheck != endcheck; startcheck += stackinc)
109 if (*startcheck != 0xE1) break;
110 unusedstack++;
113 out("Task %x (%25s) Stack Size =%6d, Left =%6d, Used %s%6d%s\n",
114 task,
115 task->tc_Node.ln_Name ? task->tc_Node.ln_Name : "<NONAME>",
116 stacksize,
117 unusedstack,
118 ((stacksize - unusedstack) < stacksize) ? "=" : ">",
119 stacksize - unusedstack,
120 (unusedstack < 512) ? ": Needs more stack!!!!!!!!!" : "");
123 static void Action(void)
125 struct Task *task;
126 WORD i;
128 Disable();
130 out("\n------------------------------------------------------------------------------\n\n");
132 task = (struct Task *)SysBase->TaskReady.lh_Head;
133 for(i = 0; i < 2;i++)
135 while(task->tc_Node.ln_Succ)
137 CheckTaskStack(task);
139 task = (struct Task *)task->tc_Node.ln_Succ;
140 } /* while(task->tc_Node.ln_Succ) */
142 task = (struct Task *)SysBase->TaskWait.lh_Head;
144 } /* for(i = 0; i < 2;i++) */
145 out("\n");
146 CheckTaskStack(FindTask(NULL));
147 out("\n------------------------------------------------------------------------------\n\n");
149 Enable();
151 if (to_stdout) puts(outbuffer);
154 int main(void)
156 OpenLibs();
157 GetArguments();
158 Action();
159 Cleanup(0);
160 return 0;