summaryrefslogtreecommitdiffstats
path: root/testsuites/sptests/sp36
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2007-12-21 15:50:52 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2007-12-21 15:50:52 +0000
commit03c6ff399ea748eb22eb6d479443d8b00b30a7aa (patch)
tree9d7b979c15c7eaeabb16f2a6315f9ddf0f44dd5b /testsuites/sptests/sp36
parent2007-12-21 Xi Yang <hiyangxi@gmail.com> (diff)
downloadrtems-03c6ff399ea748eb22eb6d479443d8b00b30a7aa.tar.bz2
2007-12-21 Joel Sherrill <joel.sherrill@OARcorp.com>
* sp36/strict_order_mut.c: New file.
Diffstat (limited to 'testsuites/sptests/sp36')
-rw-r--r--testsuites/sptests/sp36/strict_order_mut.c205
1 files changed, 205 insertions, 0 deletions
diff --git a/testsuites/sptests/sp36/strict_order_mut.c b/testsuites/sptests/sp36/strict_order_mut.c
new file mode 100644
index 0000000000..d1a735aa07
--- /dev/null
+++ b/testsuites/sptests/sp36/strict_order_mut.c
@@ -0,0 +1,205 @@
+/*
+ * Simple test program to demonstrate strict order mutex
+ *
+ */
+
+#define CONFIGURE_INIT
+
+#include <bsp.h>
+#include <stdio.h>
+#include "tmacros.h"
+
+
+#define BACK_TYPE(_type_in_ptr,_type_out,_type_in_name) \
+ ((_type_out *)((unsigned int)_type_in_ptr - (unsigned int)(&((_type_out *)0)->_type_in_name)))
+
+
+/* configuration information */
+
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_EXTRA_TASK_STACKS (RTEMS_MINIMUM_STACK_SIZE * 3)
+
+#define CONFIGURE_MAXIMUM_TASKS 10
+#define CONFIGURE_MAXIMUM_SEMAPHORES 10
+
+
+void p_mutex_chain(Thread_Control *the_thread);
+rtems_task Task0(rtems_task_argument ignored);
+rtems_task Task1(rtems_task_argument ignored);
+rtems_task Init(rtems_task_argument ignored);
+rtems_task_priority Get_current_pri(void);
+
+
+#include <rtems/confdefs.h>
+
+
+
+rtems_id Task_id[4];
+rtems_name Task_name[4];
+
+rtems_id Mutex_id[4];
+rtems_name Mutex_name[4];
+
+rtems_task Init(rtems_task_argument ignored)
+{
+ rtems_status_code status;
+ printf("\n----------------TEST 36 ------------\n");
+
+ Mutex_name[0] = rtems_build_name( 'S','0',' ',' ');
+ status = rtems_semaphore_create(
+ Mutex_name[0],
+ 1,
+ RTEMS_LOCAL|
+ RTEMS_SIMPLE_BINARY_SEMAPHORE|
+ RTEMS_INHERIT_PRIORITY|
+ RTEMS_PRIORITY,
+ 0,
+ &Mutex_id[0]);
+ directive_failed( status, "rtems_semaphore_create of S0");
+ printf("Create S0, Inherit_priority\n");
+
+ Mutex_name[1] = rtems_build_name( 'S','1',' ',' ');
+ status = rtems_semaphore_create(
+ Mutex_name[1],
+ 1,
+ RTEMS_LOCAL|
+ RTEMS_SIMPLE_BINARY_SEMAPHORE|
+ RTEMS_PRIORITY_CEILING|
+ RTEMS_PRIORITY,
+ 1,
+ &Mutex_id[1]);
+ directive_failed( status, "rtems_semaphore_create of S1");
+ printf("Create S1, Priority_celling is 1\n");
+
+ Mutex_name[2] = rtems_build_name( 'S','Y','N','C');
+
+
+ Task_name[0] = rtems_build_name( 'T','0',' ',' ');
+ status = rtems_task_create(
+ Task_name[0],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE *2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[0]
+ );
+ directive_failed( status,"rtems_task_create of T0");
+ printf("Create T0,priority is 4\n");
+
+
+
+ status = rtems_task_start( Task_id[0],Task0, 0);
+ directive_failed( status,"rtems_task_start of T0");
+
+ status = rtems_task_delete( RTEMS_SELF);
+ directive_failed( status,"rtems_task_delete of INIT");
+}
+
+
+rtems_task Task0(rtems_task_argument ignored)
+{
+ rtems_status_code status;
+
+
+ status = rtems_semaphore_obtain(
+ Mutex_id[0],
+ RTEMS_WAIT,
+ 0);
+ printf("T0 rtems_semaphore_obtain - S0\n");
+ directive_failed( status,"rtems_semaphore_obtain of S0\n");
+ printf("The current priority of T0 is %d\n",Get_current_pri());
+
+ status = rtems_semaphore_obtain(
+ Mutex_id[1],
+ RTEMS_WAIT,
+ 0);
+ printf("T0 rtems_semaphore_obtain - S1\n");
+ directive_failed( status,"rtems_semaphore_obtain of S1");
+ printf("The current priority of T0 is %d\n",Get_current_pri());
+
+
+
+
+ status = rtems_semaphore_release( Mutex_id[0] );
+ printf("T0 - rtems_semaphore_release - S0\n");
+ if(status == CORE_MUTEX_RELEASE_NOT_ORDER)
+ printf("T0 releasing S0 not in order\n");
+
+ status = rtems_semaphore_release(Mutex_id[1]);
+ printf("T0 - rtems_semaphore_release - S1\n");
+ directive_failed( status,"rtems_semaphore_release of S1\n");
+ printf("The current priority of T0 is %d\n",Get_current_pri());
+
+
+ Task_name[1] = rtems_build_name( 'T','1',' ',' ');
+ status = rtems_task_create(
+ Task_name[1],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE *2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[1]
+ );
+ directive_failed( status , "rtems_task_create of T1\n");
+ printf("Create S1,priority is 1\n");
+
+
+ status = rtems_task_start( Task_id[1],Task1, 0);
+ directive_failed( status, "rtems_task_start of T1\n");
+
+ printf("The current priority of T0 is %d\n",Get_current_pri());
+
+ status = rtems_semaphore_release(Mutex_id[0]);
+ printf("T0 - rtems_semaphore_release - S0\n");
+ directive_failed( status, "rtems_semaphore_release of S0\n");
+
+}
+
+
+rtems_task Task1(rtems_task_argument ignored)
+{
+
+ rtems_status_code status;
+ status = rtems_semaphore_obtain(
+ Mutex_id[0],
+ RTEMS_WAIT,
+ 0);
+ printf("T1 - rtems_semaphore_obtain - S0");
+ directive_failed( status," rtems_semaphore_obtain S0");
+}
+
+
+rtems_task_priority Get_current_pri(void)
+{
+ rtems_status_code status;
+ rtems_task_priority pri;
+ status = rtems_task_set_priority(RTEMS_SELF,
+ RTEMS_CURRENT_PRIORITY,
+ &pri);
+ directive_failed( status, " rtems_task_set_priority ");
+ return pri;
+}
+
+/*void p_mutex_chain(Thread_Control *the_thread)
+{
+ Chain_Control *con = &the_thread->lock_mutex;
+ Chain_Node * node = con->first;
+ CORE_mutex_Control * p_mutex ;
+
+ if(!_Chain_Is_empty(&the_thread->lock_mutex)){
+ while(node != _Chain_Tail(con)){
+ p_mutex = BACK_TYPE(node,CORE_mutex_Control,queue);
+ printf("node:Id=%p,priority_before=%d,"
+ "holder_id=%d,holder's current priority=%d\n",node,
+ ((CORE_mutex_order_list *)node)->priority_before,p_mutex->holder_id,p_mutex->holder->current_priority);
+ node = node->next;
+ }
+ }
+ else
+ printf("the Chain is empty\n");
+}
+*/