summaryrefslogtreecommitdiffstats
path: root/posix_api/psx_pthread_report/pthread_attr_report.c
diff options
context:
space:
mode:
Diffstat (limited to 'posix_api/psx_pthread_report/pthread_attr_report.c')
-rw-r--r--posix_api/psx_pthread_report/pthread_attr_report.c154
1 files changed, 154 insertions, 0 deletions
diff --git a/posix_api/psx_pthread_report/pthread_attr_report.c b/posix_api/psx_pthread_report/pthread_attr_report.c
new file mode 100644
index 0000000..ff2f179
--- /dev/null
+++ b/posix_api/psx_pthread_report/pthread_attr_report.c
@@ -0,0 +1,154 @@
+/*
+ * Program to print default pthread attributes
+ */
+
+/*
+ * Copyright 2018 Joel Sherrill (joel@rtems.org)
+ *
+ * This file's license is 2-clause BSD as in this distribution's LICENSE.2 file.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <pthread.h>
+#include <assert.h>
+
+static void print_stack_info(pthread_attr_t *attr)
+{
+ int rc;
+ void *addr;
+ size_t size;
+
+ /*
+ * pthread_attr_getstacksize() and pthread_attr_[sg]etstackaddr() are
+ * obsolete.
+ */
+
+ rc = pthread_attr_getstack( attr, &addr, &size );
+ assert( rc == 0 );
+ printf( "Stack size: %zu\n", size );
+ printf( "Stack address: %p\n", addr );
+
+ rc = pthread_attr_getguardsize( attr, &size );
+ assert( rc == 0 );
+ printf( "Stack guard size: %zu\n", size );
+
+}
+
+static void print_inherit_scheduler(pthread_attr_t *attr)
+{
+ int rc;
+ int sched;
+ char *s;
+
+ rc = pthread_attr_getinheritsched( attr, &sched );
+ assert( rc == 0 );
+
+ switch( sched ) {
+ case PTHREAD_INHERIT_SCHED: s = "PTHREAD_INHERIT_SCHED"; break;
+ case PTHREAD_EXPLICIT_SCHED: s = "PTHREAD_EXPLICIT_SCHED"; break;
+ default: s = "UNKNOWN"; break;
+ }
+
+ printf( "Inherit scheduler: %s\n", s );
+}
+
+static void print_scope(pthread_attr_t *attr)
+{
+ int rc;
+ int scope;
+ char *s;
+
+ rc = pthread_attr_getscope( attr, &scope );
+ assert( rc == 0 );
+
+ switch( scope ) {
+ case PTHREAD_SCOPE_SYSTEM: s = "PTHREAD_SCOPE_SYSTEM"; break;
+ case PTHREAD_SCOPE_PROCESS: s = "PTHREAD_SCOPE_PROCESS"; break;
+ default: s = "UNKNOWN"; break;
+ }
+
+ printf( "Thread scope: %s\n", s );
+}
+
+static void print_detach_state(pthread_attr_t *attr)
+{
+ int rc;
+ int state;
+ char *s;
+
+ rc = pthread_attr_getdetachstate( attr, &state );
+ assert( rc == 0 );
+
+ switch( state ) {
+ case PTHREAD_CREATE_JOINABLE: s = "PTHREAD_CREATE_JOINABLE"; break;
+ case PTHREAD_CREATE_DETACHED: s = "PTHREAD_CREATE_DETACHED"; break;
+ default: s = "UNKNOWN"; break;
+ }
+
+ printf( "Thread detach state: %s\n", s );
+}
+
+static void print_sched_info(pthread_attr_t *attr)
+{
+ int rc;
+ int policy;
+ char *s;
+ struct sched_param sched;
+
+ rc = pthread_attr_getschedpolicy( attr, &policy );
+ assert( rc == 0 );
+
+ rc = pthread_attr_getschedparam( attr, &sched );
+ assert( rc == 0 );
+
+ switch( policy ) {
+ case SCHED_OTHER: s = "SCHED_OTHER"; break;
+ case SCHED_FIFO: s = "SCHED_FIFO"; break;
+ case SCHED_RR: s = "SCHED_RR"; break;
+#if defined(SCHED_SPORADIC)
+ case SCHED_SPORADIC: s = "SCHED_SPORADIC"; break;
+#endif
+ default: s = "UNKNOWN"; break;
+ }
+
+ printf( "Scheduler policy : %s\n", s );
+ printf( "Scheduler priority : %d\n", sched.sched_priority );
+#if defined(SCHED_SPORADIC)
+ if ( policy == SCHED_SPORADIC ) {
+ printf(
+ "Sporadic low priority : %d\n"
+ "Sporadic period: %lld:%ld\n"
+ "Sporadic initial budget: %lld:%ld\n"
+ "Sporadic max pending replenishments: %d\n",
+ sched.sched_ss_low_priority,
+ (long long) sched.sched_ss_repl_period.tv_sec,
+ sched.sched_ss_repl_period.tv_nsec,
+ (long long) sched.sched_ss_init_budget.tv_sec,
+ sched.sched_ss_init_budget.tv_nsec,
+ sched.sched_ss_max_repl
+ );
+ }
+#endif
+}
+
+int main()
+{
+ pthread_attr_t attr;
+ int rc;
+
+ puts( "*** POSIX Thread Default Attributes Report ***" );
+
+ rc = pthread_attr_init( &attr );
+ assert( rc == 0 );
+
+ print_stack_info( &attr );
+ print_inherit_scheduler( &attr );
+ print_scope( &attr );
+ print_detach_state( &attr );
+ print_sched_info( &attr );
+
+ puts( "*** END OF POSIX Thread Default Attributes Report ***" );
+ exit( 0 );
+}