forked from Imagelibrary/threadx
Release 6.1.7
This commit is contained in:
@@ -0,0 +1,228 @@
|
||||
/* Simple nested-signaling test. */
|
||||
|
||||
#include "pthread.h"
|
||||
|
||||
#define DEMO_STACK_SIZE 2048
|
||||
#define DEMO_BYTE_POOL_SIZE 9120
|
||||
|
||||
|
||||
/* Define the POSIX pthread object control blocks ... */
|
||||
|
||||
pthread_t pthread_0;
|
||||
|
||||
|
||||
/* Define pthread attributes objects */
|
||||
|
||||
|
||||
pthread_attr_t ptattr0;
|
||||
|
||||
|
||||
/* Define the counters used in this test application... */
|
||||
|
||||
ULONG pthread_0_counter;
|
||||
ULONG pthread_0_signal_counter15;
|
||||
ULONG pthread_0_signal_counter14;
|
||||
ULONG pthread_0_signal_counter13;
|
||||
|
||||
|
||||
/* Define pthread function prototypes. */
|
||||
|
||||
VOID *pthread_0_entry(VOID *);
|
||||
|
||||
|
||||
/* Define signal handlers. */
|
||||
|
||||
VOID pthread_0_signal_handler15(int);
|
||||
VOID pthread_0_signal_handler14(int);
|
||||
VOID pthread_0_signal_handler13(int);
|
||||
|
||||
ULONG free_memory[192*1024 / sizeof(ULONG)];
|
||||
/* Define main entry point. */
|
||||
|
||||
INT main()
|
||||
{
|
||||
|
||||
/* Enter the ThreadX kernel. */
|
||||
tx_kernel_enter();
|
||||
}
|
||||
|
||||
|
||||
/* Define what the initial system looks like. */
|
||||
VOID tx_application_define(VOID *first_unused_memory)
|
||||
{
|
||||
|
||||
VOID* storage_ptr;
|
||||
|
||||
|
||||
struct sched_param param;
|
||||
|
||||
|
||||
/* Init POSIX Wrapper */
|
||||
storage_ptr = (VOID*) posix_initialize((VOID* )free_memory);
|
||||
|
||||
/* Put system definition stuff in here, e.g. pthread creates and other assoerted
|
||||
create information. */
|
||||
|
||||
/* Create pthread attributes. */
|
||||
pthread_attr_init(&ptattr0);
|
||||
|
||||
/* Create a sched_param structure */
|
||||
memset(¶m, 0, sizeof(param));
|
||||
|
||||
/* Now create all pthreads , firstly modify respective ptheread
|
||||
attribute with desired priority and stack start address and then create the pthread */
|
||||
|
||||
/* Create pthread 0. */
|
||||
param.sched_priority = 10;
|
||||
pthread_attr_setschedparam(&ptattr0, ¶m);
|
||||
pthread_attr_setstackaddr(&ptattr0, storage_ptr );
|
||||
storage_ptr = (int *) storage_ptr + DEMO_STACK_SIZE;
|
||||
pthread_create (&pthread_0, &ptattr0,pthread_0_entry,NULL);
|
||||
}
|
||||
|
||||
|
||||
VOID error_handler(void)
|
||||
{
|
||||
|
||||
while(1)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Define the signal handlers. */
|
||||
|
||||
|
||||
VOID pthread_0_signal_handler13(int signo)
|
||||
{
|
||||
|
||||
/* Check for pthread self call not pthread 0. The signal handler should appear to be
|
||||
called from pthread 0. */
|
||||
if (pthread_self() != pthread_0)
|
||||
{
|
||||
|
||||
/* Call error handler. */
|
||||
error_handler();
|
||||
}
|
||||
|
||||
/* Check for proper signal. */
|
||||
if (signo != 13)
|
||||
{
|
||||
|
||||
/* Call error handler. */
|
||||
error_handler();
|
||||
}
|
||||
|
||||
/* Just increment the signal counter for this test. */
|
||||
pthread_0_signal_counter13++;
|
||||
}
|
||||
|
||||
|
||||
VOID pthread_0_signal_handler14(int signo)
|
||||
{
|
||||
|
||||
/* Check for pthread self call not pthread 0. The signal handler should appear to be
|
||||
called from pthread 0. */
|
||||
if (pthread_self() != pthread_0)
|
||||
{
|
||||
|
||||
/* Call error handler. */
|
||||
error_handler();
|
||||
}
|
||||
|
||||
/* Check for proper signal. */
|
||||
if (signo != 14)
|
||||
{
|
||||
|
||||
/* Call error handler. */
|
||||
error_handler();
|
||||
}
|
||||
|
||||
/* Just increment the signal counter for this test. */
|
||||
pthread_0_signal_counter14++;
|
||||
|
||||
/* Raise another signal for nesting test. */
|
||||
pthread_kill(pthread_0, 13);
|
||||
}
|
||||
|
||||
|
||||
VOID pthread_0_signal_handler15(int signo)
|
||||
{
|
||||
|
||||
/* Check for pthread self call not pthread 0. The signal handler should appear to be
|
||||
called from pthread 0. */
|
||||
if (pthread_self() != pthread_0)
|
||||
{
|
||||
|
||||
/* Call error handler. */
|
||||
error_handler();
|
||||
}
|
||||
|
||||
/* Check for proper signal. */
|
||||
if (signo != 15)
|
||||
{
|
||||
|
||||
/* Call error handler. */
|
||||
error_handler();
|
||||
}
|
||||
|
||||
/* Just increment the signal counter for this test. */
|
||||
pthread_0_signal_counter15++;
|
||||
|
||||
/* Raise another signal for nesting test. */
|
||||
pthread_kill(pthread_0, 14);
|
||||
}
|
||||
|
||||
|
||||
/* Define the test pthreads */
|
||||
INT pt0_status=0;
|
||||
|
||||
|
||||
/* Self signal test. */
|
||||
|
||||
VOID *pthread_0_entry(VOID *pthread0_input)
|
||||
{
|
||||
|
||||
/* Register the signal handlers. */
|
||||
pt0_status = signal(15, pthread_0_signal_handler15);
|
||||
|
||||
/* Check for error. */
|
||||
if (pt0_status)
|
||||
error_handler();
|
||||
|
||||
pt0_status = signal(14, pthread_0_signal_handler14);
|
||||
|
||||
/* Check for error. */
|
||||
if (pt0_status)
|
||||
error_handler();
|
||||
|
||||
pt0_status = signal(13, pthread_0_signal_handler13);
|
||||
|
||||
/* Check for error. */
|
||||
if (pt0_status)
|
||||
error_handler();
|
||||
|
||||
/* This pthread simply sits in while-forever-sleep loop */
|
||||
while(1)
|
||||
{
|
||||
/* Increment the pthread counter.*/
|
||||
pthread_0_counter++;
|
||||
|
||||
/* Raise the signal. */
|
||||
pt0_status = pthread_kill(pthread_0, 15);
|
||||
|
||||
/* Check for errors. */
|
||||
if ((pt0_status) ||
|
||||
(pthread_0_counter != pthread_0_signal_counter15) ||
|
||||
(pthread_0_counter != pthread_0_signal_counter14) ||
|
||||
(pthread_0_counter != pthread_0_signal_counter13))
|
||||
{
|
||||
|
||||
error_handler();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return(&pt0_status);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user