mirror of
https://github.com/azure-rtos/threadx
synced 2025-02-06 08:08:27 +08:00
229 lines
4.8 KiB
C
229 lines
4.8 KiB
C
/* 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);
|
|
}
|
|
|