forked from Imagelibrary/rtems
posix: Implement self-contained POSIX mutex
POSIX mutexes are now available in all configurations and no longer depend on --enable-posix. Update #2514. Update #3112.
This commit is contained in:
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
/*
|
||||
* Put the overrides of default configuration parameters here.
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 2
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 1
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 1
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 3
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 5
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 2
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 7
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#define CONFIGURE_MAXIMUM_TASKS 1
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
|
||||
@@ -1514,6 +1514,7 @@ rtems_bdbuf_do_init (void)
|
||||
uint8_t* buffer;
|
||||
size_t b;
|
||||
rtems_status_code sc;
|
||||
bool locked;
|
||||
|
||||
if (rtems_bdbuf_tracer)
|
||||
printf ("bdbuf:init\n");
|
||||
@@ -1546,7 +1547,8 @@ rtems_bdbuf_do_init (void)
|
||||
|
||||
sc = rtems_bdbuf_lock_create (rtems_build_name ('B', 'D', 'C', 'l'),
|
||||
&bdbuf_cache.lock);
|
||||
if (sc != RTEMS_SUCCESSFUL)
|
||||
locked = (sc == RTEMS_SUCCESSFUL);
|
||||
if (!locked)
|
||||
goto error;
|
||||
|
||||
rtems_bdbuf_lock_cache ();
|
||||
@@ -1729,7 +1731,7 @@ error:
|
||||
rtems_bdbuf_waiter_delete (&bdbuf_cache.transfer_waiters);
|
||||
rtems_bdbuf_lock_delete (&bdbuf_cache.sync_lock);
|
||||
|
||||
if (bdbuf_cache.lock != 0)
|
||||
if (locked)
|
||||
{
|
||||
rtems_bdbuf_unlock_cache ();
|
||||
rtems_bdbuf_lock_delete (&bdbuf_cache.lock);
|
||||
|
||||
@@ -112,7 +112,6 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
uint32_t active_message_queues;
|
||||
uint32_t active_mutexes;
|
||||
uint32_t active_semaphores;
|
||||
uint32_t active_threads;
|
||||
uint32_t active_timers;
|
||||
|
||||
@@ -68,7 +68,6 @@ static const struct {
|
||||
#ifdef RTEMS_POSIX_API
|
||||
,
|
||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_MESSAGE_QUEUES },
|
||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_MUTEXES },
|
||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_SEMAPHORES },
|
||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_THREADS },
|
||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_TIMERS }
|
||||
|
||||
@@ -21,6 +21,7 @@ include_rtems_posix_HEADERS += include/rtems/posix/condimpl.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/key.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/keyimpl.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/config.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/muteximpl.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/posixapi.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/priorityimpl.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/rwlockimpl.h
|
||||
@@ -38,8 +39,6 @@ include_rtems_posix_HEADERS += include/rtems/posix/aio_misc.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/mmanimpl.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/mqueue.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/mqueueimpl.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/mutex.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/muteximpl.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/psignal.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/psignalimpl.h
|
||||
include_rtems_posix_HEADERS += include/rtems/posix/pthread.h
|
||||
@@ -80,6 +79,16 @@ libposix_a_SOURCES += src/condattrdestroy.c \
|
||||
src/condinit.c src/condsignal.c src/condsignalsupp.c \
|
||||
src/condtimedwait.c src/condwait.c src/condwaitsupp.c
|
||||
|
||||
## MUTEX_C_FILES
|
||||
libposix_a_SOURCES += src/mutexattrdestroy.c src/mutexattrgetprioceiling.c \
|
||||
src/mutexattrgetprotocol.c src/mutexattrgetpshared.c \
|
||||
src/mutexattrgettype.c src/mutexattrinit.c src/mutexattrsetprioceiling.c \
|
||||
src/mutexattrsetprotocol.c src/mutexattrsetpshared.c \
|
||||
src/mutexattrsettype.c src/mutexdestroy.c \
|
||||
src/mutexgetprioceiling.c src/mutexinit.c src/mutexlock.c \
|
||||
src/mutexlocksupp.c src/mutexsetprioceiling.c src/mutextimedlock.c \
|
||||
src/mutextrylock.c src/mutexunlock.c
|
||||
|
||||
if HAS_PTHREADS
|
||||
libposix_a_SOURCES += src/pthreadatfork.c
|
||||
|
||||
@@ -113,16 +122,6 @@ libposix_a_SOURCES += src/mqueue.c src/mqueueclose.c \
|
||||
src/mqueuetimedsend.c \
|
||||
src/mqueueunlink.c
|
||||
|
||||
## MUTEX_C_FILES
|
||||
libposix_a_SOURCES += src/mutexattrdestroy.c src/mutexattrgetprioceiling.c \
|
||||
src/mutexattrgetprotocol.c src/mutexattrgetpshared.c \
|
||||
src/mutexattrgettype.c src/mutexattrinit.c src/mutexattrsetprioceiling.c \
|
||||
src/mutexattrsetprotocol.c src/mutexattrsetpshared.c \
|
||||
src/mutexattrsettype.c src/mutex.c src/mutexdestroy.c src/mutexget.c \
|
||||
src/mutexgetprioceiling.c src/mutexinit.c src/mutexlock.c \
|
||||
src/mutexlocksupp.c src/mutexsetprioceiling.c src/mutextimedlock.c \
|
||||
src/mutextrylock.c src/mutexunlock.c
|
||||
|
||||
## PTHREAD_C_FILES
|
||||
libposix_a_SOURCES += src/pthreadatfork.c src/pthreadattrdestroy.c \
|
||||
src/pthreadattrgetdetachstate.c src/pthreadattrgetinheritsched.c \
|
||||
|
||||
@@ -62,12 +62,6 @@ typedef struct {
|
||||
*/
|
||||
uint32_t maximum_threads;
|
||||
|
||||
/**
|
||||
* This field contains the maximum number of POSIX API
|
||||
* mutexes which are configured for this application.
|
||||
*/
|
||||
uint32_t maximum_mutexes;
|
||||
|
||||
/**
|
||||
* This field contains the maximum number of POSIX API
|
||||
* timers which are configured for this application.
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @brief POSIX MUTEX Support
|
||||
*
|
||||
* This include file contains all the private support information for
|
||||
* POSIX mutex's.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2011.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef _RTEMS_POSIX_MUTEX_H
|
||||
#define _RTEMS_POSIX_MUTEX_H
|
||||
|
||||
#include <rtems/score/coremutex.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @defgroup POSIX_MUTEX POSIX Mutex Support
|
||||
*
|
||||
* @ingroup POSIXAPI
|
||||
*
|
||||
* @brief Private Support Information for POSIX Mutex
|
||||
*
|
||||
*/
|
||||
/**@{**/
|
||||
|
||||
/**
|
||||
* @brief The POSIX mutex control.
|
||||
*/
|
||||
typedef struct {
|
||||
/**
|
||||
* @brief The object control.
|
||||
*/
|
||||
Objects_Control Object;
|
||||
|
||||
/**
|
||||
* The most general mutex variant supported by a POSIX mutex.
|
||||
*
|
||||
* The priority inheritance or no protocol variants will use only parts of
|
||||
* this structure.
|
||||
*/
|
||||
CORE_ceiling_mutex_Control Mutex;
|
||||
|
||||
/**
|
||||
* @brief The protocol variant.
|
||||
*
|
||||
* @see POSIX_Mutex_Protocol.
|
||||
*/
|
||||
unsigned int protocol : 2;
|
||||
|
||||
/**
|
||||
* @brief Indicates if this is a non-recursive or recursive mutex.
|
||||
*/
|
||||
unsigned int is_recursive : 1;
|
||||
} POSIX_Mutex_Control;
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/* end of include file */
|
||||
@@ -18,18 +18,40 @@
|
||||
#ifndef _RTEMS_POSIX_MUTEXIMPL_H
|
||||
#define _RTEMS_POSIX_MUTEXIMPL_H
|
||||
|
||||
#include <rtems/posix/mutex.h>
|
||||
#include <rtems/score/coremuteximpl.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include <rtems/score/percpu.h>
|
||||
#include <rtems/score/muteximpl.h>
|
||||
#include <rtems/score/threadimpl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
unsigned long flags;
|
||||
Mutex_recursive_Control Recursive;
|
||||
Priority_Node Priority_ceiling;
|
||||
const Scheduler_Control *scheduler;
|
||||
} POSIX_Mutex_Control;
|
||||
|
||||
#define POSIX_MUTEX_PROTOCOL_MASK 0x3UL
|
||||
|
||||
#define POSIX_MUTEX_RECURSIVE 0x4UL
|
||||
|
||||
#define POSIX_MUTEX_FLAGS_MASK 0x7UL
|
||||
|
||||
#define POSIX_MUTEX_MAGIC 0x961c13b8UL
|
||||
|
||||
#define POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS &_Thread_queue_Operations_FIFO
|
||||
|
||||
#define POSIX_MUTEX_PRIORITY_INHERIT_TQ_OPERATIONS \
|
||||
&_Thread_queue_Operations_priority_inherit
|
||||
|
||||
#define POSIX_MUTEX_PRIORITY_CEILING_TQ_OPERATIONS \
|
||||
&_Thread_queue_Operations_priority
|
||||
|
||||
/**
|
||||
* @brief Supported POSIX mutex protocols.
|
||||
*
|
||||
@@ -41,26 +63,30 @@ typedef enum {
|
||||
POSIX_MUTEX_PRIORITY_CEILING
|
||||
} POSIX_Mutex_Protocol;
|
||||
|
||||
/**
|
||||
* The following defines the information control block used to manage
|
||||
* this class of objects.
|
||||
*/
|
||||
extern Objects_Information _POSIX_Mutex_Information;
|
||||
|
||||
/**
|
||||
* The default mutex attributes structure.
|
||||
*/
|
||||
extern const pthread_mutexattr_t _POSIX_Mutex_Default_attributes;
|
||||
|
||||
RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Acquire_critical(
|
||||
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Mutex_Acquire(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
_CORE_mutex_Acquire_critical(
|
||||
&the_mutex->Mutex.Recursive.Mutex,
|
||||
queue_context
|
||||
ISR_Level level;
|
||||
Thread_Control *executing;
|
||||
|
||||
_Thread_queue_Context_initialize( queue_context );
|
||||
_Thread_queue_Context_ISR_disable( queue_context, level );
|
||||
_Thread_queue_Context_set_ISR_level( queue_context, level );
|
||||
executing = _Thread_Executing;
|
||||
_Thread_queue_Queue_acquire_critical(
|
||||
&the_mutex->Recursive.Mutex.Queue.Queue,
|
||||
&executing->Potpourri_stats,
|
||||
&queue_context->Lock_context.Lock_context
|
||||
);
|
||||
|
||||
return executing;
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Release(
|
||||
@@ -68,36 +94,359 @@ RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Release(
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
_CORE_mutex_Release(
|
||||
&the_mutex->Mutex.Recursive.Mutex,
|
||||
_Thread_queue_Queue_release(
|
||||
&the_mutex->Recursive.Mutex.Queue.Queue,
|
||||
&queue_context->Lock_context.Lock_context
|
||||
);
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE POSIX_Mutex_Protocol _POSIX_Mutex_Get_protocol(
|
||||
unsigned long flags
|
||||
)
|
||||
{
|
||||
return flags & POSIX_MUTEX_PROTOCOL_MASK;
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE bool _POSIX_Mutex_Is_recursive(
|
||||
unsigned long flags
|
||||
)
|
||||
{
|
||||
return ( flags & POSIX_MUTEX_RECURSIVE ) != 0;
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Mutex_Get_owner(
|
||||
const POSIX_Mutex_Control *the_mutex
|
||||
)
|
||||
{
|
||||
return the_mutex->Recursive.Mutex.Queue.Queue.owner;
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE bool _POSIX_Mutex_Is_locked(
|
||||
const POSIX_Mutex_Control *the_mutex
|
||||
)
|
||||
{
|
||||
return _POSIX_Mutex_Get_owner( the_mutex ) != NULL;
|
||||
}
|
||||
|
||||
Status_Control _POSIX_Mutex_Seize_slow(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
const Thread_queue_Operations *operations,
|
||||
Thread_Control *executing,
|
||||
bool wait,
|
||||
Thread_queue_Context *queue_context
|
||||
);
|
||||
|
||||
RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Set_owner(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
Thread_Control *owner
|
||||
)
|
||||
{
|
||||
the_mutex->Recursive.Mutex.Queue.Queue.owner = owner;
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE bool _POSIX_Mutex_Is_owner(
|
||||
const POSIX_Mutex_Control *the_mutex,
|
||||
const Thread_Control *the_thread
|
||||
)
|
||||
{
|
||||
return _POSIX_Mutex_Get_owner( the_mutex ) == the_thread;
|
||||
}
|
||||
|
||||
static Status_Control _POSIX_Mutex_Lock_nested(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
unsigned long flags
|
||||
)
|
||||
{
|
||||
|
||||
if ( _POSIX_Mutex_Is_recursive( flags ) ) {
|
||||
++the_mutex->Recursive.nest_level;
|
||||
return STATUS_SUCCESSFUL;
|
||||
} else {
|
||||
return STATUS_NESTING_NOT_ALLOWED;
|
||||
}
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE Status_Control _POSIX_Mutex_Seize(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
unsigned long flags,
|
||||
const Thread_queue_Operations *operations,
|
||||
Thread_Control *executing,
|
||||
bool wait,
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
Thread_Control *owner;
|
||||
|
||||
owner = _POSIX_Mutex_Get_owner( the_mutex );
|
||||
|
||||
if ( owner == NULL ) {
|
||||
_POSIX_Mutex_Set_owner( the_mutex, executing );
|
||||
_Thread_Resource_count_increment( executing );
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return STATUS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
if ( owner == executing ) {
|
||||
Status_Control status;
|
||||
|
||||
status = _POSIX_Mutex_Lock_nested( the_mutex, flags );
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return status;
|
||||
}
|
||||
|
||||
return _POSIX_Mutex_Seize_slow(
|
||||
the_mutex,
|
||||
operations,
|
||||
executing,
|
||||
wait,
|
||||
queue_context
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief POSIX Mutex Allocate
|
||||
*
|
||||
* This function allocates a mutexes control block from
|
||||
* the inactive chain of free mutexes control blocks.
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void )
|
||||
{
|
||||
return (POSIX_Mutex_Control *) _Objects_Allocate( &_POSIX_Mutex_Information );
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief POSIX Mutex Free
|
||||
*
|
||||
* This routine frees a mutexes control block to the
|
||||
* inactive chain of free mutexes control blocks.
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Free(
|
||||
POSIX_Mutex_Control *the_mutex
|
||||
RTEMS_INLINE_ROUTINE Status_Control _POSIX_Mutex_Surrender(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
const Thread_queue_Operations *operations,
|
||||
Thread_Control *executing,
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
_Objects_Free( &_POSIX_Mutex_Information, &the_mutex->Object );
|
||||
unsigned int nest_level;
|
||||
Thread_queue_Heads *heads;
|
||||
|
||||
if ( !_POSIX_Mutex_Is_owner( the_mutex, executing ) ) {
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return STATUS_NOT_OWNER;
|
||||
}
|
||||
|
||||
nest_level = the_mutex->Recursive.nest_level;
|
||||
|
||||
if ( nest_level > 0 ) {
|
||||
the_mutex->Recursive.nest_level = nest_level - 1;
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return STATUS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
_Thread_Resource_count_decrement( executing );
|
||||
_POSIX_Mutex_Set_owner( the_mutex, NULL );
|
||||
|
||||
heads = the_mutex->Recursive.Mutex.Queue.Queue.heads;
|
||||
|
||||
if ( heads == NULL ) {
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return STATUS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
_Thread_queue_Surrender(
|
||||
&the_mutex->Recursive.Mutex.Queue.Queue,
|
||||
heads,
|
||||
executing,
|
||||
queue_context,
|
||||
operations
|
||||
);
|
||||
return STATUS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE const Scheduler_Control *_POSIX_Mutex_Get_scheduler(
|
||||
const POSIX_Mutex_Control *the_mutex
|
||||
)
|
||||
{
|
||||
#if defined(RTEMS_SMP)
|
||||
return the_mutex->scheduler;
|
||||
#else
|
||||
return &_Scheduler_Table[ 0 ];
|
||||
#endif
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Set_priority(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
Priority_Control priority_ceiling,
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
Thread_Control *owner;
|
||||
|
||||
owner = _POSIX_Mutex_Get_owner( the_mutex );
|
||||
|
||||
if ( owner != NULL ) {
|
||||
_Thread_Wait_acquire( owner, queue_context );
|
||||
_Thread_Priority_change(
|
||||
owner,
|
||||
&the_mutex->Priority_ceiling,
|
||||
priority_ceiling,
|
||||
false,
|
||||
queue_context
|
||||
);
|
||||
_Thread_Wait_release( owner, queue_context );
|
||||
} else {
|
||||
the_mutex->Priority_ceiling.priority = priority_ceiling;
|
||||
}
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Mutex_Get_priority(
|
||||
const POSIX_Mutex_Control *the_mutex
|
||||
)
|
||||
{
|
||||
return the_mutex->Priority_ceiling.priority;
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE Status_Control _POSIX_Mutex_Ceiling_set_owner(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
Thread_Control *owner,
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
ISR_lock_Context lock_context;
|
||||
Scheduler_Node *scheduler_node;
|
||||
Per_CPU_Control *cpu_self;
|
||||
|
||||
_Thread_Wait_acquire_default_critical( owner, &lock_context );
|
||||
|
||||
scheduler_node = _Thread_Scheduler_get_home_node( owner );
|
||||
|
||||
if (
|
||||
_Priority_Get_priority( &scheduler_node->Wait.Priority )
|
||||
< the_mutex->Priority_ceiling.priority
|
||||
) {
|
||||
_Thread_Wait_release_default_critical( owner, &lock_context );
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return STATUS_MUTEX_CEILING_VIOLATED;
|
||||
}
|
||||
|
||||
_POSIX_Mutex_Set_owner( the_mutex, owner );
|
||||
_Thread_Resource_count_increment( owner );
|
||||
_Thread_Priority_add(
|
||||
owner,
|
||||
&the_mutex->Priority_ceiling,
|
||||
queue_context
|
||||
);
|
||||
_Thread_Wait_release_default_critical( owner, &lock_context );
|
||||
|
||||
cpu_self = _Thread_Dispatch_disable_critical(
|
||||
&queue_context->Lock_context.Lock_context
|
||||
);
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
_Thread_Priority_update( queue_context );
|
||||
_Thread_Dispatch_enable( cpu_self );
|
||||
return STATUS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE Status_Control _POSIX_Mutex_Ceiling_seize(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
unsigned long flags,
|
||||
Thread_Control *executing,
|
||||
bool wait,
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
Thread_Control *owner;
|
||||
|
||||
owner = _POSIX_Mutex_Get_owner( the_mutex );
|
||||
|
||||
if ( owner == NULL ) {
|
||||
#if defined(RTEMS_SMP)
|
||||
if (
|
||||
_Thread_Scheduler_get_home( executing )
|
||||
!= _POSIX_Mutex_Get_scheduler( the_mutex )
|
||||
) {
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return STATUS_NOT_DEFINED;
|
||||
}
|
||||
#endif
|
||||
|
||||
_Thread_queue_Context_clear_priority_updates( queue_context );
|
||||
return _POSIX_Mutex_Ceiling_set_owner(
|
||||
the_mutex,
|
||||
executing,
|
||||
queue_context
|
||||
);
|
||||
}
|
||||
|
||||
if ( owner == executing ) {
|
||||
Status_Control status;
|
||||
|
||||
status = _POSIX_Mutex_Lock_nested( the_mutex, flags );
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return status;
|
||||
}
|
||||
|
||||
return _POSIX_Mutex_Seize_slow(
|
||||
the_mutex,
|
||||
POSIX_MUTEX_PRIORITY_CEILING_TQ_OPERATIONS,
|
||||
executing,
|
||||
wait,
|
||||
queue_context
|
||||
);
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE Status_Control _POSIX_Mutex_Ceiling_surrender(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
Thread_Control *executing,
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
unsigned int nest_level;
|
||||
ISR_lock_Context lock_context;
|
||||
Per_CPU_Control *cpu_self;
|
||||
Thread_queue_Heads *heads;
|
||||
|
||||
if ( !_POSIX_Mutex_Is_owner( the_mutex, executing ) ) {
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return STATUS_NOT_OWNER;
|
||||
}
|
||||
|
||||
nest_level = the_mutex->Recursive.nest_level;
|
||||
|
||||
if ( nest_level > 0 ) {
|
||||
the_mutex->Recursive.nest_level = nest_level - 1;
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return STATUS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
_Thread_Resource_count_decrement( executing );
|
||||
|
||||
_Thread_queue_Context_clear_priority_updates( queue_context );
|
||||
_Thread_Wait_acquire_default_critical( executing, &lock_context );
|
||||
_Thread_Priority_remove(
|
||||
executing,
|
||||
&the_mutex->Priority_ceiling,
|
||||
queue_context
|
||||
);
|
||||
_Thread_Wait_release_default_critical( executing, &lock_context );
|
||||
|
||||
cpu_self = _Thread_Dispatch_disable_critical(
|
||||
&queue_context->Lock_context.Lock_context
|
||||
);
|
||||
|
||||
heads = the_mutex->Recursive.Mutex.Queue.Queue.heads;
|
||||
|
||||
if ( heads != NULL ) {
|
||||
const Thread_queue_Operations *operations;
|
||||
Thread_Control *new_owner;
|
||||
|
||||
operations = POSIX_MUTEX_PRIORITY_CEILING_TQ_OPERATIONS;
|
||||
new_owner = ( *operations->first )( heads );
|
||||
_POSIX_Mutex_Set_owner( the_mutex, new_owner );
|
||||
_Thread_Resource_count_increment( new_owner );
|
||||
_Thread_Priority_add(
|
||||
new_owner,
|
||||
&the_mutex->Priority_ceiling,
|
||||
queue_context
|
||||
);
|
||||
_Thread_queue_Extract_critical(
|
||||
&the_mutex->Recursive.Mutex.Queue.Queue,
|
||||
operations,
|
||||
new_owner,
|
||||
queue_context
|
||||
);
|
||||
} else {
|
||||
_POSIX_Mutex_Set_owner( the_mutex, NULL );
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
}
|
||||
|
||||
_Thread_Priority_update( queue_context );
|
||||
_Thread_Dispatch_enable( cpu_self );
|
||||
return STATUS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief POSIX Mutex Lock Support Method
|
||||
@@ -111,29 +460,32 @@ int _POSIX_Mutex_Lock_support(
|
||||
Watchdog_Interval timeout
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief POSIX Mutex Get (Interrupt Disable)
|
||||
*
|
||||
* A support routine which translates the mutex id into a local pointer.
|
||||
* As a side-effect, it may create the mutex.
|
||||
*
|
||||
* @note: This version of the method uses an interrupt critical section.
|
||||
*/
|
||||
POSIX_Mutex_Control *_POSIX_Mutex_Get(
|
||||
pthread_mutex_t *mutex,
|
||||
Thread_queue_Context *queue_context
|
||||
);
|
||||
|
||||
RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get_no_protection(
|
||||
const pthread_mutex_t *mutex
|
||||
static inline POSIX_Mutex_Control *_POSIX_Mutex_Get(
|
||||
pthread_mutex_t *mutex
|
||||
)
|
||||
{
|
||||
return (POSIX_Mutex_Control *) _Objects_Get_no_protection(
|
||||
(Objects_Id) *mutex,
|
||||
&_POSIX_Mutex_Information
|
||||
);
|
||||
return (POSIX_Mutex_Control *) mutex;
|
||||
}
|
||||
|
||||
bool _POSIX_Mutex_Auto_initialization( POSIX_Mutex_Control *the_mutex );
|
||||
|
||||
#define POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags ) \
|
||||
do { \
|
||||
if ( ( the_mutex ) == NULL ) { \
|
||||
return EINVAL; \
|
||||
} \
|
||||
flags = ( the_mutex )->flags; \
|
||||
if ( \
|
||||
( ( (uintptr_t) ( the_mutex ) ^ POSIX_MUTEX_MAGIC ) \
|
||||
& ~POSIX_MUTEX_FLAGS_MASK ) \
|
||||
!= ( flags & ~POSIX_MUTEX_FLAGS_MASK ) \
|
||||
) { \
|
||||
if ( !_POSIX_Mutex_Auto_initialization( the_mutex ) ) { \
|
||||
return EINVAL; \
|
||||
} \
|
||||
} \
|
||||
} while ( 0 )
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -47,6 +47,10 @@ $(PROJECT_INCLUDE)/rtems/posix/config.h: include/rtems/posix/config.h $(PROJECT_
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/config.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/config.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/posix/muteximpl.h: include/rtems/posix/muteximpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/muteximpl.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/muteximpl.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/posix/posixapi.h: include/rtems/posix/posixapi.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/posixapi.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/posixapi.h
|
||||
@@ -96,14 +100,6 @@ $(PROJECT_INCLUDE)/rtems/posix/mqueueimpl.h: include/rtems/posix/mqueueimpl.h $(
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/mqueueimpl.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/mqueueimpl.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/posix/mutex.h: include/rtems/posix/mutex.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/mutex.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/mutex.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/posix/muteximpl.h: include/rtems/posix/muteximpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/muteximpl.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/muteximpl.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/posix/psignal.h: include/rtems/posix/psignal.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/psignal.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/psignal.h
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @brief POSIX Mutex Manager Initialization
|
||||
* @ingroup POSIX_MUTEX POSIX Mutex Support
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2008.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#include <rtems/config.h>
|
||||
#include <rtems/sysinit.h>
|
||||
#include <rtems/posix/muteximpl.h>
|
||||
#include <rtems/score/objectimpl.h>
|
||||
|
||||
Objects_Information _POSIX_Mutex_Information;
|
||||
|
||||
const pthread_mutexattr_t _POSIX_Mutex_Default_attributes = {
|
||||
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
|
||||
.type = PTHREAD_MUTEX_DEFAULT,
|
||||
#endif
|
||||
.is_initialized = true,
|
||||
.process_shared = PTHREAD_PROCESS_PRIVATE,
|
||||
.prio_ceiling = INT_MAX,
|
||||
.protocol = PTHREAD_PRIO_NONE,
|
||||
.recursive = false
|
||||
};
|
||||
|
||||
/*
|
||||
* _POSIX_Mutex_Manager_initialization
|
||||
*
|
||||
* This routine initializes all mutex manager related data structures.
|
||||
*
|
||||
* Input parameters:
|
||||
* maximum_mutexes - maximum configured mutexes
|
||||
*
|
||||
* Output parameters: NONE
|
||||
*/
|
||||
|
||||
static void _POSIX_Mutex_Manager_initialization(void)
|
||||
{
|
||||
/*
|
||||
* Initialize the POSIX mutex object class information structure.
|
||||
*/
|
||||
_Objects_Initialize_information(
|
||||
&_POSIX_Mutex_Information, /* object information table */
|
||||
OBJECTS_POSIX_API, /* object API */
|
||||
OBJECTS_POSIX_MUTEXES, /* object class */
|
||||
Configuration_POSIX_API.maximum_mutexes,
|
||||
/* maximum objects of this class */
|
||||
sizeof( POSIX_Mutex_Control ),
|
||||
/* size of this object's control block */
|
||||
true, /* true if names for this object are strings */
|
||||
_POSIX_PATH_MAX, /* maximum length of each object's name */
|
||||
NULL /* Proxy extraction support callout */
|
||||
);
|
||||
}
|
||||
|
||||
RTEMS_SYSINIT_ITEM(
|
||||
_POSIX_Mutex_Manager_initialization,
|
||||
RTEMS_SYSINIT_POSIX_MUTEX,
|
||||
RTEMS_SYSINIT_ORDER_MIDDLE
|
||||
);
|
||||
@@ -29,37 +29,22 @@ int pthread_mutex_destroy(
|
||||
)
|
||||
{
|
||||
POSIX_Mutex_Control *the_mutex;
|
||||
unsigned long flags;
|
||||
Thread_queue_Context queue_context;
|
||||
int eno;
|
||||
|
||||
_Objects_Allocator_lock();
|
||||
the_mutex = _POSIX_Mutex_Get( mutex );
|
||||
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
|
||||
|
||||
the_mutex = _POSIX_Mutex_Get( mutex, &queue_context );
|
||||
_POSIX_Mutex_Acquire( the_mutex, &queue_context );
|
||||
|
||||
if ( the_mutex != NULL ) {
|
||||
_POSIX_Mutex_Acquire_critical( the_mutex, &queue_context );
|
||||
|
||||
/*
|
||||
* XXX: There is an error for the mutex being locked
|
||||
* or being in use by a condition variable.
|
||||
*/
|
||||
|
||||
if (
|
||||
!_CORE_mutex_Is_locked( &the_mutex->Mutex.Recursive.Mutex )
|
||||
) {
|
||||
_Objects_Close( &_POSIX_Mutex_Information, &the_mutex->Object );
|
||||
_POSIX_Mutex_Release( the_mutex, &queue_context );
|
||||
_CORE_mutex_Destroy( &the_mutex->Mutex.Recursive.Mutex );
|
||||
_POSIX_Mutex_Free( the_mutex );
|
||||
eno = 0;
|
||||
} else {
|
||||
_POSIX_Mutex_Release( the_mutex, &queue_context );
|
||||
eno = EBUSY;
|
||||
}
|
||||
if ( _POSIX_Mutex_Get_owner( the_mutex ) == NULL ) {
|
||||
the_mutex->flags = ~the_mutex->flags;
|
||||
eno = 0;
|
||||
} else {
|
||||
eno = EINVAL;
|
||||
eno = EBUSY;
|
||||
}
|
||||
|
||||
_Objects_Allocator_unlock();
|
||||
_POSIX_Mutex_Release( the_mutex, &queue_context );
|
||||
return eno;
|
||||
}
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @brief Convert POSIX Mutex ID to local object pointer
|
||||
* @ingroup POSIXAPI
|
||||
*/
|
||||
|
||||
/*
|
||||
* COPYRIGHT (c) 1989-2007.
|
||||
* On-Line Applications Research Corporation (OAR).
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/posix/muteximpl.h>
|
||||
#include <rtems/posix/posixapi.h>
|
||||
|
||||
POSIX_Mutex_Control *_POSIX_Mutex_Get(
|
||||
pthread_mutex_t *mutex,
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
_POSIX_Get_object_body(
|
||||
POSIX_Mutex_Control,
|
||||
mutex,
|
||||
queue_context,
|
||||
&_POSIX_Mutex_Information,
|
||||
PTHREAD_MUTEX_INITIALIZER,
|
||||
pthread_mutex_init
|
||||
);
|
||||
}
|
||||
@@ -31,30 +31,27 @@ int pthread_mutex_getprioceiling(
|
||||
)
|
||||
{
|
||||
POSIX_Mutex_Control *the_mutex;
|
||||
unsigned long flags;
|
||||
Thread_queue_Context queue_context;
|
||||
|
||||
if ( prioceiling == NULL ) {
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
the_mutex = _POSIX_Mutex_Get( mutex, &queue_context );
|
||||
the_mutex = _POSIX_Mutex_Get( mutex );
|
||||
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
|
||||
|
||||
if ( the_mutex == NULL ) {
|
||||
return EINVAL;
|
||||
}
|
||||
_POSIX_Mutex_Acquire( the_mutex, &queue_context );
|
||||
|
||||
_POSIX_Mutex_Acquire_critical( the_mutex, &queue_context );
|
||||
|
||||
if ( the_mutex->protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
|
||||
if ( _POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_CEILING ) {
|
||||
*prioceiling = _POSIX_Priority_From_core(
|
||||
_CORE_ceiling_mutex_Get_scheduler( &the_mutex->Mutex ),
|
||||
_CORE_ceiling_mutex_Get_priority( &the_mutex->Mutex )
|
||||
_POSIX_Mutex_Get_scheduler( the_mutex ),
|
||||
_POSIX_Mutex_Get_priority( the_mutex )
|
||||
);
|
||||
} else {
|
||||
*prioceiling = 0;
|
||||
}
|
||||
|
||||
_POSIX_Mutex_Release( the_mutex, &queue_context );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,46 @@
|
||||
#include <rtems/posix/priorityimpl.h>
|
||||
#include <rtems/score/schedulerimpl.h>
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
offsetof( POSIX_Mutex_Control, flags )
|
||||
== offsetof( pthread_mutex_t, _flags ),
|
||||
POSIX_MUTEX_CONTROL_FLAGS
|
||||
);
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
offsetof( POSIX_Mutex_Control, Recursive )
|
||||
== offsetof( pthread_mutex_t, _Recursive ),
|
||||
POSIX_MUTEX_CONTROL_RECURSIVE
|
||||
);
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
offsetof( POSIX_Mutex_Control, Priority_ceiling )
|
||||
== offsetof( pthread_mutex_t, _Priority_ceiling ),
|
||||
POSIX_MUTEX_CONTROL_SCHEDULER
|
||||
);
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
offsetof( POSIX_Mutex_Control, scheduler )
|
||||
== offsetof( pthread_mutex_t, _scheduler ),
|
||||
POSIX_MUTEX_CONTROL_SCHEDULER
|
||||
);
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
sizeof( POSIX_Mutex_Control ) == sizeof( pthread_mutex_t ),
|
||||
POSIX_MUTEX_CONTROL_SIZE
|
||||
);
|
||||
|
||||
const pthread_mutexattr_t _POSIX_Mutex_Default_attributes = {
|
||||
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
|
||||
.type = PTHREAD_MUTEX_DEFAULT,
|
||||
#endif
|
||||
.is_initialized = true,
|
||||
.process_shared = PTHREAD_PROCESS_PRIVATE,
|
||||
.prio_ceiling = INT_MAX,
|
||||
.protocol = PTHREAD_PRIO_NONE,
|
||||
.recursive = false
|
||||
};
|
||||
|
||||
/**
|
||||
* 11.3.2 Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87
|
||||
*
|
||||
@@ -38,6 +78,8 @@ int pthread_mutex_init(
|
||||
POSIX_Mutex_Control *the_mutex;
|
||||
const pthread_mutexattr_t *the_attr;
|
||||
POSIX_Mutex_Protocol protocol;
|
||||
unsigned long flags;
|
||||
Priority_Control priority;
|
||||
const Scheduler_Control *scheduler;
|
||||
|
||||
if ( attr ) the_attr = attr;
|
||||
@@ -101,20 +143,21 @@ int pthread_mutex_init(
|
||||
}
|
||||
#endif
|
||||
|
||||
the_mutex = _POSIX_Mutex_Allocate();
|
||||
the_mutex = _POSIX_Mutex_Get( mutex );
|
||||
|
||||
if ( !the_mutex ) {
|
||||
_Objects_Allocator_unlock();
|
||||
return EAGAIN;
|
||||
flags = (uintptr_t) the_mutex ^ POSIX_MUTEX_MAGIC;
|
||||
flags &= ~POSIX_MUTEX_FLAGS_MASK;
|
||||
flags |= protocol;
|
||||
|
||||
if ( the_attr->type == PTHREAD_MUTEX_RECURSIVE ) {
|
||||
flags |= POSIX_MUTEX_RECURSIVE;
|
||||
}
|
||||
|
||||
the_mutex->protocol = protocol;
|
||||
the_mutex->is_recursive = ( the_attr->type == PTHREAD_MUTEX_RECURSIVE );
|
||||
the_mutex->flags = flags;
|
||||
|
||||
if ( protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
|
||||
int prio_ceiling;
|
||||
bool valid;
|
||||
Priority_Control priority;
|
||||
int prio_ceiling;
|
||||
bool valid;
|
||||
|
||||
scheduler = _Thread_Scheduler_get_home( _Thread_Get_executing() );
|
||||
prio_ceiling = the_attr->prio_ceiling;
|
||||
@@ -125,23 +168,19 @@ int pthread_mutex_init(
|
||||
|
||||
priority = _POSIX_Priority_To_core( scheduler, prio_ceiling, &valid );
|
||||
if ( !valid ) {
|
||||
_POSIX_Mutex_Free(the_mutex);
|
||||
_Objects_Allocator_unlock();
|
||||
return EINVAL;
|
||||
}
|
||||
_CORE_ceiling_mutex_Initialize( &the_mutex->Mutex, scheduler, priority );
|
||||
} else {
|
||||
_Assert(
|
||||
the_mutex->protocol == POSIX_MUTEX_NO_PROTOCOL
|
||||
|| the_mutex->protocol == POSIX_MUTEX_PRIORITY_INHERIT
|
||||
);
|
||||
_CORE_recursive_mutex_Initialize( &the_mutex->Mutex.Recursive );
|
||||
priority = 0;
|
||||
scheduler = NULL;
|
||||
}
|
||||
|
||||
_Objects_Open_u32( &_POSIX_Mutex_Information, &the_mutex->Object, 0 );
|
||||
|
||||
*mutex = the_mutex->Object.id;
|
||||
|
||||
_Objects_Allocator_unlock();
|
||||
_Thread_queue_Queue_initialize(
|
||||
&the_mutex->Recursive.Mutex.Queue.Queue,
|
||||
NULL
|
||||
);
|
||||
the_mutex->Recursive.nest_level = 0;
|
||||
_Priority_Node_initialize( &the_mutex->Priority_ceiling, priority );
|
||||
the_mutex->scheduler = scheduler;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -21,27 +21,34 @@
|
||||
#include <rtems/posix/muteximpl.h>
|
||||
#include <rtems/posix/posixapi.h>
|
||||
|
||||
THREAD_QUEUE_OBJECT_ASSERT(
|
||||
POSIX_Mutex_Control,
|
||||
Mutex.Recursive.Mutex.Wait_queue
|
||||
);
|
||||
|
||||
static Status_Control _POSIX_Mutex_Lock_nested(
|
||||
CORE_recursive_mutex_Control *the_recursive_mutex
|
||||
Status_Control _POSIX_Mutex_Seize_slow(
|
||||
POSIX_Mutex_Control *the_mutex,
|
||||
const Thread_queue_Operations *operations,
|
||||
Thread_Control *executing,
|
||||
bool wait,
|
||||
Thread_queue_Context *queue_context
|
||||
)
|
||||
{
|
||||
POSIX_Mutex_Control *the_mutex;
|
||||
|
||||
the_mutex = RTEMS_CONTAINER_OF(
|
||||
the_recursive_mutex,
|
||||
POSIX_Mutex_Control,
|
||||
Mutex.Recursive
|
||||
);
|
||||
|
||||
if ( the_mutex->is_recursive ) {
|
||||
return _CORE_recursive_mutex_Seize_nested( the_recursive_mutex );
|
||||
if ( wait ) {
|
||||
_Thread_queue_Context_set_thread_state(
|
||||
queue_context,
|
||||
STATES_WAITING_FOR_MUTEX
|
||||
);
|
||||
_Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
|
||||
_Thread_queue_Context_set_deadlock_callout(
|
||||
queue_context,
|
||||
_Thread_queue_Deadlock_status
|
||||
);
|
||||
_Thread_queue_Enqueue(
|
||||
&the_mutex->Recursive.Mutex.Queue.Queue,
|
||||
operations,
|
||||
executing,
|
||||
queue_context
|
||||
);
|
||||
return _Thread_Wait_get_status( executing );
|
||||
} else {
|
||||
return STATUS_NESTING_NOT_ALLOWED;
|
||||
_POSIX_Mutex_Release( the_mutex, queue_context );
|
||||
return STATUS_UNAVAILABLE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,47 +59,47 @@ int _POSIX_Mutex_Lock_support(
|
||||
)
|
||||
{
|
||||
POSIX_Mutex_Control *the_mutex;
|
||||
unsigned long flags;
|
||||
Thread_queue_Context queue_context;
|
||||
Thread_Control *executing;
|
||||
Status_Control status;
|
||||
|
||||
the_mutex = _POSIX_Mutex_Get( mutex, &queue_context );
|
||||
the_mutex = _POSIX_Mutex_Get( mutex );
|
||||
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
|
||||
|
||||
if ( the_mutex == NULL ) {
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
executing = _Thread_Executing;
|
||||
executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
|
||||
_Thread_queue_Context_set_relative_timeout( &queue_context, timeout );
|
||||
|
||||
switch ( the_mutex->protocol ) {
|
||||
switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
|
||||
case POSIX_MUTEX_PRIORITY_CEILING:
|
||||
status = _CORE_ceiling_mutex_Seize(
|
||||
&the_mutex->Mutex,
|
||||
status = _POSIX_Mutex_Ceiling_seize(
|
||||
the_mutex,
|
||||
flags,
|
||||
executing,
|
||||
wait,
|
||||
_POSIX_Mutex_Lock_nested,
|
||||
&queue_context
|
||||
);
|
||||
break;
|
||||
case POSIX_MUTEX_NO_PROTOCOL:
|
||||
status = _CORE_recursive_mutex_Seize(
|
||||
&the_mutex->Mutex.Recursive,
|
||||
status = _POSIX_Mutex_Seize(
|
||||
the_mutex,
|
||||
flags,
|
||||
POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
|
||||
executing,
|
||||
wait,
|
||||
_POSIX_Mutex_Lock_nested,
|
||||
&queue_context
|
||||
);
|
||||
break;
|
||||
default:
|
||||
_Assert( the_mutex->protocol == POSIX_MUTEX_PRIORITY_INHERIT );
|
||||
status = _CORE_recursive_mutex_Seize(
|
||||
&the_mutex->Mutex.Recursive,
|
||||
CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
|
||||
_Assert(
|
||||
_POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_INHERIT
|
||||
);
|
||||
status = _POSIX_Mutex_Seize(
|
||||
the_mutex,
|
||||
flags,
|
||||
POSIX_MUTEX_PRIORITY_INHERIT_TQ_OPERATIONS,
|
||||
executing,
|
||||
wait,
|
||||
_POSIX_Mutex_Lock_nested,
|
||||
&queue_context
|
||||
);
|
||||
break;
|
||||
|
||||
@@ -49,17 +49,19 @@ int pthread_mutex_setprioceiling(
|
||||
return EINVAL;
|
||||
}
|
||||
|
||||
the_mutex = _POSIX_Mutex_Get_no_protection( mutex );
|
||||
_Assert( the_mutex != NULL );
|
||||
the_mutex = _POSIX_Mutex_Get( mutex );
|
||||
|
||||
if ( the_mutex->protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
|
||||
if (
|
||||
_POSIX_Mutex_Get_protocol( the_mutex->flags )
|
||||
== POSIX_MUTEX_PRIORITY_CEILING
|
||||
) {
|
||||
const Scheduler_Control *scheduler;
|
||||
bool valid;
|
||||
Priority_Control new_priority;
|
||||
Priority_Control old_priority;
|
||||
|
||||
scheduler = _CORE_ceiling_mutex_Get_scheduler( &the_mutex->Mutex );
|
||||
old_priority = _CORE_ceiling_mutex_Get_priority( &the_mutex->Mutex );
|
||||
scheduler = _POSIX_Mutex_Get_scheduler( the_mutex );
|
||||
old_priority = _POSIX_Mutex_Get_priority( the_mutex );
|
||||
*old_ceiling = _POSIX_Priority_From_core( scheduler, old_priority );
|
||||
|
||||
new_priority = _POSIX_Priority_To_core( scheduler, prioceiling, &valid );
|
||||
@@ -69,8 +71,8 @@ int pthread_mutex_setprioceiling(
|
||||
|
||||
_Thread_queue_Context_initialize( &queue_context );
|
||||
_Thread_queue_Context_clear_priority_updates( &queue_context );
|
||||
_CORE_ceiling_mutex_Set_priority(
|
||||
&the_mutex->Mutex,
|
||||
_POSIX_Mutex_Set_priority(
|
||||
the_mutex,
|
||||
new_priority,
|
||||
&queue_context
|
||||
);
|
||||
|
||||
@@ -21,6 +21,51 @@
|
||||
#include <rtems/posix/muteximpl.h>
|
||||
#include <rtems/posix/posixapi.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
bool _POSIX_Mutex_Auto_initialization( POSIX_Mutex_Control *the_mutex )
|
||||
{
|
||||
unsigned long zero;
|
||||
unsigned long flags;
|
||||
|
||||
/* We cannot use memset() and memcmp() due to structure internal padding */
|
||||
zero = 0;
|
||||
zero |= the_mutex->flags;
|
||||
#if defined(RTEMS_SMP)
|
||||
zero |= _Atomic_Load_uint(
|
||||
&the_mutex->Recursive.Mutex.Queue.Queue.Lock.next_ticket,
|
||||
ATOMIC_ORDER_RELAXED
|
||||
);
|
||||
zero |= _Atomic_Load_uint(
|
||||
&the_mutex->Recursive.Mutex.Queue.Queue.Lock.now_serving,
|
||||
ATOMIC_ORDER_RELAXED
|
||||
);
|
||||
#else
|
||||
zero |= the_mutex->Recursive.Mutex.Queue.reserved[ 0 ];
|
||||
zero |= the_mutex->Recursive.Mutex.Queue.reserved[ 1 ];
|
||||
#endif
|
||||
zero |= (unsigned long) the_mutex->Recursive.Mutex.Queue.Queue.heads;
|
||||
zero |= (unsigned long) the_mutex->Recursive.Mutex.Queue.Queue.owner;
|
||||
zero |= (unsigned long) the_mutex->Recursive.Mutex.Queue.Queue.name;
|
||||
zero |= the_mutex->Recursive.nest_level;
|
||||
zero |= (unsigned long) the_mutex->Priority_ceiling.Node.RBTree.Node.rbe_left;
|
||||
zero |= (unsigned long) the_mutex->Priority_ceiling.Node.RBTree.Node.rbe_right;
|
||||
zero |= (unsigned long) the_mutex->Priority_ceiling.Node.RBTree.Node.rbe_parent;
|
||||
zero |= (unsigned long) the_mutex->Priority_ceiling.Node.RBTree.Node.rbe_color;
|
||||
zero |= (unsigned long) the_mutex->Priority_ceiling.priority;
|
||||
zero |= (unsigned long) (the_mutex->Priority_ceiling.priority >> 32);
|
||||
zero |= (unsigned long) the_mutex->scheduler;
|
||||
|
||||
if ( zero != 0 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
flags = (uintptr_t) the_mutex ^ POSIX_MUTEX_MAGIC;
|
||||
flags &= ~POSIX_MUTEX_FLAGS_MASK;
|
||||
the_mutex->flags = flags;
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
|
||||
*
|
||||
@@ -32,39 +77,39 @@ int pthread_mutex_unlock(
|
||||
)
|
||||
{
|
||||
POSIX_Mutex_Control *the_mutex;
|
||||
unsigned long flags;
|
||||
Thread_queue_Context queue_context;
|
||||
Thread_Control *executing;
|
||||
Status_Control status;
|
||||
|
||||
the_mutex = _POSIX_Mutex_Get( mutex, &queue_context );
|
||||
the_mutex = _POSIX_Mutex_Get( mutex );
|
||||
POSIX_MUTEX_VALIDATE_OBJECT( the_mutex, flags );
|
||||
|
||||
if ( the_mutex == NULL ) {
|
||||
return EINVAL;
|
||||
}
|
||||
executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
|
||||
|
||||
executing = _Thread_Executing;
|
||||
|
||||
switch ( the_mutex->protocol ) {
|
||||
switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
|
||||
case POSIX_MUTEX_PRIORITY_CEILING:
|
||||
status = _CORE_ceiling_mutex_Surrender(
|
||||
&the_mutex->Mutex,
|
||||
status = _POSIX_Mutex_Ceiling_surrender(
|
||||
the_mutex,
|
||||
executing,
|
||||
&queue_context
|
||||
);
|
||||
break;
|
||||
case POSIX_MUTEX_NO_PROTOCOL:
|
||||
status = _CORE_recursive_mutex_Surrender(
|
||||
&the_mutex->Mutex.Recursive,
|
||||
status = _POSIX_Mutex_Surrender(
|
||||
the_mutex,
|
||||
POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
|
||||
executing,
|
||||
&queue_context
|
||||
);
|
||||
break;
|
||||
default:
|
||||
_Assert( the_mutex->protocol == POSIX_MUTEX_PRIORITY_INHERIT );
|
||||
status = _CORE_recursive_mutex_Surrender(
|
||||
&the_mutex->Mutex.Recursive,
|
||||
CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
|
||||
_Assert(
|
||||
_POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_INHERIT
|
||||
);
|
||||
status = _POSIX_Mutex_Surrender(
|
||||
the_mutex,
|
||||
POSIX_MUTEX_PRIORITY_INHERIT_TQ_OPERATIONS,
|
||||
executing,
|
||||
&queue_context
|
||||
);
|
||||
|
||||
@@ -49,7 +49,6 @@ static const rtems_assoc_t rtems_object_api_posix_assoc[] = {
|
||||
{ "Key", OBJECTS_POSIX_KEYS, 0},
|
||||
{ "Interrupt", OBJECTS_POSIX_INTERRUPTS, 0},
|
||||
{ "Message Queue", OBJECTS_POSIX_MESSAGE_QUEUES, 0},
|
||||
{ "Mutex", OBJECTS_POSIX_MUTEXES, 0},
|
||||
{ "Semaphore", OBJECTS_POSIX_SEMAPHORES, 0},
|
||||
{ "Timer", OBJECTS_POSIX_TIMERS, 0},
|
||||
{ "Shared Memory", OBJECTS_POSIX_SHMS, 0},
|
||||
|
||||
@@ -1834,13 +1834,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
* o disk lock
|
||||
*/
|
||||
#define _CONFIGURE_LIBBLOCK_SEMAPHORES 1
|
||||
|
||||
/*
|
||||
* POSIX Mutexes:
|
||||
* o bdbuf lock
|
||||
* o bdbuf sync lock
|
||||
*/
|
||||
#define _CONFIGURE_LIBBLOCK_POSIX_MUTEXES 2
|
||||
#else
|
||||
/*
|
||||
* Semaphores:
|
||||
@@ -1852,8 +1845,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
* o bdbuf buffer condition
|
||||
*/
|
||||
#define _CONFIGURE_LIBBLOCK_SEMAPHORES 6
|
||||
|
||||
#define _CONFIGURE_LIBBLOCK_POSIX_MUTEXES 0
|
||||
#endif
|
||||
|
||||
#if defined(CONFIGURE_HAS_OWN_BDBUF_TABLE) || \
|
||||
@@ -1868,8 +1859,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
#define _CONFIGURE_LIBBLOCK_TASK_EXTRA_STACKS 0
|
||||
/** This specifies the number of Classic API semaphores needed by libblock. */
|
||||
#define _CONFIGURE_LIBBLOCK_SEMAPHORES 0
|
||||
/** This specifies the number of POSIX Mutexes needed by libblock. */
|
||||
#define _CONFIGURE_LIBBLOCK_POSIX_MUTEXES 0
|
||||
#endif /* CONFIGURE_APPLICATION_NEEDS_LIBBLOCK */
|
||||
/**@}*/
|
||||
|
||||
@@ -2041,10 +2030,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS \
|
||||
rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
|
||||
#endif
|
||||
#if !defined(CONFIGURE_MAXIMUM_POSIX_MUTEXES)
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES \
|
||||
rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
|
||||
#endif
|
||||
#if !defined(CONFIGURE_MAXIMUM_POSIX_TIMERS)
|
||||
#define CONFIGURE_MAXIMUM_POSIX_TIMERS \
|
||||
rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
|
||||
@@ -2423,7 +2408,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
#include <limits.h>
|
||||
#include <mqueue.h>
|
||||
#include <rtems/posix/mqueue.h>
|
||||
#include <rtems/posix/mutex.h>
|
||||
#include <rtems/posix/psignal.h>
|
||||
#include <rtems/posix/pthread.h>
|
||||
#include <rtems/posix/semaphore.h>
|
||||
@@ -2448,21 +2432,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* This configuration parameter specifies the maximum number of
|
||||
* POSIX API mutexes.
|
||||
*/
|
||||
#ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This macro is calculated to specify the memory required for
|
||||
* POSIX API mutexes.
|
||||
*/
|
||||
#define _CONFIGURE_MEMORY_FOR_POSIX_MUTEXES(_mutexes) \
|
||||
_Configure_Object_RAM(_mutexes, sizeof(POSIX_Mutex_Control) )
|
||||
|
||||
/**
|
||||
* This configuration parameter specifies the maximum number of
|
||||
* POSIX API timers.
|
||||
@@ -2624,13 +2593,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
*/
|
||||
/**@{*/
|
||||
#ifdef CONFIGURE_GNAT_RTEMS
|
||||
|
||||
/**
|
||||
* The GNAT run-time needs something less than (10) POSIX mutexes.
|
||||
* We may be able to get by with less but why bother.
|
||||
*/
|
||||
#define _CONFIGURE_GNAT_MUTEXES 10
|
||||
|
||||
/**
|
||||
* This is the maximum number of Ada tasks which can be concurrently
|
||||
* in existence. Twenty (20) are required to run all tests in the
|
||||
@@ -2646,10 +2608,8 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
#ifndef CONFIGURE_MAXIMUM_FAKE_ADA_TASKS
|
||||
#define CONFIGURE_MAXIMUM_FAKE_ADA_TASKS 0
|
||||
#endif
|
||||
|
||||
#else
|
||||
/** This defines he number of POSIX mutexes GNAT needs. */
|
||||
#define _CONFIGURE_GNAT_MUTEXES 0
|
||||
/** This defines he number of Ada tasks needed by the application. */
|
||||
#define CONFIGURE_MAXIMUM_ADA_TASKS 0
|
||||
/**
|
||||
@@ -2674,11 +2634,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
#ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
|
||||
#endif
|
||||
#ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 1
|
||||
#endif
|
||||
|
||||
#define _CONFIGURE_GO_INIT_MUTEXES 77
|
||||
|
||||
#ifndef CONFIGURE_MAXIMUM_GOROUTINES
|
||||
#define CONFIGURE_MAXIMUM_GOROUTINES 400
|
||||
@@ -2689,12 +2644,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
#endif
|
||||
|
||||
#else
|
||||
/*
|
||||
* This specifies the number of mutexes required by the Go run-time
|
||||
* for its own use.
|
||||
*/
|
||||
#define _CONFIGURE_GO_INIT_MUTEXES 0
|
||||
|
||||
/** This specifies the maximum number of Go co-routines. */
|
||||
#define CONFIGURE_MAXIMUM_GOROUTINES 0
|
||||
|
||||
@@ -2720,25 +2669,12 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
CONFIGURE_MAXIMUM_GOROUTINES)
|
||||
|
||||
#ifdef RTEMS_POSIX_API
|
||||
/**
|
||||
* This macro provides summation of the POSIX Mutexes.
|
||||
*/
|
||||
#define _CONFIGURE_POSIX_MUTEXES \
|
||||
(CONFIGURE_MAXIMUM_POSIX_MUTEXES + \
|
||||
_CONFIGURE_LIBBLOCK_POSIX_MUTEXES + \
|
||||
_CONFIGURE_GNAT_MUTEXES + \
|
||||
CONFIGURE_MAXIMUM_ADA_TASKS + \
|
||||
CONFIGURE_MAXIMUM_FAKE_ADA_TASKS + \
|
||||
_CONFIGURE_GO_INIT_MUTEXES + \
|
||||
CONFIGURE_MAXIMUM_GO_CHANNELS)
|
||||
|
||||
/*
|
||||
* This macro is calculated to specify the memory required for
|
||||
* the POSIX API in its entirety.
|
||||
*/
|
||||
#define _CONFIGURE_MEMORY_FOR_POSIX \
|
||||
(_CONFIGURE_MEMORY_FOR_POSIX_MUTEXES(_CONFIGURE_POSIX_MUTEXES) + \
|
||||
_CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS( \
|
||||
(_CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS( \
|
||||
CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS) + \
|
||||
_CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( \
|
||||
CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES) + \
|
||||
@@ -3189,7 +3125,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
*/
|
||||
posix_api_configuration_table Configuration_POSIX_API = {
|
||||
_CONFIGURE_POSIX_THREADS,
|
||||
_CONFIGURE_POSIX_MUTEXES,
|
||||
CONFIGURE_MAXIMUM_POSIX_TIMERS,
|
||||
CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS,
|
||||
CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES,
|
||||
@@ -3402,7 +3337,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
|
||||
#ifdef RTEMS_POSIX_API
|
||||
/* POSIX API Pieces */
|
||||
uint32_t POSIX_MUTEXES;
|
||||
uint32_t POSIX_TIMERS;
|
||||
uint32_t POSIX_QUEUED_SIGNALS;
|
||||
uint32_t POSIX_MESSAGE_QUEUES;
|
||||
@@ -3451,7 +3385,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
|
||||
#ifdef RTEMS_POSIX_API
|
||||
/* POSIX API Pieces */
|
||||
_CONFIGURE_MEMORY_FOR_POSIX_MUTEXES( _CONFIGURE_POSIX_MUTEXES ),
|
||||
_CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS(
|
||||
CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS ),
|
||||
_CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(
|
||||
@@ -3521,7 +3454,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
||||
*/
|
||||
#if !defined(RTEMS_POSIX_API)
|
||||
#if ((CONFIGURE_MAXIMUM_POSIX_THREADS != 0) || \
|
||||
(CONFIGURE_MAXIMUM_POSIX_MUTEXES != 0) || \
|
||||
(CONFIGURE_MAXIMUM_POSIX_TIMERS != 0) || \
|
||||
(CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0) || \
|
||||
(CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES != 0) || \
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <rtems/posix/posixapi.h>
|
||||
#include <rtems/posix/barrierimpl.h>
|
||||
#include <rtems/posix/condimpl.h>
|
||||
#include <rtems/posix/muteximpl.h>
|
||||
#include <rtems/posix/rwlockimpl.h>
|
||||
#include <rtems/posix/semaphoreimpl.h>
|
||||
#include <rtems/score/heap.h>
|
||||
@@ -107,6 +108,26 @@ RTEMS_STATIC_ASSERT(
|
||||
POSIX_CONDITION_VARIABLES_MAGIC != HEAP_FREE_PATTERN,
|
||||
POSIX_CONDITION_VARIABLES_MAGIC_4
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_MUTEX_MAGIC != HEAP_BEGIN_PROTECTOR_0,
|
||||
POSIX_MUTEX_MAGIC_0
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_MUTEX_MAGIC != HEAP_BEGIN_PROTECTOR_1,
|
||||
POSIX_MUTEX_MAGIC_1
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_MUTEX_MAGIC != HEAP_END_PROTECTOR_0,
|
||||
POSIX_MUTEX_MAGIC_2
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_MUTEX_MAGIC != HEAP_END_PROTECTOR_1,
|
||||
POSIX_MUTEX_MAGIC_3
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_MUTEX_MAGIC != HEAP_FREE_PATTERN,
|
||||
POSIX_MUTEX_MAGIC_4
|
||||
);
|
||||
#endif
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
@@ -121,6 +142,10 @@ RTEMS_STATIC_ASSERT(
|
||||
POSIX_SEMAPHORE_MAGIC != POSIX_CONDITION_VARIABLES_MAGIC,
|
||||
POSIX_SEMAPHORE_MAGIC_7
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_SEMAPHORE_MAGIC != POSIX_MUTEX_MAGIC,
|
||||
POSIX_SEMAPHORE_MAGIC_8
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_BARRIER_MAGIC != POSIX_RWLOCK_MAGIC,
|
||||
POSIX_BARRIER_MAGIC_5
|
||||
@@ -129,10 +154,22 @@ RTEMS_STATIC_ASSERT(
|
||||
POSIX_BARRIER_MAGIC != POSIX_CONDITION_VARIABLES_MAGIC,
|
||||
POSIX_BARRIER_MAGIC_6
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_BARRIER_MAGIC != POSIX_MUTEX_MAGIC,
|
||||
POSIX_BARRIER_MAGIC_7
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_RWLOCK_MAGIC != POSIX_CONDITION_VARIABLES_MAGIC,
|
||||
POSIX_RWLOCK_MAGIC_5
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_RWLOCK_MAGIC != POSIX_MUTEX_MAGIC,
|
||||
POSIX_RWLOCK_MAGIC_6
|
||||
);
|
||||
RTEMS_STATIC_ASSERT(
|
||||
POSIX_CONDITION_VARIABLES_MAGIC != POSIX_MUTEX_MAGIC,
|
||||
POSIX_CONDITION_VARIABLES_MAGIC_5
|
||||
);
|
||||
|
||||
void _POSIX_Fatal_error( POSIX_Fatal_domain domain, int eno )
|
||||
{
|
||||
|
||||
@@ -54,6 +54,7 @@ include_rtems_score_HEADERS += include/rtems/score/isrlock.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/freechain.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/mrsp.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/mrspimpl.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/muteximpl.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/object.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/objectimpl.h
|
||||
include_rtems_score_HEADERS += include/rtems/score/onceimpl.h
|
||||
|
||||
37
cpukit/score/include/rtems/score/muteximpl.h
Normal file
37
cpukit/score/include/rtems/score/muteximpl.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2017 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Dornierstr. 4
|
||||
* 82178 Puchheim
|
||||
* Germany
|
||||
* <rtems@embedded-brains.de>
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef _RTEMS_SCORE_MUTEXIMPL_H
|
||||
#define _RTEMS_SCORE_MUTEXIMPL_H
|
||||
|
||||
#include <rtems/score/threadqimpl.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
typedef struct {
|
||||
Thread_queue_Syslock_queue Queue;
|
||||
} Mutex_Control;
|
||||
|
||||
typedef struct {
|
||||
Mutex_Control Mutex;
|
||||
unsigned int nest_level;
|
||||
} Mutex_recursive_Control;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* _RTEMS_SCORE_MUTEXIMPL_H */
|
||||
@@ -87,7 +87,6 @@ typedef enum {
|
||||
OBJECTS_POSIX_KEYS = 2,
|
||||
OBJECTS_POSIX_INTERRUPTS = 3,
|
||||
OBJECTS_POSIX_MESSAGE_QUEUES = 5,
|
||||
OBJECTS_POSIX_MUTEXES = 6,
|
||||
OBJECTS_POSIX_SEMAPHORES = 7,
|
||||
OBJECTS_POSIX_TIMERS = 9,
|
||||
OBJECTS_POSIX_SHMS = 12
|
||||
|
||||
@@ -47,7 +47,6 @@ extern "C" {
|
||||
#define RTEMS_SYSINIT_CLASSIC_BARRIER 00034a
|
||||
#define RTEMS_SYSINIT_POSIX_SIGNALS 000360
|
||||
#define RTEMS_SYSINIT_POSIX_THREADS 000361
|
||||
#define RTEMS_SYSINIT_POSIX_MUTEX 000363
|
||||
#define RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE 000364
|
||||
#define RTEMS_SYSINIT_POSIX_SEMAPHORE 000365
|
||||
#define RTEMS_SYSINIT_POSIX_TIMER 000366
|
||||
|
||||
@@ -184,6 +184,10 @@ $(PROJECT_INCLUDE)/rtems/score/mrspimpl.h: include/rtems/score/mrspimpl.h $(PROJ
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/mrspimpl.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/mrspimpl.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/score/muteximpl.h: include/rtems/score/muteximpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/muteximpl.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/muteximpl.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/score/object.h: include/rtems/score/object.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/object.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/object.h
|
||||
|
||||
@@ -20,16 +20,12 @@
|
||||
#include <errno.h>
|
||||
|
||||
#include <rtems/score/assert.h>
|
||||
#include <rtems/score/muteximpl.h>
|
||||
#include <rtems/score/threadimpl.h>
|
||||
#include <rtems/score/threadqimpl.h>
|
||||
#include <rtems/score/todimpl.h>
|
||||
|
||||
#define MUTEX_TQ_OPERATIONS &_Thread_queue_Operations_priority_inherit
|
||||
|
||||
typedef struct {
|
||||
Thread_queue_Syslock_queue Queue;
|
||||
} Mutex_Control;
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
offsetof( Mutex_Control, Queue )
|
||||
== offsetof( struct _Mutex_Control, _Queue ),
|
||||
@@ -41,11 +37,6 @@ RTEMS_STATIC_ASSERT(
|
||||
MUTEX_CONTROL_SIZE
|
||||
);
|
||||
|
||||
typedef struct {
|
||||
Mutex_Control Mutex;
|
||||
unsigned int nest_level;
|
||||
} Mutex_recursive_Control;
|
||||
|
||||
RTEMS_STATIC_ASSERT(
|
||||
offsetof( Mutex_recursive_Control, Mutex )
|
||||
== offsetof( struct _Mutex_recursive_Control, _Mutex ),
|
||||
|
||||
@@ -239,6 +239,173 @@ static void test_errors_pthread_setschedprio( void )
|
||||
rtems_test_assert( status == 0 );
|
||||
}
|
||||
|
||||
static void test_mutex_pshared_init(void)
|
||||
{
|
||||
pthread_mutex_t mutex;
|
||||
pthread_mutexattr_t attr;
|
||||
int eno;
|
||||
|
||||
eno = pthread_mutexattr_init(&attr);
|
||||
rtems_test_assert(eno == 0);
|
||||
|
||||
eno = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE);
|
||||
rtems_test_assert(eno == 0);
|
||||
|
||||
eno = pthread_mutex_init(&mutex, &attr);
|
||||
rtems_test_assert(eno == 0);
|
||||
|
||||
eno = pthread_mutex_destroy(&mutex);
|
||||
rtems_test_assert(eno == 0);
|
||||
|
||||
eno = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
|
||||
rtems_test_assert(eno == 0);
|
||||
|
||||
eno = pthread_mutex_init(&mutex, &attr);
|
||||
rtems_test_assert(eno == 0);
|
||||
|
||||
eno = pthread_mutex_destroy(&mutex);
|
||||
rtems_test_assert(eno == 0);
|
||||
|
||||
attr.process_shared = -1;
|
||||
|
||||
eno = pthread_mutex_init(&mutex, &attr);
|
||||
rtems_test_assert(eno == EINVAL);
|
||||
|
||||
eno = pthread_mutexattr_destroy(&attr);
|
||||
rtems_test_assert(eno == 0);
|
||||
}
|
||||
|
||||
static void test_mutex_null( void )
|
||||
{
|
||||
struct timespec to;
|
||||
int eno;
|
||||
|
||||
eno = pthread_mutex_destroy( NULL );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_init( NULL, NULL );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_lock( NULL );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
to.tv_sec = 1;
|
||||
to.tv_nsec = 1;
|
||||
eno = pthread_mutex_timedlock( NULL, &to );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_trylock( NULL );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_unlock( NULL );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
}
|
||||
|
||||
static void test_mutex_not_initialized( void )
|
||||
{
|
||||
pthread_mutex_t mutex;
|
||||
struct timespec to;
|
||||
int eno;
|
||||
|
||||
memset( &mutex, 0xff, sizeof( mutex ) );
|
||||
|
||||
eno = pthread_mutex_destroy( &mutex );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_lock( &mutex );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
to.tv_sec = 1;
|
||||
to.tv_nsec = 1;
|
||||
eno = pthread_mutex_timedlock( &mutex, &to );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_trylock( &mutex );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_unlock( &mutex );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
}
|
||||
|
||||
static void test_mutex_invalid_copy( void )
|
||||
{
|
||||
pthread_mutex_t mutex;
|
||||
pthread_mutex_t mutex2;
|
||||
struct timespec to;
|
||||
int eno;
|
||||
|
||||
eno = pthread_mutex_init( &mutex, NULL );
|
||||
rtems_test_assert( eno == 0 );
|
||||
|
||||
memcpy( &mutex2, &mutex, sizeof( mutex2 ) );
|
||||
|
||||
eno = pthread_mutex_destroy( &mutex2 );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_lock( &mutex2 );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
to.tv_sec = 1;
|
||||
to.tv_nsec = 1;
|
||||
eno = pthread_mutex_timedlock( &mutex2, &to );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_trylock( &mutex2 );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_unlock( &mutex2 );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
|
||||
eno = pthread_mutex_destroy( &mutex );
|
||||
rtems_test_assert( eno == 0 );
|
||||
}
|
||||
|
||||
static void test_mutex_auto_initialization( void )
|
||||
{
|
||||
struct timespec to;
|
||||
int eno;
|
||||
|
||||
{
|
||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
eno = pthread_mutex_destroy( &mutex );
|
||||
rtems_test_assert( eno == 0 );
|
||||
|
||||
eno = pthread_mutex_destroy( &mutex );
|
||||
rtems_test_assert( eno == EINVAL );
|
||||
}
|
||||
|
||||
{
|
||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
eno = pthread_mutex_lock( &mutex );
|
||||
rtems_test_assert( eno == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
to.tv_sec = 1;
|
||||
to.tv_nsec = 1;
|
||||
eno = pthread_mutex_timedlock( &mutex, &to );
|
||||
rtems_test_assert( eno == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
eno = pthread_mutex_trylock( &mutex );
|
||||
rtems_test_assert( eno == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
eno = pthread_mutex_unlock( &mutex );
|
||||
rtems_test_assert( eno == EPERM );
|
||||
}
|
||||
}
|
||||
|
||||
void *POSIX_Init(
|
||||
void *argument
|
||||
)
|
||||
@@ -255,11 +422,15 @@ void *POSIX_Init(
|
||||
int old_ceiling;
|
||||
int priority;
|
||||
|
||||
rtems_test_assert( MUTEX_BAD_ID != PTHREAD_MUTEX_INITIALIZER );
|
||||
Mutex_bad_id = MUTEX_BAD_ID;
|
||||
Mutex_bad_id = NULL;
|
||||
|
||||
TEST_BEGIN();
|
||||
|
||||
test_mutex_pshared_init();
|
||||
test_mutex_null();
|
||||
test_mutex_not_initialized();
|
||||
test_mutex_invalid_copy();
|
||||
test_mutex_auto_initialization();
|
||||
test_get_priority();
|
||||
test_set_priority();
|
||||
test_errors_pthread_setschedprio();
|
||||
@@ -504,7 +675,7 @@ void *POSIX_Init(
|
||||
#endif
|
||||
|
||||
puts( "Init: pthread_mutex_trylock - EINVAL (illegal ID)" );
|
||||
status = pthread_mutex_trylock( &Mutex_bad_id );
|
||||
status = pthread_mutex_trylock( Mutex_bad_id );
|
||||
if ( status != EINVAL )
|
||||
printf( "status = %d\n", status );
|
||||
rtems_test_assert( status == EINVAL );
|
||||
@@ -546,7 +717,7 @@ void *POSIX_Init(
|
||||
/* switch to task 1 */
|
||||
|
||||
puts( "Init: pthread_mutex_unlock - EINVAL (invalid id)" );
|
||||
status = pthread_mutex_unlock( &Mutex_bad_id );
|
||||
status = pthread_mutex_unlock( Mutex_bad_id );
|
||||
if ( status != EINVAL )
|
||||
printf( "status = %d\n", status );
|
||||
rtems_test_assert( status == EINVAL );
|
||||
@@ -593,20 +764,24 @@ void *POSIX_Init(
|
||||
printf( "status = %d\n", status );
|
||||
rtems_test_assert( !status );
|
||||
|
||||
puts( "Init: pthread_mutex_init - EAGAIN (too many)" );
|
||||
puts( "Init: pthread_mutex_init - SUCCESSFUL" );
|
||||
status = pthread_mutex_init( &Mutex3_id, &attr );
|
||||
rtems_test_assert( status == EAGAIN );
|
||||
rtems_test_assert( !status );
|
||||
|
||||
puts( "Init: pthread_mutexattr_destroy - SUCCESSFUL" );
|
||||
status = pthread_mutexattr_destroy( &attr );
|
||||
rtems_test_assert( !status );
|
||||
|
||||
puts( "Init: pthread_mutex_destroy - SUCCESSFUL" );
|
||||
status = pthread_mutex_destroy( &Mutex3_id );
|
||||
rtems_test_assert( !status );
|
||||
|
||||
puts( "Init: pthread_mutex_destroy - SUCCESSFUL" );
|
||||
status = pthread_mutex_destroy( &Mutex2_id );
|
||||
rtems_test_assert( !status );
|
||||
|
||||
puts( "Init: pthread_mutex_destroy - EINVAL (invalid id)" );
|
||||
status = pthread_mutex_destroy( &Mutex_bad_id );
|
||||
status = pthread_mutex_destroy( Mutex_bad_id );
|
||||
rtems_test_assert( status == EINVAL );
|
||||
|
||||
/* destroy a busy mutex */
|
||||
@@ -713,7 +888,7 @@ void *POSIX_Init(
|
||||
rtems_test_assert( !status );
|
||||
|
||||
puts( "Init: pthread_mutex_getprioceiling - EINVAL (invalid id)" );
|
||||
status = pthread_mutex_getprioceiling( &Mutex_bad_id, &ceiling );
|
||||
status = pthread_mutex_getprioceiling( Mutex_bad_id, &ceiling );
|
||||
rtems_test_assert( status == EINVAL );
|
||||
|
||||
puts( "Init: pthread_mutex_getprioceiling - EINVAL (NULL ceiling)" );
|
||||
@@ -725,7 +900,7 @@ void *POSIX_Init(
|
||||
printf( "Init: pthread_mutex_getprioceiling - %d\n", ceiling );
|
||||
|
||||
puts( "Init: pthread_mutex_setprioceiling - EINVAL (invalid id)" );
|
||||
status = pthread_mutex_setprioceiling( &Mutex_bad_id, 200, &old_ceiling );
|
||||
status = pthread_mutex_setprioceiling( Mutex_bad_id, 200, &old_ceiling );
|
||||
rtems_test_assert( status == EINVAL );
|
||||
|
||||
puts( "Init: pthread_mutex_setprioceiling - EINVAL (illegal priority)" );
|
||||
|
||||
@@ -3,7 +3,7 @@ Init's ID is 0x0b010001
|
||||
Init: pthread_mutexattr_init - EINVAL (NULL attr)
|
||||
Init: pthread_mutexattr_init - SUCCESSFUL
|
||||
Init: mutex protocol is (0) -- PTHREAD_PRIO_NONE
|
||||
Init: mutex priority ceiling is 254
|
||||
Init: mutex priority ceiling is 2147483647
|
||||
Init: mutex process shared is (0) -- PTHREAD_PROCESS_PRIVATE
|
||||
Init: pthread_mutexattr_destroy - SUCCESSFUL
|
||||
Init: pthread_mutexattr_destroy - EINVAL (NULL attr)
|
||||
@@ -67,9 +67,10 @@ Init: pthread_mutex_timedlock - time out in the past
|
||||
Init: pthread_mutex_timedlock - EAGAIN (timeout)
|
||||
|
||||
Init: pthread_mutex_init - SUCCESSFUL
|
||||
Init: pthread_mutex_init - EAGAIN (too many)
|
||||
Init: pthread_mutex_init - SUCCESSFUL
|
||||
Init: pthread_mutexattr_destroy - SUCCESSFUL
|
||||
Init: pthread_mutex_destroy - SUCCESSFUL
|
||||
Init: pthread_mutex_destroy - SUCCESSFUL
|
||||
Init: pthread_mutex_destroy - EINVAL (invalid id)
|
||||
|
||||
Init: pthread_mutexattr_init - SUCCESSFUL
|
||||
@@ -113,8 +114,6 @@ Task 3: pthread_mutex_lock unavailable (inherit case)
|
||||
Init: pthread_mutex_unlock - SUCCESSFUL
|
||||
Task 3: mutex acquired
|
||||
Task 3: unlock Mutex 2
|
||||
Task 3: pthread_getschedparam priority = 199
|
||||
Task 3: exit
|
||||
Init: pthread_mutex_getprioceiling- ceiling = 200
|
||||
Init: pthread_setschedparam - set Init priority to highest
|
||||
Init: pthread_mutex_lock - EINVAL (priority ceiling violation)
|
||||
|
||||
@@ -39,7 +39,6 @@ void *Task_3(
|
||||
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 4
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2
|
||||
|
||||
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
|
||||
|
||||
@@ -62,6 +61,6 @@ TEST_EXTERN pthread_t Task3_id;
|
||||
TEST_EXTERN pthread_mutex_t Mutex_id;
|
||||
TEST_EXTERN pthread_mutex_t Mutex2_id;
|
||||
TEST_EXTERN pthread_mutex_t Mutex3_id;
|
||||
TEST_EXTERN pthread_mutex_t Mutex_bad_id;
|
||||
TEST_EXTERN pthread_mutex_t *Mutex_bad_id;
|
||||
|
||||
/* end of include file */
|
||||
|
||||
@@ -36,7 +36,6 @@ void *Task_2(
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
|
||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 10
|
||||
|
||||
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
|
||||
|
||||
|
||||
@@ -41,7 +41,6 @@ void *Task_3(
|
||||
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
|
||||
|
||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 4
|
||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2
|
||||
|
||||
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user