diff options
Diffstat (limited to 'private/crt32/startup/tidprint.c')
-rw-r--r-- | private/crt32/startup/tidprint.c | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/private/crt32/startup/tidprint.c b/private/crt32/startup/tidprint.c new file mode 100644 index 000000000..290a6288e --- /dev/null +++ b/private/crt32/startup/tidprint.c @@ -0,0 +1,286 @@ +/*** +*tidprint.c - Dislpay thread data +* +* Copyright (c) 1988-1991, Microsoft Corporation. All rights reserved. +* +*Purpose: +* Display the per thread data table. +* +* [NOTE: This module is NOT included in the C runtime libraries but +* is maintained for debugging analysis.] +* +*Revision History: +* 11-17-88 JCR Module created. +* 04-03-89 JCR Added _stackalloc to tid table +* 06-06-89 JCR 386 version +* 06-09-89 JCR 386: Added values to _tiddata struc (for _beginthread) +* 04-09-90 GJF Added #include <cruntime.h>. Made the calling type +* _CALLTYPE1. Also, fixed the copyright. +* 04-10-90 GJF Removed #include <dos.h>. +* 08-16-90 SBM Made _terrno and _tdoserrno int, not unsigned +* 10-08-90 GJF New-style function declarators. +* 10-09-90 GJF Thread ids are of type unsigned long! +* 12-18-90 GJF Use real thread id, not thread id - 1. +* 08-01-91 GJF Adapted for Win32 [_WIN32_]. +* +*******************************************************************************/ + +#include <cruntime.h> +#include <stdio.h> +#include <os2dll.h> + +#ifdef _CRUISER_ +void _CALLTYPE1 _print_tiddata(unsigned long); +void _CALLTYPE1 _print_tid(struct _tiddata *, unsigned long); + +extern unsigned long _tidtabmax; +extern struct _tiddata * _threaddata; + +/*** +*void _print_tiddata(unsigned long) - Display data for a thread +* +*Purpose: +* This routine displays the per thread data for one (or all) +* threads in the table. +* +*Entry: +* unsigned long = <n> = Threadid of tid to display +* = -1 = Display all tids' data +* +*Exit: +* <void> +* +*Exceptions: +* +*******************************************************************************/ + +void _CALLTYPE1 _print_tiddata ( + unsigned long tid + ) +{ + unsigned long maxtid; + struct _tiddata * tdata; + unsigned long i; + + /* Get and save current maxtid value */ + maxtid = _tidtabmax; + + /* See if user want's all threads or just a specific one. */ + if (tid == (unsigned long) -1L) { + + /* Print out all threads */ + + printf("\nPER THREAD DATA TABLE (NUMBER OF THREADS = %u)\n" + "----------------------------------------------\n", maxtid+1); + + for (i=0; i<=maxtid; i++) { + /* Get pointer to tidtable entry */ + tdata = &_threaddata[i]; + _print_tid(tdata,i+1); /* print it out */ + } + + /* Make sure the table didn't change size while we processed it */ + if (_tidtabmax > maxtid) + printf("*** WARNING: Tid data table grew while printing out data. ***\n\n"); + + printf("END THREAD TABLE\n" + "----------------\n\n"); + + } + + else { + + /* Print out the specific thread supplied by the user. */ + + if (tid > maxtid) { + printf("*** ERROR: Tid value outside thread data table. ***\n"); + return; + } + + /* point to tid data */ + tdata = &_threaddata[tid-1]; + _print_tid(tdata,tid); /* print it out */ + } + +} + + +/*** +* void _print_tid() - Print out thread data +* +*Purpose: +* Given the address of a thread data entry, print out that +* information. +* +*Entry: +* struct _tiddata * = pointer to thread's data area +* unsigned long = associated threadid (0-based) +* +*Exit: +* <void> +* +*Exceptions: +* +*******************************************************************************/ + +void _CALLTYPE1 _print_tid ( + struct _tiddata * td, + unsigned long tid + ) +{ + + printf("TID %u DATA (%lp):\n", tid, td); + + printf("\t_terrno = %d \t (errno value)\n", td->_terrno); + printf("\t_tdoserrno = %d \t (_doserrno value)\n", td->_tdoserrno); + printf("\t_stkhqq = %#x\t (stack limit)\n", td->_stkhqq); + printf("\t_fpds = %#x \t (Floating Point data segment)\n", + td->_fpds); + printf("\t_holdrand = %u \t (rand() seed value)\n", td->_holdrand); + printf("\t_token = %p\t (ptr to strtok() token)\n", td->_token); + printf("\t_errmsg = %p\t (ptr to strerror()/_strerror() buff)\n", + td->_errmsg); + printf("\t_namebuf = %p\t (ptr to tmpfile() buffer)\n", + td->_namebuf); + printf("\t_asctimebuf = %p\t (ptr to asctime() buffer)\n", + td->_asctimebuf); + printf("\t_gmtimebuf = %p\t (ptr to gmtime() structure)\n", + td->_gmtimebuf); + printf("\t_initaddr = %p\t (initial user thread addr)\n", + td->_initaddr); + printf("\t_initarg = %p\t (initial user thread arg)\n", + td->_initarg); + printf("\t_initstksz = %u \t (initial stack size)\n", + td->_initstksz); + putchar((int)'\n'); + +} + +#else /* ndef _CRUISER_ */ + +#ifdef _WIN32_ + +void _CALLTYPE1 _print_tiddata(unsigned long); +void _CALLTYPE1 _print_tiddata1(_ptiddata); + +/*** +*void _print_tiddata(unsigned long) - Display data for a thread +* +*Purpose: +* This routine displays the per thread data for a specific, or all, +* active threads in the _ptd[] table. +* +*Entry: +* unsigned long = <n> = ID of the thread to display +* = -1 = Display thread data for all threads +* +*Exit: +* <void> +* +*Exceptions: +* +*******************************************************************************/ + +void _CALLTYPE1 _print_tiddata ( + unsigned long tid + ) +{ + int i; /* loop index */ + int threadcnt; /* number of active threads */ + + /* + * lock the _ptd[] table. + */ + _mlock(_THREADDATA_LOCK); + + /* + * see if caller want's all threads or just a specific one. + */ + if (tid == (unsigned long) -1L) { + /* + * caller want's all threads! + */ + for ( i = threadcnt = 0 ; i < 1024 ; i++ ) + /* + * print out the fields of *_ptd[i] for each entry + * bound to an active thread (i.e., for each i st + * _ptd[i] non-NULL). also, count up the total number + * of active threads. + */ + if ( _ptd[i] != NULL ) { + threadcnt++; + _print_tiddata1(_ptd[i]); + } + + printf("\nTHERE ARE %d CURRENTLY ACTIVE THREADS!\n", threadcnt); + } + else { + /* + * caller just interested in a particular thread. search + * the _ptd[] table inline because a call to _getptd[] would + * have unpleasant side effects if tid is not (or no longer) + * valid. + */ + for ( i = 0 ; (i < 1024) && ((_ptd[i] == NULL) || + (_ptd[i] == (_ptiddata)1L) || (_ptd[i]->_tid != tid)) ; + i++ ) ; + + if ( i < 1024 ) + _print_tiddata1(_ptd[i]); + else + printf("\nTID INVALID OR THREAD HAS TERMINATED!\n"); + } + + /* + * unlock the _ptd[] table. + */ + _munlock(_THREADDATA_LOCK); + +} + + +/*** +* void _print_tiddata1(_ptiddata ptd) - print out _tiddata structure +* +*Purpose: +* Given a pointer to a thread data structure, print out its contents +* +*Entry: +* ptd = pointer to thread's data area +* +*Exit: +* <void> +* +*Exceptions: +* +*******************************************************************************/ + +void _CALLTYPE1 _print_tiddata1 ( + _ptiddata ptd + ) +{ + printf("\t_tid = %lu\n", ptd->_tid ); + printf("\t_thandle = %lu\n", ptd->_thandle ); + printf("\t_terrno = %d\n", ptd->_terrno); + printf("\t_tdoserrno = %d\n", ptd->_tdoserrno); + printf("\t_fpds = %#x\n", ptd->_fpds); + printf("\t_holdrand = %u\n", ptd->_holdrand); + printf("\t_token = %p\n", ptd->_token); + printf("\t_errmsg = %p\n", ptd->_errmsg); + printf("\t_namebuf = %p\n", ptd->_namebuf); + printf("\t_asctimebuf = %p\n", ptd->_asctimebuf); + printf("\t_gmtimebuf = %p\n", ptd->_gmtimebuf); + printf("\t_initaddr = %p\n", ptd->_initaddr); + printf("\t_initarg = %p\n", ptd->_initarg); + printf("\t_pxcptacttab = %p\n", ptd->_pxcptacttab); + printf("\t_tpxcptinfoptrs = %p\n", ptd->_tpxcptinfoptrs); + printf("\t_tfpecode = %p\n\n", ptd->_tfpecode); + +} +#else /* ndef _WIN32_ */ + +#error ERROR - ONLY CRUISER OR WIN32 TARGET SUPPORTED! + +#endif /* _WIN32_ */ + +#endif /* _CRUISER_ */ |