diff options
Diffstat (limited to 'c/src/tests/sptests/threaditerate/threadinfo.c')
-rw-r--r-- | c/src/tests/sptests/threaditerate/threadinfo.c | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/c/src/tests/sptests/threaditerate/threadinfo.c b/c/src/tests/sptests/threaditerate/threadinfo.c new file mode 100644 index 0000000000..baf4822a5a --- /dev/null +++ b/c/src/tests/sptests/threaditerate/threadinfo.c @@ -0,0 +1,178 @@ +/* threadinfo.c + * + * Routines to print out information about threads. + */ + +#include "system.h" +#include <stdlib.h> + +#define PTR unsigned int +#define PTR_MASK "0x%08x" + +/* + * Return a pointer to a string describing the object type. + */ + +const char * _Objects_Type_to_String( Objects_Control * object ) +{ + switch( _Objects_Get_class( object->id ) ) { + case OBJECTS_NO_CLASS: + return "NO_CLASS"; + + case OBJECTS_INTERNAL_THREADS: + return "INTERNAL_THREADS"; + + case OBJECTS_RTEMS_TASKS: + return "RTEMS_TASKS"; + + case OBJECTS_POSIX_THREADS: + return "POSIX_THREADS"; + + case OBJECTS_ITRON_TASKS: + return "ITRON_TASKS"; + + case OBJECTS_RTEMS_TIMERS: + return "RTEMS_TIMERS"; + + case OBJECTS_RTEMS_SEMAPHORES: + return "RTEMS_SEMAPHORES"; + + case OBJECTS_RTEMS_MESSAGE_QUEUES: + return "RTEMS_MESSAGE_QUEUES"; + + case OBJECTS_RTEMS_PARTITIONS: + return "RTEMS_PARTITIONS"; + + case OBJECTS_RTEMS_REGIONS: + return "RTEMS_REGIONS"; + + case OBJECTS_RTEMS_PORTS: + return "RTEMS_PORTS"; + + case OBJECTS_RTEMS_PERIODS: + return "RTEMS_PERIODS"; + + case OBJECTS_RTEMS_EXTENSIONS: + return "RTEMS_EXTENSIONS"; + + case OBJECTS_POSIX_KEYS: + return "POSIX_KEYS"; + + case OBJECTS_POSIX_INTERRUPTS: + return "POSIX_INTERRUPTS"; + + case OBJECTS_POSIX_MESSAGE_QUEUES: + return "POSIX_MESSAGE_QUEUES"; + + case OBJECTS_POSIX_MUTEXES: + return "POSIX_MUTEXES"; + + case OBJECTS_POSIX_SEMAPHORES: + return "POSIX_SEMAPHORES"; + + case OBJECTS_POSIX_CONDITION_VARIABLES: + return "POSIX_CONDITION_VARIABLES"; + + case OBJECTS_ITRON_EVENTFLAGS: + return "ITRON_EVENTFLAGS"; + + case OBJECTS_ITRON_MAILBOXES: + return "ITRON_MAILBOXES"; + + case OBJECTS_ITRON_MESSAGE_BUFFERS: + return "ITRON_MESSAGE_BUFFERS"; + + case OBJECTS_ITRON_PORTS: + return "ITRON_PORTS"; + + case OBJECTS_ITRON_SEMAPHORES: + return "ITRON_SEMAPHORES"; + + case OBJECTS_ITRON_VARIABLE_MEMORY_POOLS: + return "ITRON_VARIABLE_MEMORY_POOLS"; + + case OBJECTS_ITRON_FIXED_MEMORY_POOLS: + return "ITRON_FIXED_MEMORY_POOLS"; + + default: + return "UNKNOWN"; + } +} + + +/* + * Return a pointer to a string describing the thread state + */ + +const char * _Thread_State_to_String( States_Control state ) +{ + States_Control orig_state = state; + int i; + int first_entry = TRUE; + static char buffer[256]; + static const char *desc[] = { + "READY", /* 0 - 0x00000 */ + "DORMANT", /* 1 - 0x00001 */ + "SUSPENDED", /* 2 - 0x00002 */ + "TRANSIENT", /* 3 - 0x00004 */ + "DELAYING", /* 4 - 0x00008 */ + "WAITING_FOR_TIME", /* 5 - 0x00010 */ + "WAITING_FOR_BUFFER", /* 6 - 0x00020 */ + "WAITING_FOR_SEGMENT", /* 7 - 0x00040 */ + "WAITING_FOR_MESSAGE", /* 8 - 0x00080 */ + "WAITING_FOR_EVENT", /* 9 - 0x00100 */ + "WAITING_FOR_SEMAPHORE", /* 10 - 0x00200 */ + "WAITING_FOR_MUTEX", /* 11 - 0x00400 */ + "WAITING_FOR_CONDITION_VARIABLE", /* 12 - 0x00800 */ + "WAITING_FOR_JOIN_AT_EXIT", /* 13 - 0x01000 */ + "WAITING_FOR_RPC_REPLY", /* 14 - 0x02000 */ + "WAITING_FOR_PERIOD", /* 15 - 0x04000 */ + "WAITING_FOR_SIGNAL", /* 16 - 0x08000 */ + "INTERRUPTIBLE_BY_SIGNAL", /* 17 - 0x10000 */ + "UNKNOWN" /* 18 - all higher bits */ + }; + + if( state == STATES_READY ) + return desc[0]; + + memset( buffer, '\0', sizeof( buffer ) ); + for ( i = 1; i < 18; i++ ) { + if ( state & 0x1 ) { + if ( !first_entry ) { + strcat ( buffer, " | " ); + } + strcat ( buffer, desc[i] ); + first_entry = FALSE; + } + state = state >> 1; + } + + if ( state != 0 ) { + if ( !first_entry ) { + strcat ( buffer, " | " ); + } + strcat ( buffer, desc[18] ); + } + + return buffer; +} + + +/* + * Callback function to print out thread Ids, thread priorities, and thread stack + * information. + */ + +unsigned32 print_thread_info( Thread_Control *thread, void * arg ) +{ + printf( "Thread ID 0x%08x at "PTR_MASK"\n", thread->Object.id, (PTR)thread ); + printf( "\ttype = %s\n", _Objects_Type_to_String( &(thread->Object) ) ); + printf( "\tstate = %s\n", _Thread_State_to_String( thread->current_state ) ); + printf( "\treal priority = %d\n", thread->real_priority ); + printf( "\tcurrent priority = %d\n", thread->current_priority ); + printf( "\tstack base = "PTR_MASK"\n", (PTR)thread->Start.Initial_stack.area ); + printf( "\tstack size = 0x%08x\n", thread->Start.Initial_stack.size ); + /* printf( "\tstack pointer = "PTR_MASK"\n", */ + printf( "\n" ); + return 0; +} |