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_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Put the overrides of default configuration parameters here.
|
* Put the overrides of default configuration parameters here.
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 2
|
#define CONFIGURE_MAXIMUM_TASKS 2
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 1
|
#define CONFIGURE_MAXIMUM_TASKS 1
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 1
|
#define CONFIGURE_MAXIMUM_TASKS 1
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 3
|
#define CONFIGURE_MAXIMUM_TASKS 3
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 4
|
#define CONFIGURE_MAXIMUM_TASKS 4
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 5
|
#define CONFIGURE_MAXIMUM_TASKS 5
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 2
|
#define CONFIGURE_MAXIMUM_TASKS 2
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 7
|
#define CONFIGURE_MAXIMUM_TASKS 7
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_TASKS 1
|
#define CONFIGURE_MAXIMUM_TASKS 1
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 20
|
|
||||||
|
|
||||||
#include <rtems/confdefs.h>
|
#include <rtems/confdefs.h>
|
||||||
|
|
||||||
|
|||||||
@@ -1514,6 +1514,7 @@ rtems_bdbuf_do_init (void)
|
|||||||
uint8_t* buffer;
|
uint8_t* buffer;
|
||||||
size_t b;
|
size_t b;
|
||||||
rtems_status_code sc;
|
rtems_status_code sc;
|
||||||
|
bool locked;
|
||||||
|
|
||||||
if (rtems_bdbuf_tracer)
|
if (rtems_bdbuf_tracer)
|
||||||
printf ("bdbuf:init\n");
|
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'),
|
sc = rtems_bdbuf_lock_create (rtems_build_name ('B', 'D', 'C', 'l'),
|
||||||
&bdbuf_cache.lock);
|
&bdbuf_cache.lock);
|
||||||
if (sc != RTEMS_SUCCESSFUL)
|
locked = (sc == RTEMS_SUCCESSFUL);
|
||||||
|
if (!locked)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
rtems_bdbuf_lock_cache ();
|
rtems_bdbuf_lock_cache ();
|
||||||
@@ -1729,7 +1731,7 @@ error:
|
|||||||
rtems_bdbuf_waiter_delete (&bdbuf_cache.transfer_waiters);
|
rtems_bdbuf_waiter_delete (&bdbuf_cache.transfer_waiters);
|
||||||
rtems_bdbuf_lock_delete (&bdbuf_cache.sync_lock);
|
rtems_bdbuf_lock_delete (&bdbuf_cache.sync_lock);
|
||||||
|
|
||||||
if (bdbuf_cache.lock != 0)
|
if (locked)
|
||||||
{
|
{
|
||||||
rtems_bdbuf_unlock_cache ();
|
rtems_bdbuf_unlock_cache ();
|
||||||
rtems_bdbuf_lock_delete (&bdbuf_cache.lock);
|
rtems_bdbuf_lock_delete (&bdbuf_cache.lock);
|
||||||
|
|||||||
@@ -112,7 +112,6 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t active_message_queues;
|
uint32_t active_message_queues;
|
||||||
uint32_t active_mutexes;
|
|
||||||
uint32_t active_semaphores;
|
uint32_t active_semaphores;
|
||||||
uint32_t active_threads;
|
uint32_t active_threads;
|
||||||
uint32_t active_timers;
|
uint32_t active_timers;
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ static const struct {
|
|||||||
#ifdef RTEMS_POSIX_API
|
#ifdef RTEMS_POSIX_API
|
||||||
,
|
,
|
||||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_MESSAGE_QUEUES },
|
{ OBJECTS_POSIX_API, OBJECTS_POSIX_MESSAGE_QUEUES },
|
||||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_MUTEXES },
|
|
||||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_SEMAPHORES },
|
{ OBJECTS_POSIX_API, OBJECTS_POSIX_SEMAPHORES },
|
||||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_THREADS },
|
{ OBJECTS_POSIX_API, OBJECTS_POSIX_THREADS },
|
||||||
{ OBJECTS_POSIX_API, OBJECTS_POSIX_TIMERS }
|
{ 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/key.h
|
||||||
include_rtems_posix_HEADERS += include/rtems/posix/keyimpl.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/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/posixapi.h
|
||||||
include_rtems_posix_HEADERS += include/rtems/posix/priorityimpl.h
|
include_rtems_posix_HEADERS += include/rtems/posix/priorityimpl.h
|
||||||
include_rtems_posix_HEADERS += include/rtems/posix/rwlockimpl.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/mmanimpl.h
|
||||||
include_rtems_posix_HEADERS += include/rtems/posix/mqueue.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/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/psignal.h
|
||||||
include_rtems_posix_HEADERS += include/rtems/posix/psignalimpl.h
|
include_rtems_posix_HEADERS += include/rtems/posix/psignalimpl.h
|
||||||
include_rtems_posix_HEADERS += include/rtems/posix/pthread.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/condinit.c src/condsignal.c src/condsignalsupp.c \
|
||||||
src/condtimedwait.c src/condwait.c src/condwaitsupp.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
|
if HAS_PTHREADS
|
||||||
libposix_a_SOURCES += src/pthreadatfork.c
|
libposix_a_SOURCES += src/pthreadatfork.c
|
||||||
|
|
||||||
@@ -113,16 +122,6 @@ libposix_a_SOURCES += src/mqueue.c src/mqueueclose.c \
|
|||||||
src/mqueuetimedsend.c \
|
src/mqueuetimedsend.c \
|
||||||
src/mqueueunlink.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
|
## PTHREAD_C_FILES
|
||||||
libposix_a_SOURCES += src/pthreadatfork.c src/pthreadattrdestroy.c \
|
libposix_a_SOURCES += src/pthreadatfork.c src/pthreadattrdestroy.c \
|
||||||
src/pthreadattrgetdetachstate.c src/pthreadattrgetinheritsched.c \
|
src/pthreadattrgetdetachstate.c src/pthreadattrgetinheritsched.c \
|
||||||
|
|||||||
@@ -62,12 +62,6 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
uint32_t maximum_threads;
|
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
|
* This field contains the maximum number of POSIX API
|
||||||
* timers which are configured for this application.
|
* 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
|
#ifndef _RTEMS_POSIX_MUTEXIMPL_H
|
||||||
#define _RTEMS_POSIX_MUTEXIMPL_H
|
#define _RTEMS_POSIX_MUTEXIMPL_H
|
||||||
|
|
||||||
#include <rtems/posix/mutex.h>
|
|
||||||
#include <rtems/score/coremuteximpl.h>
|
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#include <rtems/score/percpu.h>
|
||||||
|
#include <rtems/score/muteximpl.h>
|
||||||
|
#include <rtems/score/threadimpl.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#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_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.
|
* @brief Supported POSIX mutex protocols.
|
||||||
*
|
*
|
||||||
@@ -41,26 +63,30 @@ typedef enum {
|
|||||||
POSIX_MUTEX_PRIORITY_CEILING
|
POSIX_MUTEX_PRIORITY_CEILING
|
||||||
} POSIX_Mutex_Protocol;
|
} 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.
|
* The default mutex attributes structure.
|
||||||
*/
|
*/
|
||||||
extern const pthread_mutexattr_t _POSIX_Mutex_Default_attributes;
|
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,
|
POSIX_Mutex_Control *the_mutex,
|
||||||
Thread_queue_Context *queue_context
|
Thread_queue_Context *queue_context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_CORE_mutex_Acquire_critical(
|
ISR_Level level;
|
||||||
&the_mutex->Mutex.Recursive.Mutex,
|
Thread_Control *executing;
|
||||||
queue_context
|
|
||||||
|
_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(
|
RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Release(
|
||||||
@@ -68,36 +94,359 @@ RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Release(
|
|||||||
Thread_queue_Context *queue_context
|
Thread_queue_Context *queue_context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_CORE_mutex_Release(
|
_Thread_queue_Queue_release(
|
||||||
&the_mutex->Mutex.Recursive.Mutex,
|
&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
|
queue_context
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
RTEMS_INLINE_ROUTINE Status_Control _POSIX_Mutex_Surrender(
|
||||||
* @brief POSIX Mutex Allocate
|
POSIX_Mutex_Control *the_mutex,
|
||||||
*
|
const Thread_queue_Operations *operations,
|
||||||
* This function allocates a mutexes control block from
|
Thread_Control *executing,
|
||||||
* the inactive chain of free mutexes control blocks.
|
Thread_queue_Context *queue_context
|
||||||
*/
|
|
||||||
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
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_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
|
* @brief POSIX Mutex Lock Support Method
|
||||||
@@ -111,29 +460,32 @@ int _POSIX_Mutex_Lock_support(
|
|||||||
Watchdog_Interval timeout
|
Watchdog_Interval timeout
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
static inline POSIX_Mutex_Control *_POSIX_Mutex_Get(
|
||||||
* @brief POSIX Mutex Get (Interrupt Disable)
|
pthread_mutex_t *mutex
|
||||||
*
|
|
||||||
* 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
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return (POSIX_Mutex_Control *) _Objects_Get_no_protection(
|
return (POSIX_Mutex_Control *) mutex;
|
||||||
(Objects_Id) *mutex,
|
|
||||||
&_POSIX_Mutex_Information
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#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
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/config.h
|
||||||
PREINSTALL_FILES += $(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)
|
$(PROJECT_INCLUDE)/rtems/posix/posixapi.h: include/rtems/posix/posixapi.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/posixapi.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/posixapi.h
|
||||||
PREINSTALL_FILES += $(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
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/mqueueimpl.h
|
||||||
PREINSTALL_FILES += $(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)
|
$(PROJECT_INCLUDE)/rtems/posix/psignal.h: include/rtems/posix/psignal.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/psignal.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/psignal.h
|
||||||
PREINSTALL_FILES += $(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;
|
POSIX_Mutex_Control *the_mutex;
|
||||||
|
unsigned long flags;
|
||||||
Thread_queue_Context queue_context;
|
Thread_queue_Context queue_context;
|
||||||
int eno;
|
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 ) {
|
if ( _POSIX_Mutex_Get_owner( the_mutex ) == NULL ) {
|
||||||
_POSIX_Mutex_Acquire_critical( the_mutex, &queue_context );
|
the_mutex->flags = ~the_mutex->flags;
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
eno = 0;
|
||||||
} else {
|
} else {
|
||||||
_POSIX_Mutex_Release( the_mutex, &queue_context );
|
|
||||||
eno = EBUSY;
|
eno = EBUSY;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
eno = EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
_Objects_Allocator_unlock();
|
_POSIX_Mutex_Release( the_mutex, &queue_context );
|
||||||
return eno;
|
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;
|
POSIX_Mutex_Control *the_mutex;
|
||||||
|
unsigned long flags;
|
||||||
Thread_queue_Context queue_context;
|
Thread_queue_Context queue_context;
|
||||||
|
|
||||||
if ( prioceiling == NULL ) {
|
if ( prioceiling == NULL ) {
|
||||||
return EINVAL;
|
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 ) {
|
_POSIX_Mutex_Acquire( the_mutex, &queue_context );
|
||||||
return EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
_POSIX_Mutex_Acquire_critical( the_mutex, &queue_context );
|
if ( _POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_CEILING ) {
|
||||||
|
|
||||||
if ( the_mutex->protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
|
|
||||||
*prioceiling = _POSIX_Priority_From_core(
|
*prioceiling = _POSIX_Priority_From_core(
|
||||||
_CORE_ceiling_mutex_Get_scheduler( &the_mutex->Mutex ),
|
_POSIX_Mutex_Get_scheduler( the_mutex ),
|
||||||
_CORE_ceiling_mutex_Get_priority( &the_mutex->Mutex )
|
_POSIX_Mutex_Get_priority( the_mutex )
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
*prioceiling = 0;
|
*prioceiling = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
_POSIX_Mutex_Release( the_mutex, &queue_context );
|
_POSIX_Mutex_Release( the_mutex, &queue_context );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,46 @@
|
|||||||
#include <rtems/posix/priorityimpl.h>
|
#include <rtems/posix/priorityimpl.h>
|
||||||
#include <rtems/score/schedulerimpl.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
|
* 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;
|
POSIX_Mutex_Control *the_mutex;
|
||||||
const pthread_mutexattr_t *the_attr;
|
const pthread_mutexattr_t *the_attr;
|
||||||
POSIX_Mutex_Protocol protocol;
|
POSIX_Mutex_Protocol protocol;
|
||||||
|
unsigned long flags;
|
||||||
|
Priority_Control priority;
|
||||||
const Scheduler_Control *scheduler;
|
const Scheduler_Control *scheduler;
|
||||||
|
|
||||||
if ( attr ) the_attr = attr;
|
if ( attr ) the_attr = attr;
|
||||||
@@ -101,20 +143,21 @@ int pthread_mutex_init(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
the_mutex = _POSIX_Mutex_Allocate();
|
the_mutex = _POSIX_Mutex_Get( mutex );
|
||||||
|
|
||||||
if ( !the_mutex ) {
|
flags = (uintptr_t) the_mutex ^ POSIX_MUTEX_MAGIC;
|
||||||
_Objects_Allocator_unlock();
|
flags &= ~POSIX_MUTEX_FLAGS_MASK;
|
||||||
return EAGAIN;
|
flags |= protocol;
|
||||||
|
|
||||||
|
if ( the_attr->type == PTHREAD_MUTEX_RECURSIVE ) {
|
||||||
|
flags |= POSIX_MUTEX_RECURSIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
the_mutex->protocol = protocol;
|
the_mutex->flags = flags;
|
||||||
the_mutex->is_recursive = ( the_attr->type == PTHREAD_MUTEX_RECURSIVE );
|
|
||||||
|
|
||||||
if ( protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
|
if ( protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
|
||||||
int prio_ceiling;
|
int prio_ceiling;
|
||||||
bool valid;
|
bool valid;
|
||||||
Priority_Control priority;
|
|
||||||
|
|
||||||
scheduler = _Thread_Scheduler_get_home( _Thread_Get_executing() );
|
scheduler = _Thread_Scheduler_get_home( _Thread_Get_executing() );
|
||||||
prio_ceiling = the_attr->prio_ceiling;
|
prio_ceiling = the_attr->prio_ceiling;
|
||||||
@@ -125,23 +168,19 @@ int pthread_mutex_init(
|
|||||||
|
|
||||||
priority = _POSIX_Priority_To_core( scheduler, prio_ceiling, &valid );
|
priority = _POSIX_Priority_To_core( scheduler, prio_ceiling, &valid );
|
||||||
if ( !valid ) {
|
if ( !valid ) {
|
||||||
_POSIX_Mutex_Free(the_mutex);
|
|
||||||
_Objects_Allocator_unlock();
|
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
_CORE_ceiling_mutex_Initialize( &the_mutex->Mutex, scheduler, priority );
|
|
||||||
} else {
|
} else {
|
||||||
_Assert(
|
priority = 0;
|
||||||
the_mutex->protocol == POSIX_MUTEX_NO_PROTOCOL
|
scheduler = NULL;
|
||||||
|| the_mutex->protocol == POSIX_MUTEX_PRIORITY_INHERIT
|
|
||||||
);
|
|
||||||
_CORE_recursive_mutex_Initialize( &the_mutex->Mutex.Recursive );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_Objects_Open_u32( &_POSIX_Mutex_Information, &the_mutex->Object, 0 );
|
_Thread_queue_Queue_initialize(
|
||||||
|
&the_mutex->Recursive.Mutex.Queue.Queue,
|
||||||
*mutex = the_mutex->Object.id;
|
NULL
|
||||||
|
);
|
||||||
_Objects_Allocator_unlock();
|
the_mutex->Recursive.nest_level = 0;
|
||||||
|
_Priority_Node_initialize( &the_mutex->Priority_ceiling, priority );
|
||||||
|
the_mutex->scheduler = scheduler;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,27 +21,34 @@
|
|||||||
#include <rtems/posix/muteximpl.h>
|
#include <rtems/posix/muteximpl.h>
|
||||||
#include <rtems/posix/posixapi.h>
|
#include <rtems/posix/posixapi.h>
|
||||||
|
|
||||||
THREAD_QUEUE_OBJECT_ASSERT(
|
Status_Control _POSIX_Mutex_Seize_slow(
|
||||||
POSIX_Mutex_Control,
|
POSIX_Mutex_Control *the_mutex,
|
||||||
Mutex.Recursive.Mutex.Wait_queue
|
const Thread_queue_Operations *operations,
|
||||||
);
|
Thread_Control *executing,
|
||||||
|
bool wait,
|
||||||
static Status_Control _POSIX_Mutex_Lock_nested(
|
Thread_queue_Context *queue_context
|
||||||
CORE_recursive_mutex_Control *the_recursive_mutex
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
POSIX_Mutex_Control *the_mutex;
|
if ( wait ) {
|
||||||
|
_Thread_queue_Context_set_thread_state(
|
||||||
the_mutex = RTEMS_CONTAINER_OF(
|
queue_context,
|
||||||
the_recursive_mutex,
|
STATES_WAITING_FOR_MUTEX
|
||||||
POSIX_Mutex_Control,
|
|
||||||
Mutex.Recursive
|
|
||||||
);
|
);
|
||||||
|
_Thread_queue_Context_set_do_nothing_enqueue_callout( queue_context );
|
||||||
if ( the_mutex->is_recursive ) {
|
_Thread_queue_Context_set_deadlock_callout(
|
||||||
return _CORE_recursive_mutex_Seize_nested( the_recursive_mutex );
|
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 {
|
} 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;
|
POSIX_Mutex_Control *the_mutex;
|
||||||
|
unsigned long flags;
|
||||||
Thread_queue_Context queue_context;
|
Thread_queue_Context queue_context;
|
||||||
Thread_Control *executing;
|
Thread_Control *executing;
|
||||||
Status_Control status;
|
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 ) {
|
executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
|
||||||
return EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
executing = _Thread_Executing;
|
|
||||||
_Thread_queue_Context_set_relative_timeout( &queue_context, timeout );
|
_Thread_queue_Context_set_relative_timeout( &queue_context, timeout );
|
||||||
|
|
||||||
switch ( the_mutex->protocol ) {
|
switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
|
||||||
case POSIX_MUTEX_PRIORITY_CEILING:
|
case POSIX_MUTEX_PRIORITY_CEILING:
|
||||||
status = _CORE_ceiling_mutex_Seize(
|
status = _POSIX_Mutex_Ceiling_seize(
|
||||||
&the_mutex->Mutex,
|
the_mutex,
|
||||||
|
flags,
|
||||||
executing,
|
executing,
|
||||||
wait,
|
wait,
|
||||||
_POSIX_Mutex_Lock_nested,
|
|
||||||
&queue_context
|
&queue_context
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case POSIX_MUTEX_NO_PROTOCOL:
|
case POSIX_MUTEX_NO_PROTOCOL:
|
||||||
status = _CORE_recursive_mutex_Seize(
|
status = _POSIX_Mutex_Seize(
|
||||||
&the_mutex->Mutex.Recursive,
|
the_mutex,
|
||||||
|
flags,
|
||||||
POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
|
POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
|
||||||
executing,
|
executing,
|
||||||
wait,
|
wait,
|
||||||
_POSIX_Mutex_Lock_nested,
|
|
||||||
&queue_context
|
&queue_context
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
_Assert( the_mutex->protocol == POSIX_MUTEX_PRIORITY_INHERIT );
|
_Assert(
|
||||||
status = _CORE_recursive_mutex_Seize(
|
_POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_INHERIT
|
||||||
&the_mutex->Mutex.Recursive,
|
);
|
||||||
CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
|
status = _POSIX_Mutex_Seize(
|
||||||
|
the_mutex,
|
||||||
|
flags,
|
||||||
|
POSIX_MUTEX_PRIORITY_INHERIT_TQ_OPERATIONS,
|
||||||
executing,
|
executing,
|
||||||
wait,
|
wait,
|
||||||
_POSIX_Mutex_Lock_nested,
|
|
||||||
&queue_context
|
&queue_context
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -49,17 +49,19 @@ int pthread_mutex_setprioceiling(
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
the_mutex = _POSIX_Mutex_Get_no_protection( mutex );
|
the_mutex = _POSIX_Mutex_Get( mutex );
|
||||||
_Assert( the_mutex != NULL );
|
|
||||||
|
|
||||||
if ( the_mutex->protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
|
if (
|
||||||
|
_POSIX_Mutex_Get_protocol( the_mutex->flags )
|
||||||
|
== POSIX_MUTEX_PRIORITY_CEILING
|
||||||
|
) {
|
||||||
const Scheduler_Control *scheduler;
|
const Scheduler_Control *scheduler;
|
||||||
bool valid;
|
bool valid;
|
||||||
Priority_Control new_priority;
|
Priority_Control new_priority;
|
||||||
Priority_Control old_priority;
|
Priority_Control old_priority;
|
||||||
|
|
||||||
scheduler = _CORE_ceiling_mutex_Get_scheduler( &the_mutex->Mutex );
|
scheduler = _POSIX_Mutex_Get_scheduler( the_mutex );
|
||||||
old_priority = _CORE_ceiling_mutex_Get_priority( &the_mutex->Mutex );
|
old_priority = _POSIX_Mutex_Get_priority( the_mutex );
|
||||||
*old_ceiling = _POSIX_Priority_From_core( scheduler, old_priority );
|
*old_ceiling = _POSIX_Priority_From_core( scheduler, old_priority );
|
||||||
|
|
||||||
new_priority = _POSIX_Priority_To_core( scheduler, prioceiling, &valid );
|
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_initialize( &queue_context );
|
||||||
_Thread_queue_Context_clear_priority_updates( &queue_context );
|
_Thread_queue_Context_clear_priority_updates( &queue_context );
|
||||||
_CORE_ceiling_mutex_Set_priority(
|
_POSIX_Mutex_Set_priority(
|
||||||
&the_mutex->Mutex,
|
the_mutex,
|
||||||
new_priority,
|
new_priority,
|
||||||
&queue_context
|
&queue_context
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -21,6 +21,51 @@
|
|||||||
#include <rtems/posix/muteximpl.h>
|
#include <rtems/posix/muteximpl.h>
|
||||||
#include <rtems/posix/posixapi.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
|
* 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;
|
POSIX_Mutex_Control *the_mutex;
|
||||||
|
unsigned long flags;
|
||||||
Thread_queue_Context queue_context;
|
Thread_queue_Context queue_context;
|
||||||
Thread_Control *executing;
|
Thread_Control *executing;
|
||||||
Status_Control status;
|
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 ) {
|
executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
|
||||||
return EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
executing = _Thread_Executing;
|
switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
|
||||||
|
|
||||||
switch ( the_mutex->protocol ) {
|
|
||||||
case POSIX_MUTEX_PRIORITY_CEILING:
|
case POSIX_MUTEX_PRIORITY_CEILING:
|
||||||
status = _CORE_ceiling_mutex_Surrender(
|
status = _POSIX_Mutex_Ceiling_surrender(
|
||||||
&the_mutex->Mutex,
|
the_mutex,
|
||||||
executing,
|
executing,
|
||||||
&queue_context
|
&queue_context
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case POSIX_MUTEX_NO_PROTOCOL:
|
case POSIX_MUTEX_NO_PROTOCOL:
|
||||||
status = _CORE_recursive_mutex_Surrender(
|
status = _POSIX_Mutex_Surrender(
|
||||||
&the_mutex->Mutex.Recursive,
|
the_mutex,
|
||||||
POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
|
POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
|
||||||
executing,
|
executing,
|
||||||
&queue_context
|
&queue_context
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
_Assert( the_mutex->protocol == POSIX_MUTEX_PRIORITY_INHERIT );
|
_Assert(
|
||||||
status = _CORE_recursive_mutex_Surrender(
|
_POSIX_Mutex_Get_protocol( flags ) == POSIX_MUTEX_PRIORITY_INHERIT
|
||||||
&the_mutex->Mutex.Recursive,
|
);
|
||||||
CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
|
status = _POSIX_Mutex_Surrender(
|
||||||
|
the_mutex,
|
||||||
|
POSIX_MUTEX_PRIORITY_INHERIT_TQ_OPERATIONS,
|
||||||
executing,
|
executing,
|
||||||
&queue_context
|
&queue_context
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ static const rtems_assoc_t rtems_object_api_posix_assoc[] = {
|
|||||||
{ "Key", OBJECTS_POSIX_KEYS, 0},
|
{ "Key", OBJECTS_POSIX_KEYS, 0},
|
||||||
{ "Interrupt", OBJECTS_POSIX_INTERRUPTS, 0},
|
{ "Interrupt", OBJECTS_POSIX_INTERRUPTS, 0},
|
||||||
{ "Message Queue", OBJECTS_POSIX_MESSAGE_QUEUES, 0},
|
{ "Message Queue", OBJECTS_POSIX_MESSAGE_QUEUES, 0},
|
||||||
{ "Mutex", OBJECTS_POSIX_MUTEXES, 0},
|
|
||||||
{ "Semaphore", OBJECTS_POSIX_SEMAPHORES, 0},
|
{ "Semaphore", OBJECTS_POSIX_SEMAPHORES, 0},
|
||||||
{ "Timer", OBJECTS_POSIX_TIMERS, 0},
|
{ "Timer", OBJECTS_POSIX_TIMERS, 0},
|
||||||
{ "Shared Memory", OBJECTS_POSIX_SHMS, 0},
|
{ "Shared Memory", OBJECTS_POSIX_SHMS, 0},
|
||||||
|
|||||||
@@ -1834,13 +1834,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
* o disk lock
|
* o disk lock
|
||||||
*/
|
*/
|
||||||
#define _CONFIGURE_LIBBLOCK_SEMAPHORES 1
|
#define _CONFIGURE_LIBBLOCK_SEMAPHORES 1
|
||||||
|
|
||||||
/*
|
|
||||||
* POSIX Mutexes:
|
|
||||||
* o bdbuf lock
|
|
||||||
* o bdbuf sync lock
|
|
||||||
*/
|
|
||||||
#define _CONFIGURE_LIBBLOCK_POSIX_MUTEXES 2
|
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
* Semaphores:
|
* Semaphores:
|
||||||
@@ -1852,8 +1845,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
* o bdbuf buffer condition
|
* o bdbuf buffer condition
|
||||||
*/
|
*/
|
||||||
#define _CONFIGURE_LIBBLOCK_SEMAPHORES 6
|
#define _CONFIGURE_LIBBLOCK_SEMAPHORES 6
|
||||||
|
|
||||||
#define _CONFIGURE_LIBBLOCK_POSIX_MUTEXES 0
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIGURE_HAS_OWN_BDBUF_TABLE) || \
|
#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
|
#define _CONFIGURE_LIBBLOCK_TASK_EXTRA_STACKS 0
|
||||||
/** This specifies the number of Classic API semaphores needed by libblock. */
|
/** This specifies the number of Classic API semaphores needed by libblock. */
|
||||||
#define _CONFIGURE_LIBBLOCK_SEMAPHORES 0
|
#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 */
|
#endif /* CONFIGURE_APPLICATION_NEEDS_LIBBLOCK */
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|
||||||
@@ -2041,10 +2030,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS \
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS \
|
||||||
rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
|
rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
|
||||||
#endif
|
#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)
|
#if !defined(CONFIGURE_MAXIMUM_POSIX_TIMERS)
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_TIMERS \
|
#define CONFIGURE_MAXIMUM_POSIX_TIMERS \
|
||||||
rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
|
rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE)
|
||||||
@@ -2423,7 +2408,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <mqueue.h>
|
#include <mqueue.h>
|
||||||
#include <rtems/posix/mqueue.h>
|
#include <rtems/posix/mqueue.h>
|
||||||
#include <rtems/posix/mutex.h>
|
|
||||||
#include <rtems/posix/psignal.h>
|
#include <rtems/posix/psignal.h>
|
||||||
#include <rtems/posix/pthread.h>
|
#include <rtems/posix/pthread.h>
|
||||||
#include <rtems/posix/semaphore.h>
|
#include <rtems/posix/semaphore.h>
|
||||||
@@ -2448,21 +2432,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 0
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 0
|
||||||
#endif
|
#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
|
* This configuration parameter specifies the maximum number of
|
||||||
* POSIX API timers.
|
* POSIX API timers.
|
||||||
@@ -2624,13 +2593,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
*/
|
*/
|
||||||
/**@{*/
|
/**@{*/
|
||||||
#ifdef CONFIGURE_GNAT_RTEMS
|
#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
|
* This is the maximum number of Ada tasks which can be concurrently
|
||||||
* in existence. Twenty (20) are required to run all tests in the
|
* 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
|
#ifndef CONFIGURE_MAXIMUM_FAKE_ADA_TASKS
|
||||||
#define CONFIGURE_MAXIMUM_FAKE_ADA_TASKS 0
|
#define CONFIGURE_MAXIMUM_FAKE_ADA_TASKS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/** This defines he number of POSIX mutexes GNAT needs. */
|
/** 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. */
|
/** This defines he number of Ada tasks needed by the application. */
|
||||||
#define CONFIGURE_MAXIMUM_ADA_TASKS 0
|
#define CONFIGURE_MAXIMUM_ADA_TASKS 0
|
||||||
/**
|
/**
|
||||||
@@ -2674,11 +2634,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
#ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
|
#ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 1
|
||||||
#endif
|
#endif
|
||||||
#ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define _CONFIGURE_GO_INIT_MUTEXES 77
|
|
||||||
|
|
||||||
#ifndef CONFIGURE_MAXIMUM_GOROUTINES
|
#ifndef CONFIGURE_MAXIMUM_GOROUTINES
|
||||||
#define CONFIGURE_MAXIMUM_GOROUTINES 400
|
#define CONFIGURE_MAXIMUM_GOROUTINES 400
|
||||||
@@ -2689,12 +2644,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#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. */
|
/** This specifies the maximum number of Go co-routines. */
|
||||||
#define CONFIGURE_MAXIMUM_GOROUTINES 0
|
#define CONFIGURE_MAXIMUM_GOROUTINES 0
|
||||||
|
|
||||||
@@ -2720,25 +2669,12 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
CONFIGURE_MAXIMUM_GOROUTINES)
|
CONFIGURE_MAXIMUM_GOROUTINES)
|
||||||
|
|
||||||
#ifdef RTEMS_POSIX_API
|
#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
|
* This macro is calculated to specify the memory required for
|
||||||
* the POSIX API in its entirety.
|
* the POSIX API in its entirety.
|
||||||
*/
|
*/
|
||||||
#define _CONFIGURE_MEMORY_FOR_POSIX \
|
#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_MAXIMUM_POSIX_QUEUED_SIGNALS) + \
|
||||||
_CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( \
|
_CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( \
|
||||||
CONFIGURE_MAXIMUM_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 = {
|
posix_api_configuration_table Configuration_POSIX_API = {
|
||||||
_CONFIGURE_POSIX_THREADS,
|
_CONFIGURE_POSIX_THREADS,
|
||||||
_CONFIGURE_POSIX_MUTEXES,
|
|
||||||
CONFIGURE_MAXIMUM_POSIX_TIMERS,
|
CONFIGURE_MAXIMUM_POSIX_TIMERS,
|
||||||
CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS,
|
CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS,
|
||||||
CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES,
|
CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES,
|
||||||
@@ -3402,7 +3337,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
|
|
||||||
#ifdef RTEMS_POSIX_API
|
#ifdef RTEMS_POSIX_API
|
||||||
/* POSIX API Pieces */
|
/* POSIX API Pieces */
|
||||||
uint32_t POSIX_MUTEXES;
|
|
||||||
uint32_t POSIX_TIMERS;
|
uint32_t POSIX_TIMERS;
|
||||||
uint32_t POSIX_QUEUED_SIGNALS;
|
uint32_t POSIX_QUEUED_SIGNALS;
|
||||||
uint32_t POSIX_MESSAGE_QUEUES;
|
uint32_t POSIX_MESSAGE_QUEUES;
|
||||||
@@ -3451,7 +3385,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
|
|
||||||
#ifdef RTEMS_POSIX_API
|
#ifdef RTEMS_POSIX_API
|
||||||
/* POSIX API Pieces */
|
/* POSIX API Pieces */
|
||||||
_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_MAXIMUM_POSIX_QUEUED_SIGNALS ),
|
||||||
_CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(
|
_CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(
|
||||||
@@ -3521,7 +3454,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
|
|||||||
*/
|
*/
|
||||||
#if !defined(RTEMS_POSIX_API)
|
#if !defined(RTEMS_POSIX_API)
|
||||||
#if ((CONFIGURE_MAXIMUM_POSIX_THREADS != 0) || \
|
#if ((CONFIGURE_MAXIMUM_POSIX_THREADS != 0) || \
|
||||||
(CONFIGURE_MAXIMUM_POSIX_MUTEXES != 0) || \
|
|
||||||
(CONFIGURE_MAXIMUM_POSIX_TIMERS != 0) || \
|
(CONFIGURE_MAXIMUM_POSIX_TIMERS != 0) || \
|
||||||
(CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0) || \
|
(CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0) || \
|
||||||
(CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES != 0) || \
|
(CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES != 0) || \
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include <rtems/posix/posixapi.h>
|
#include <rtems/posix/posixapi.h>
|
||||||
#include <rtems/posix/barrierimpl.h>
|
#include <rtems/posix/barrierimpl.h>
|
||||||
#include <rtems/posix/condimpl.h>
|
#include <rtems/posix/condimpl.h>
|
||||||
|
#include <rtems/posix/muteximpl.h>
|
||||||
#include <rtems/posix/rwlockimpl.h>
|
#include <rtems/posix/rwlockimpl.h>
|
||||||
#include <rtems/posix/semaphoreimpl.h>
|
#include <rtems/posix/semaphoreimpl.h>
|
||||||
#include <rtems/score/heap.h>
|
#include <rtems/score/heap.h>
|
||||||
@@ -107,6 +108,26 @@ RTEMS_STATIC_ASSERT(
|
|||||||
POSIX_CONDITION_VARIABLES_MAGIC != HEAP_FREE_PATTERN,
|
POSIX_CONDITION_VARIABLES_MAGIC != HEAP_FREE_PATTERN,
|
||||||
POSIX_CONDITION_VARIABLES_MAGIC_4
|
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
|
#endif
|
||||||
|
|
||||||
RTEMS_STATIC_ASSERT(
|
RTEMS_STATIC_ASSERT(
|
||||||
@@ -121,6 +142,10 @@ RTEMS_STATIC_ASSERT(
|
|||||||
POSIX_SEMAPHORE_MAGIC != POSIX_CONDITION_VARIABLES_MAGIC,
|
POSIX_SEMAPHORE_MAGIC != POSIX_CONDITION_VARIABLES_MAGIC,
|
||||||
POSIX_SEMAPHORE_MAGIC_7
|
POSIX_SEMAPHORE_MAGIC_7
|
||||||
);
|
);
|
||||||
|
RTEMS_STATIC_ASSERT(
|
||||||
|
POSIX_SEMAPHORE_MAGIC != POSIX_MUTEX_MAGIC,
|
||||||
|
POSIX_SEMAPHORE_MAGIC_8
|
||||||
|
);
|
||||||
RTEMS_STATIC_ASSERT(
|
RTEMS_STATIC_ASSERT(
|
||||||
POSIX_BARRIER_MAGIC != POSIX_RWLOCK_MAGIC,
|
POSIX_BARRIER_MAGIC != POSIX_RWLOCK_MAGIC,
|
||||||
POSIX_BARRIER_MAGIC_5
|
POSIX_BARRIER_MAGIC_5
|
||||||
@@ -129,10 +154,22 @@ RTEMS_STATIC_ASSERT(
|
|||||||
POSIX_BARRIER_MAGIC != POSIX_CONDITION_VARIABLES_MAGIC,
|
POSIX_BARRIER_MAGIC != POSIX_CONDITION_VARIABLES_MAGIC,
|
||||||
POSIX_BARRIER_MAGIC_6
|
POSIX_BARRIER_MAGIC_6
|
||||||
);
|
);
|
||||||
|
RTEMS_STATIC_ASSERT(
|
||||||
|
POSIX_BARRIER_MAGIC != POSIX_MUTEX_MAGIC,
|
||||||
|
POSIX_BARRIER_MAGIC_7
|
||||||
|
);
|
||||||
RTEMS_STATIC_ASSERT(
|
RTEMS_STATIC_ASSERT(
|
||||||
POSIX_RWLOCK_MAGIC != POSIX_CONDITION_VARIABLES_MAGIC,
|
POSIX_RWLOCK_MAGIC != POSIX_CONDITION_VARIABLES_MAGIC,
|
||||||
POSIX_RWLOCK_MAGIC_5
|
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 )
|
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/freechain.h
|
||||||
include_rtems_score_HEADERS += include/rtems/score/mrsp.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/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/object.h
|
||||||
include_rtems_score_HEADERS += include/rtems/score/objectimpl.h
|
include_rtems_score_HEADERS += include/rtems/score/objectimpl.h
|
||||||
include_rtems_score_HEADERS += include/rtems/score/onceimpl.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_KEYS = 2,
|
||||||
OBJECTS_POSIX_INTERRUPTS = 3,
|
OBJECTS_POSIX_INTERRUPTS = 3,
|
||||||
OBJECTS_POSIX_MESSAGE_QUEUES = 5,
|
OBJECTS_POSIX_MESSAGE_QUEUES = 5,
|
||||||
OBJECTS_POSIX_MUTEXES = 6,
|
|
||||||
OBJECTS_POSIX_SEMAPHORES = 7,
|
OBJECTS_POSIX_SEMAPHORES = 7,
|
||||||
OBJECTS_POSIX_TIMERS = 9,
|
OBJECTS_POSIX_TIMERS = 9,
|
||||||
OBJECTS_POSIX_SHMS = 12
|
OBJECTS_POSIX_SHMS = 12
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ extern "C" {
|
|||||||
#define RTEMS_SYSINIT_CLASSIC_BARRIER 00034a
|
#define RTEMS_SYSINIT_CLASSIC_BARRIER 00034a
|
||||||
#define RTEMS_SYSINIT_POSIX_SIGNALS 000360
|
#define RTEMS_SYSINIT_POSIX_SIGNALS 000360
|
||||||
#define RTEMS_SYSINIT_POSIX_THREADS 000361
|
#define RTEMS_SYSINIT_POSIX_THREADS 000361
|
||||||
#define RTEMS_SYSINIT_POSIX_MUTEX 000363
|
|
||||||
#define RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE 000364
|
#define RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE 000364
|
||||||
#define RTEMS_SYSINIT_POSIX_SEMAPHORE 000365
|
#define RTEMS_SYSINIT_POSIX_SEMAPHORE 000365
|
||||||
#define RTEMS_SYSINIT_POSIX_TIMER 000366
|
#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
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/mrspimpl.h
|
||||||
PREINSTALL_FILES += $(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)
|
$(PROJECT_INCLUDE)/rtems/score/object.h: include/rtems/score/object.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/object.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/object.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/object.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/object.h
|
||||||
|
|||||||
@@ -20,16 +20,12 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include <rtems/score/assert.h>
|
#include <rtems/score/assert.h>
|
||||||
|
#include <rtems/score/muteximpl.h>
|
||||||
#include <rtems/score/threadimpl.h>
|
#include <rtems/score/threadimpl.h>
|
||||||
#include <rtems/score/threadqimpl.h>
|
|
||||||
#include <rtems/score/todimpl.h>
|
#include <rtems/score/todimpl.h>
|
||||||
|
|
||||||
#define MUTEX_TQ_OPERATIONS &_Thread_queue_Operations_priority_inherit
|
#define MUTEX_TQ_OPERATIONS &_Thread_queue_Operations_priority_inherit
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
Thread_queue_Syslock_queue Queue;
|
|
||||||
} Mutex_Control;
|
|
||||||
|
|
||||||
RTEMS_STATIC_ASSERT(
|
RTEMS_STATIC_ASSERT(
|
||||||
offsetof( Mutex_Control, Queue )
|
offsetof( Mutex_Control, Queue )
|
||||||
== offsetof( struct _Mutex_Control, _Queue ),
|
== offsetof( struct _Mutex_Control, _Queue ),
|
||||||
@@ -41,11 +37,6 @@ RTEMS_STATIC_ASSERT(
|
|||||||
MUTEX_CONTROL_SIZE
|
MUTEX_CONTROL_SIZE
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
Mutex_Control Mutex;
|
|
||||||
unsigned int nest_level;
|
|
||||||
} Mutex_recursive_Control;
|
|
||||||
|
|
||||||
RTEMS_STATIC_ASSERT(
|
RTEMS_STATIC_ASSERT(
|
||||||
offsetof( Mutex_recursive_Control, Mutex )
|
offsetof( Mutex_recursive_Control, Mutex )
|
||||||
== offsetof( struct _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 );
|
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 *POSIX_Init(
|
||||||
void *argument
|
void *argument
|
||||||
)
|
)
|
||||||
@@ -255,11 +422,15 @@ void *POSIX_Init(
|
|||||||
int old_ceiling;
|
int old_ceiling;
|
||||||
int priority;
|
int priority;
|
||||||
|
|
||||||
rtems_test_assert( MUTEX_BAD_ID != PTHREAD_MUTEX_INITIALIZER );
|
Mutex_bad_id = NULL;
|
||||||
Mutex_bad_id = MUTEX_BAD_ID;
|
|
||||||
|
|
||||||
TEST_BEGIN();
|
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_get_priority();
|
||||||
test_set_priority();
|
test_set_priority();
|
||||||
test_errors_pthread_setschedprio();
|
test_errors_pthread_setschedprio();
|
||||||
@@ -504,7 +675,7 @@ void *POSIX_Init(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
puts( "Init: pthread_mutex_trylock - EINVAL (illegal ID)" );
|
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 )
|
if ( status != EINVAL )
|
||||||
printf( "status = %d\n", status );
|
printf( "status = %d\n", status );
|
||||||
rtems_test_assert( status == EINVAL );
|
rtems_test_assert( status == EINVAL );
|
||||||
@@ -546,7 +717,7 @@ void *POSIX_Init(
|
|||||||
/* switch to task 1 */
|
/* switch to task 1 */
|
||||||
|
|
||||||
puts( "Init: pthread_mutex_unlock - EINVAL (invalid id)" );
|
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 )
|
if ( status != EINVAL )
|
||||||
printf( "status = %d\n", status );
|
printf( "status = %d\n", status );
|
||||||
rtems_test_assert( status == EINVAL );
|
rtems_test_assert( status == EINVAL );
|
||||||
@@ -593,20 +764,24 @@ void *POSIX_Init(
|
|||||||
printf( "status = %d\n", status );
|
printf( "status = %d\n", status );
|
||||||
rtems_test_assert( !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 );
|
status = pthread_mutex_init( &Mutex3_id, &attr );
|
||||||
rtems_test_assert( status == EAGAIN );
|
rtems_test_assert( !status );
|
||||||
|
|
||||||
puts( "Init: pthread_mutexattr_destroy - SUCCESSFUL" );
|
puts( "Init: pthread_mutexattr_destroy - SUCCESSFUL" );
|
||||||
status = pthread_mutexattr_destroy( &attr );
|
status = pthread_mutexattr_destroy( &attr );
|
||||||
rtems_test_assert( !status );
|
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" );
|
puts( "Init: pthread_mutex_destroy - SUCCESSFUL" );
|
||||||
status = pthread_mutex_destroy( &Mutex2_id );
|
status = pthread_mutex_destroy( &Mutex2_id );
|
||||||
rtems_test_assert( !status );
|
rtems_test_assert( !status );
|
||||||
|
|
||||||
puts( "Init: pthread_mutex_destroy - EINVAL (invalid id)" );
|
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 );
|
rtems_test_assert( status == EINVAL );
|
||||||
|
|
||||||
/* destroy a busy mutex */
|
/* destroy a busy mutex */
|
||||||
@@ -713,7 +888,7 @@ void *POSIX_Init(
|
|||||||
rtems_test_assert( !status );
|
rtems_test_assert( !status );
|
||||||
|
|
||||||
puts( "Init: pthread_mutex_getprioceiling - EINVAL (invalid id)" );
|
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 );
|
rtems_test_assert( status == EINVAL );
|
||||||
|
|
||||||
puts( "Init: pthread_mutex_getprioceiling - EINVAL (NULL ceiling)" );
|
puts( "Init: pthread_mutex_getprioceiling - EINVAL (NULL ceiling)" );
|
||||||
@@ -725,7 +900,7 @@ void *POSIX_Init(
|
|||||||
printf( "Init: pthread_mutex_getprioceiling - %d\n", ceiling );
|
printf( "Init: pthread_mutex_getprioceiling - %d\n", ceiling );
|
||||||
|
|
||||||
puts( "Init: pthread_mutex_setprioceiling - EINVAL (invalid id)" );
|
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 );
|
rtems_test_assert( status == EINVAL );
|
||||||
|
|
||||||
puts( "Init: pthread_mutex_setprioceiling - EINVAL (illegal priority)" );
|
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 - EINVAL (NULL attr)
|
||||||
Init: pthread_mutexattr_init - SUCCESSFUL
|
Init: pthread_mutexattr_init - SUCCESSFUL
|
||||||
Init: mutex protocol is (0) -- PTHREAD_PRIO_NONE
|
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: mutex process shared is (0) -- PTHREAD_PROCESS_PRIVATE
|
||||||
Init: pthread_mutexattr_destroy - SUCCESSFUL
|
Init: pthread_mutexattr_destroy - SUCCESSFUL
|
||||||
Init: pthread_mutexattr_destroy - EINVAL (NULL attr)
|
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_timedlock - EAGAIN (timeout)
|
||||||
|
|
||||||
Init: pthread_mutex_init - SUCCESSFUL
|
Init: pthread_mutex_init - SUCCESSFUL
|
||||||
Init: pthread_mutex_init - EAGAIN (too many)
|
Init: pthread_mutex_init - SUCCESSFUL
|
||||||
Init: pthread_mutexattr_destroy - SUCCESSFUL
|
Init: pthread_mutexattr_destroy - SUCCESSFUL
|
||||||
Init: pthread_mutex_destroy - SUCCESSFUL
|
Init: pthread_mutex_destroy - SUCCESSFUL
|
||||||
|
Init: pthread_mutex_destroy - SUCCESSFUL
|
||||||
Init: pthread_mutex_destroy - EINVAL (invalid id)
|
Init: pthread_mutex_destroy - EINVAL (invalid id)
|
||||||
|
|
||||||
Init: pthread_mutexattr_init - SUCCESSFUL
|
Init: pthread_mutexattr_init - SUCCESSFUL
|
||||||
@@ -113,8 +114,6 @@ Task 3: pthread_mutex_lock unavailable (inherit case)
|
|||||||
Init: pthread_mutex_unlock - SUCCESSFUL
|
Init: pthread_mutex_unlock - SUCCESSFUL
|
||||||
Task 3: mutex acquired
|
Task 3: mutex acquired
|
||||||
Task 3: unlock Mutex 2
|
Task 3: unlock Mutex 2
|
||||||
Task 3: pthread_getschedparam priority = 199
|
|
||||||
Task 3: exit
|
|
||||||
Init: pthread_mutex_getprioceiling- ceiling = 200
|
Init: pthread_mutex_getprioceiling- ceiling = 200
|
||||||
Init: pthread_setschedparam - set Init priority to highest
|
Init: pthread_setschedparam - set Init priority to highest
|
||||||
Init: pthread_mutex_lock - EINVAL (priority ceiling violation)
|
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_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 4
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 4
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2
|
|
||||||
|
|
||||||
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
|
#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 Mutex_id;
|
||||||
TEST_EXTERN pthread_mutex_t Mutex2_id;
|
TEST_EXTERN pthread_mutex_t Mutex2_id;
|
||||||
TEST_EXTERN pthread_mutex_t Mutex3_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 */
|
/* end of include file */
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ void *Task_2(
|
|||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 10
|
|
||||||
|
|
||||||
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
|
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ void *Task_3(
|
|||||||
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
|
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
|
||||||
|
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_THREADS 4
|
#define CONFIGURE_MAXIMUM_POSIX_THREADS 4
|
||||||
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2
|
|
||||||
|
|
||||||
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
|
#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