forked from Imagelibrary/rtems
posix: _POSIX_Mutex_Default_attributes
Make _POSIX_Mutex_Default_attributes constant and independent of the scheduler instance. Use INT_MAX to indicate the default ceiling priority.
This commit is contained in:
@@ -20,6 +20,7 @@ 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/posixapi.h
|
include_rtems_posix_HEADERS += include/rtems/posix/posixapi.h
|
||||||
|
include_rtems_posix_HEADERS += include/rtems/posix/priorityimpl.h
|
||||||
|
|
||||||
if HAS_PTHREADS
|
if HAS_PTHREADS
|
||||||
# include
|
# include
|
||||||
@@ -37,7 +38,6 @@ 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/mutex.h
|
||||||
include_rtems_posix_HEADERS += include/rtems/posix/muteximpl.h
|
include_rtems_posix_HEADERS += include/rtems/posix/muteximpl.h
|
||||||
include_rtems_posix_HEADERS += include/rtems/posix/priorityimpl.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
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ extern Objects_Information _POSIX_Mutex_Information;
|
|||||||
/**
|
/**
|
||||||
* The default mutex attributes structure.
|
* The default mutex attributes structure.
|
||||||
*/
|
*/
|
||||||
extern 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 void _POSIX_Mutex_Acquire_critical(
|
||||||
POSIX_Mutex_Control *the_mutex,
|
POSIX_Mutex_Control *the_mutex,
|
||||||
|
|||||||
@@ -59,6 +59,16 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define POSIX_SCHEDULER_MINIMUM_PRIORITY (1)
|
#define POSIX_SCHEDULER_MINIMUM_PRIORITY (1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the maximum POSIX API priority for this scheduler instance.
|
||||||
|
*
|
||||||
|
* Such a priority is valid. A scheduler instance may support priority values
|
||||||
|
* that are not representable as an integer.
|
||||||
|
*
|
||||||
|
* @return The maximum POSIX API priority for this scheduler instance.
|
||||||
|
*/
|
||||||
|
int _POSIX_Priority_Get_maximum( const Scheduler_Control *scheduler );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Check if POSIX priority is valid.
|
* @brief Check if POSIX priority is valid.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -43,6 +43,10 @@ $(PROJECT_INCLUDE)/rtems/posix/posixapi.h: include/rtems/posix/posixapi.h $(PROJ
|
|||||||
$(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
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h: include/rtems/posix/priorityimpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h
|
||||||
|
|
||||||
if HAS_PTHREADS
|
if HAS_PTHREADS
|
||||||
$(PROJECT_INCLUDE)/aio.h: include/aio.h $(PROJECT_INCLUDE)/$(dirstamp)
|
$(PROJECT_INCLUDE)/aio.h: include/aio.h $(PROJECT_INCLUDE)/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/aio.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/aio.h
|
||||||
@@ -85,10 +89,6 @@ $(PROJECT_INCLUDE)/rtems/posix/muteximpl.h: include/rtems/posix/muteximpl.h $(PR
|
|||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/muteximpl.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/muteximpl.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/muteximpl.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/muteximpl.h
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h: include/rtems/posix/priorityimpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp)
|
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h
|
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.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
|
||||||
|
|||||||
@@ -18,21 +18,25 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#include <rtems/system.h>
|
|
||||||
#include <rtems/config.h>
|
#include <rtems/config.h>
|
||||||
#include <rtems/sysinit.h>
|
#include <rtems/sysinit.h>
|
||||||
#include <rtems/score/coremuteximpl.h>
|
|
||||||
#include <rtems/score/watchdog.h>
|
|
||||||
#include <rtems/posix/muteximpl.h>
|
#include <rtems/posix/muteximpl.h>
|
||||||
#include <rtems/posix/priorityimpl.h>
|
#include <rtems/score/objectimpl.h>
|
||||||
|
|
||||||
Objects_Information _POSIX_Mutex_Information;
|
Objects_Information _POSIX_Mutex_Information;
|
||||||
|
|
||||||
pthread_mutexattr_t _POSIX_Mutex_Default_attributes;
|
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
|
* _POSIX_Mutex_Manager_initialization
|
||||||
@@ -47,21 +51,6 @@ pthread_mutexattr_t _POSIX_Mutex_Default_attributes;
|
|||||||
|
|
||||||
static void _POSIX_Mutex_Manager_initialization(void)
|
static void _POSIX_Mutex_Manager_initialization(void)
|
||||||
{
|
{
|
||||||
pthread_mutexattr_t *default_attr = &_POSIX_Mutex_Default_attributes;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Since the maximum priority is run-time configured, this
|
|
||||||
* structure cannot be initialized statically.
|
|
||||||
*/
|
|
||||||
default_attr->is_initialized = true;
|
|
||||||
default_attr->process_shared = PTHREAD_PROCESS_PRIVATE;
|
|
||||||
default_attr->prio_ceiling = POSIX_SCHEDULER_MAXIMUM_PRIORITY;
|
|
||||||
default_attr->protocol = PTHREAD_PRIO_NONE;
|
|
||||||
default_attr->recursive = false;
|
|
||||||
#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES)
|
|
||||||
default_attr->type = PTHREAD_MUTEX_DEFAULT;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the POSIX mutex object class information structure.
|
* Initialize the POSIX mutex object class information structure.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ 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;
|
||||||
|
const Scheduler_Control *scheduler;
|
||||||
Priority_Control priority;
|
Priority_Control priority;
|
||||||
|
|
||||||
if ( attr ) the_attr = attr;
|
if ( attr ) the_attr = attr;
|
||||||
@@ -105,11 +106,20 @@ int pthread_mutex_init(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
|
if ( protocol == POSIX_MUTEX_PRIORITY_CEILING ) {
|
||||||
if ( !_POSIX_Priority_Is_valid( the_attr->prio_ceiling ) ) {
|
int prio_ceiling;
|
||||||
|
|
||||||
|
scheduler = _Scheduler_Get_own( _Thread_Get_executing() );
|
||||||
|
prio_ceiling = the_attr->prio_ceiling;
|
||||||
|
|
||||||
|
if ( prio_ceiling == INT_MAX ) {
|
||||||
|
prio_ceiling = _POSIX_Priority_Get_maximum( scheduler );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !_POSIX_Priority_Is_valid( prio_ceiling ) ) {
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
priority = _POSIX_Priority_To_core( the_attr->prio_ceiling );
|
priority = _POSIX_Priority_To_core( prio_ceiling );
|
||||||
}
|
}
|
||||||
|
|
||||||
the_mutex = _POSIX_Mutex_Allocate();
|
the_mutex = _POSIX_Mutex_Allocate();
|
||||||
|
|||||||
@@ -18,9 +18,17 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <rtems/system.h>
|
|
||||||
#include <rtems/posix/priorityimpl.h>
|
#include <rtems/posix/priorityimpl.h>
|
||||||
|
|
||||||
|
int _POSIX_Priority_Get_maximum( const Scheduler_Control *scheduler )
|
||||||
|
{
|
||||||
|
if ( scheduler->maximum_priority < INT_MAX ) {
|
||||||
|
return (int) scheduler->maximum_priority - 1;
|
||||||
|
} else {
|
||||||
|
return INT_MAX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool _POSIX_Priority_Is_valid(
|
bool _POSIX_Priority_Is_valid(
|
||||||
int priority
|
int priority
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -21,10 +21,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include <rtems/system.h>
|
|
||||||
#include <rtems/seterr.h>
|
#include <rtems/seterr.h>
|
||||||
|
#include <rtems/posix/priorityimpl.h>
|
||||||
#include <rtems/score/schedulerimpl.h>
|
#include <rtems/score/schedulerimpl.h>
|
||||||
|
|
||||||
int sched_get_priority_max(
|
int sched_get_priority_max(
|
||||||
@@ -45,10 +44,5 @@ int sched_get_priority_max(
|
|||||||
}
|
}
|
||||||
|
|
||||||
scheduler = _Scheduler_Get_own( _Thread_Get_executing() );
|
scheduler = _Scheduler_Get_own( _Thread_Get_executing() );
|
||||||
|
return _POSIX_Priority_Get_maximum( scheduler );
|
||||||
if ( scheduler->maximum_priority > INT_MAX ) {
|
|
||||||
return INT_MAX;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (int) scheduler->maximum_priority - 1;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user