From c42be504c92d76d2e06d0fc8ebd05fc913376d2d Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 16 Nov 2016 14:50:09 +0100 Subject: posix: Add self-contained pthread spinlock Turn pthread_spinlock_t into a self-contained object. On uni-processor configurations, interrupts are disabled in the lock/trylock operations and the previous interrupt status is restored in the corresponding unlock operations. On SMP configurations, a ticket lock is a acquired and released in addition. The self-contained pthread_spinlock_t object is defined by Newlib in . typedef struct { struct _Ticket_lock_Control _lock; __uint32_t _interrupt_state; } pthread_spinlock_t; This implementation is simple and efficient. However, this test case of the Linux Test Project would fail due to call of printf() and sleep() during spin lock ownership: https://github.com/linux-test-project/ltp/blob/master/testcases/open_posix_testsuite/conformance/interfaces/pthread_spin_lock/1-2.c There is only limited support for profiling on SMP configurations. Delete CORE spinlock implementation. Update #2674. --- cpukit/configure.ac | 1 + cpukit/libcsupport/include/rtems/libcsupport.h | 1 - cpukit/libcsupport/src/resource_snapshot.c | 2 - cpukit/posix/Makefile.am | 14 +- cpukit/posix/include/rtems/posix/config.h | 6 - cpukit/posix/include/rtems/posix/spinlock.h | 63 ------- cpukit/posix/include/rtems/posix/spinlockimpl.h | 81 ++++----- cpukit/posix/preinstall.am | 12 +- cpukit/posix/src/pspin.c | 51 ------ cpukit/posix/src/pspindestroy.c | 30 +--- cpukit/posix/src/pspininit.c | 52 +----- cpukit/posix/src/pspinlock.c | 96 ++++++++-- cpukit/posix/src/pspintrylock.c | 42 ----- cpukit/posix/src/pspinunlock.c | 36 ++-- cpukit/rtems/src/rtemsobjectgetapiclassname.c | 1 - cpukit/sapi/include/confdefs.h | 28 --- cpukit/score/Makefile.am | 8 - cpukit/score/include/rtems/score/corespinlock.h | 77 -------- .../score/include/rtems/score/corespinlockimpl.h | 130 -------------- cpukit/score/include/rtems/score/objectimpl.h | 3 +- cpukit/score/include/rtems/sysinit.h | 1 - cpukit/score/preinstall.am | 8 - cpukit/score/src/corespinlockrelease.c | 51 ------ cpukit/score/src/corespinlockwait.c | 102 ----------- testsuites/psxtests/Makefile.am | 2 +- testsuites/psxtests/configure.ac | 1 - testsuites/psxtests/psxconfig01/init.c | 13 -- testsuites/psxtests/psxspin01/main.c | 2 - testsuites/psxtests/psxspin01/psxspin01.scn | 46 ++--- testsuites/psxtests/psxspin01/test.c | 196 ++++++--------------- testsuites/psxtests/psxspin02/Makefile.am | 24 --- testsuites/psxtests/psxspin02/main.c | 59 ------- testsuites/psxtests/psxspin02/psxspin02.doc | 25 --- testsuites/psxtests/psxspin02/psxspin02.scn | 8 - testsuites/psxtests/psxspin02/test.c | 108 ------------ testsuites/sptests/spsysinit01/init.c | 17 -- 36 files changed, 240 insertions(+), 1157 deletions(-) delete mode 100644 cpukit/posix/include/rtems/posix/spinlock.h delete mode 100644 cpukit/posix/src/pspin.c delete mode 100644 cpukit/posix/src/pspintrylock.c delete mode 100644 cpukit/score/include/rtems/score/corespinlock.h delete mode 100644 cpukit/score/include/rtems/score/corespinlockimpl.h delete mode 100644 cpukit/score/src/corespinlockrelease.c delete mode 100644 cpukit/score/src/corespinlockwait.c delete mode 100644 testsuites/psxtests/psxspin02/Makefile.am delete mode 100644 testsuites/psxtests/psxspin02/main.c delete mode 100644 testsuites/psxtests/psxspin02/psxspin02.doc delete mode 100644 testsuites/psxtests/psxspin02/psxspin02.scn delete mode 100644 testsuites/psxtests/psxspin02/test.c diff --git a/cpukit/configure.ac b/cpukit/configure.ac index 136630bd7e..5a6c2e66bf 100644 --- a/cpukit/configure.ac +++ b/cpukit/configure.ac @@ -74,6 +74,7 @@ AC_CHECK_HEADERS([envlock.h]) AC_CHECK_DECLS([__env_lock],,,[#include ]) AC_CHECK_DECLS([__env_unlock],,,[#include ]) AC_CHECK_TYPES([struct _Thread_queue_Queue],[],[],[#include ]) +AC_CHECK_SIZEOF([pthread_spinlock_t],[],[],[#include ]) # Mandated by POSIX, older newlibs bogusly provided CLOCK_PROCESS_CPUTIME+CLOCK_THREAD_CPUTIME AC_CHECK_DECL([CLOCK_PROCESS_CPUTIME_ID],[],[AC_MSG_ERROR([missing define CLOCK_PROCESS_CPUTIME_ID])],[#include ]) diff --git a/cpukit/libcsupport/include/rtems/libcsupport.h b/cpukit/libcsupport/include/rtems/libcsupport.h index c0fab6be97..e51b250f13 100644 --- a/cpukit/libcsupport/include/rtems/libcsupport.h +++ b/cpukit/libcsupport/include/rtems/libcsupport.h @@ -117,7 +117,6 @@ typedef struct { uint32_t active_mutexes; uint32_t active_rwlocks; uint32_t active_semaphores; - uint32_t active_spinlocks; uint32_t active_threads; uint32_t active_timers; } rtems_resource_posix_api; diff --git a/cpukit/libcsupport/src/resource_snapshot.c b/cpukit/libcsupport/src/resource_snapshot.c index 23177c4c37..d0dda9f7ca 100644 --- a/cpukit/libcsupport/src/resource_snapshot.c +++ b/cpukit/libcsupport/src/resource_snapshot.c @@ -49,7 +49,6 @@ #include #include #include - #include #include #endif @@ -76,7 +75,6 @@ static const struct { { OBJECTS_POSIX_API, OBJECTS_POSIX_MUTEXES }, { OBJECTS_POSIX_API, OBJECTS_POSIX_RWLOCKS }, { OBJECTS_POSIX_API, OBJECTS_POSIX_SEMAPHORES }, - { OBJECTS_POSIX_API, OBJECTS_POSIX_SPINLOCKS }, { OBJECTS_POSIX_API, OBJECTS_POSIX_THREADS }, { OBJECTS_POSIX_API, OBJECTS_POSIX_TIMERS } #endif diff --git a/cpukit/posix/Makefile.am b/cpukit/posix/Makefile.am index 5bf11c7713..d9a3437b13 100644 --- a/cpukit/posix/Makefile.am +++ b/cpukit/posix/Makefile.am @@ -21,6 +21,7 @@ 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/posixapi.h include_rtems_posix_HEADERS += include/rtems/posix/priorityimpl.h +include_rtems_posix_HEADERS += include/rtems/posix/spinlockimpl.h if HAS_PTHREADS # include @@ -52,8 +53,6 @@ include_rtems_posix_HEADERS += include/rtems/posix/barrier.h include_rtems_posix_HEADERS += include/rtems/posix/barrierimpl.h include_rtems_posix_HEADERS += include/rtems/posix/rwlock.h include_rtems_posix_HEADERS += include/rtems/posix/rwlockimpl.h -include_rtems_posix_HEADERS += include/rtems/posix/spinlock.h -include_rtems_posix_HEADERS += include/rtems/posix/spinlockimpl.h ## src libposix_a_SOURCES += src/aio_cancel.c src/aio_error.c src/aio_fsync.c \ @@ -168,6 +167,12 @@ libposix_a_SOURCES += src/sigaddset.c src/sigdelset.c src/sigfillset.c \ libposix_a_SOURCES += src/sigprocmask.c +## SPINLOCK_C_FILES +libposix_a_SOURCES += src/pspindestroy.c +libposix_a_SOURCES += src/pspininit.c +libposix_a_SOURCES += src/pspinlock.c +libposix_a_SOURCES += src/pspinunlock.c + if HAS_PTHREADS libposix_a_SOURCES += src/sigpending.c \ src/sigqueue.c src/sigsuspend.c src/sigtimedwait.c \ @@ -188,11 +193,6 @@ libposix_a_SOURCES += src/semaphore.c src/semaphorecreatesupp.c \ src/semopen.c src/sempost.c src/semtimedwait.c src/semtrywait.c \ src/semunlink.c src/semwait.c -## SPINLOCK_C_FILES -libposix_a_SOURCES += src/pspin.c src/pspindestroy.c src/pspininit.c \ - src/pspinlock.c src/pspintrylock.c \ - src/pspinunlock.c - ## TIME_C_FILES libposix_a_SOURCES += src/adjtime.c src/clockgetcpuclockid.c diff --git a/cpukit/posix/include/rtems/posix/config.h b/cpukit/posix/include/rtems/posix/config.h index 636f1e7d79..11c73c2b2f 100644 --- a/cpukit/posix/include/rtems/posix/config.h +++ b/cpukit/posix/include/rtems/posix/config.h @@ -110,12 +110,6 @@ typedef struct { */ uint32_t maximum_rwlocks; - /** - * This field contains the maximum number of POSIX API - * spinlocks which are configured for this application. - */ - uint32_t maximum_spinlocks; - /** * This field contains the number of POSIX API Initialization * threads listed in @a User_initialization_thread_table. diff --git a/cpukit/posix/include/rtems/posix/spinlock.h b/cpukit/posix/include/rtems/posix/spinlock.h deleted file mode 100644 index 8da451ce22..0000000000 --- a/cpukit/posix/include/rtems/posix/spinlock.h +++ /dev/null @@ -1,63 +0,0 @@ -/** - * @file - * - * @brief POSIX Spinlock Support - * - * This include file contains all the constants and structures associated - * with the POSIX Spinlock Manager. - * - * Directives provided are: - * - * - create a spinlock - * - delete a spinlock - * - wait for a spinlock - */ - -/* - * 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_SPINLOCK_H -#define _RTEMS_POSIX_SPINLOCK_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup POSIX_SPINLOCK POSIX Spinlock Support - * - * @ingroup POSIXAPI - * - * @brief Constants and Structures Associated with the POSIX Spinlock Manager - * - */ -/**@{**/ - -/** - * This type defines the control block used to manage each spinlock. - */ - -typedef struct { - /** This is used to manage a spinlock as an object. */ - Objects_Control Object; - /** This is used to implement the spinlock. */ - CORE_spinlock_Control Spinlock; -} POSIX_Spinlock_Control; - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/cpukit/posix/include/rtems/posix/spinlockimpl.h b/cpukit/posix/include/rtems/posix/spinlockimpl.h index f1b5639bd1..36ef6677a0 100644 --- a/cpukit/posix/include/rtems/posix/spinlockimpl.h +++ b/cpukit/posix/include/rtems/posix/spinlockimpl.h @@ -11,6 +11,8 @@ * COPYRIGHT (c) 1989-2011. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2016 embedded brains GmbH + * * 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. @@ -19,62 +21,55 @@ #ifndef _RTEMS_POSIX_SPINLOCKIMPL_H #define _RTEMS_POSIX_SPINLOCKIMPL_H -#include -#include -#include - #include +#include + +#if defined(RTEMS_SMP) +#include +#include +#endif + #ifdef __cplusplus extern "C" { #endif -/** - * The following defines the information control block used to manage - * this class of objects. - */ +#if SIZEOF_PTHREAD_SPINLOCK_T > 4 +#define POSIX_SPINLOCKS_ARE_SELF_CONTAINED +#endif -extern Objects_Information _POSIX_Spinlock_Information; +typedef struct { +#if defined(RTEMS_SMP) + SMP_ticket_lock_Control Lock; +#else + unsigned int reserved[ 2 ]; +#endif + ISR_Level interrupt_state; +} POSIX_Spinlock_Control; -/** - * @brief Allocate a spinlock control block. - * - * This function allocates a spinlock control block from - * the inactive chain of free spinlock control blocks. - */ -RTEMS_INLINE_ROUTINE POSIX_Spinlock_Control *_POSIX_Spinlock_Allocate( void ) -{ - return (POSIX_Spinlock_Control *) - _Objects_Allocate( &_POSIX_Spinlock_Information ); -} +#if !defined(POSIX_SPINLOCKS_ARE_SELF_CONTAINED) +#if defined(RTEMS_SMP) +extern POSIX_Spinlock_Control _POSIX_Spinlock_Global; -/** - * @brief Free a spinlock control block. - * - * This routine frees a spinlock control block to the - * inactive chain of free spinlock control blocks. - */ -RTEMS_INLINE_ROUTINE void _POSIX_Spinlock_Free ( - POSIX_Spinlock_Control *the_spinlock -) -{ - _Objects_Free( &_POSIX_Spinlock_Information, &the_spinlock->Object ); -} +extern uint32_t _POSIX_Spinlock_Owner; +#endif + +extern int _POSIX_Spinlock_Nest_level; +#endif RTEMS_INLINE_ROUTINE POSIX_Spinlock_Control *_POSIX_Spinlock_Get( - pthread_spinlock_t *spinlock, - ISR_lock_Context *lock_context + pthread_spinlock_t *lock ) { - if ( spinlock == NULL ) { - return NULL; - } - - return (POSIX_Spinlock_Control *) _Objects_Get( - *spinlock, - lock_context, - &_POSIX_Spinlock_Information - ); +#if defined(POSIX_SPINLOCKS_ARE_SELF_CONTAINED) + return (POSIX_Spinlock_Control *) lock; +#elif defined(RTEMS_SMP) + (void) lock; + return &_POSIX_Spinlock_Global; +#else + (void) lock; + return NULL; +#endif } #ifdef __cplusplus diff --git a/cpukit/posix/preinstall.am b/cpukit/posix/preinstall.am index 1d035e7425..4f1b220fe1 100644 --- a/cpukit/posix/preinstall.am +++ b/cpukit/posix/preinstall.am @@ -47,6 +47,10 @@ $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h: include/rtems/posix/priorityimpl. $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h +$(PROJECT_INCLUDE)/rtems/posix/spinlockimpl.h: include/rtems/posix/spinlockimpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/spinlockimpl.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/spinlockimpl.h + if HAS_PTHREADS $(PROJECT_INCLUDE)/aio.h: include/aio.h $(PROJECT_INCLUDE)/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/aio.h @@ -144,14 +148,6 @@ PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/rwlock.h $(PROJECT_INCLUDE)/rtems/posix/rwlockimpl.h: include/rtems/posix/rwlockimpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/rwlockimpl.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/rwlockimpl.h - -$(PROJECT_INCLUDE)/rtems/posix/spinlock.h: include/rtems/posix/spinlock.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/spinlock.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/spinlock.h - -$(PROJECT_INCLUDE)/rtems/posix/spinlockimpl.h: include/rtems/posix/spinlockimpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/spinlockimpl.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/spinlockimpl.h endif if HAS_PTHREADS endif diff --git a/cpukit/posix/src/pspin.c b/cpukit/posix/src/pspin.c deleted file mode 100644 index 6c466bcab5..0000000000 --- a/cpukit/posix/src/pspin.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file - * - * This file contains the initialization of the POSIX Spinlock Manager. - */ - -/* - * COPYRIGHT (c) 1989-2013. - * 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 - -#include -#include -#include -#include - -Objects_Information _POSIX_Spinlock_Information; - -/** - * @brief _POSIX_Spinlock_Manager_initialization - */ -static void _POSIX_Spinlock_Manager_initialization(void) -{ - _Objects_Initialize_information( - &_POSIX_Spinlock_Information, /* object information table */ - OBJECTS_POSIX_API, /* object API */ - OBJECTS_POSIX_SPINLOCKS, /* object class */ - Configuration_POSIX_API.maximum_spinlocks, - /* maximum objects of this class */ - sizeof( POSIX_Spinlock_Control ),/* size of this object's control block */ - true, /* true if the name is a string */ - _POSIX_PATH_MAX, /* maximum length of each object's name */ - NULL /* Proxy extraction support callout */ - ); -} - -RTEMS_SYSINIT_ITEM( - _POSIX_Spinlock_Manager_initialization, - RTEMS_SYSINIT_POSIX_SPINLOCK, - RTEMS_SYSINIT_ORDER_MIDDLE -); diff --git a/cpukit/posix/src/pspindestroy.c b/cpukit/posix/src/pspindestroy.c index 42a6e76806..f5de88f04b 100644 --- a/cpukit/posix/src/pspindestroy.c +++ b/cpukit/posix/src/pspindestroy.c @@ -9,6 +9,8 @@ * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2016 embedded brains GmbH + * * 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. @@ -20,33 +22,13 @@ #include -#include - int pthread_spin_destroy( pthread_spinlock_t *spinlock ) { +#if defined(RTEMS_SMP) && defined(POSIX_SPINLOCKS_ARE_SELF_CONTAINED) POSIX_Spinlock_Control *the_spinlock; - ISR_lock_Context lock_context; - - _Objects_Allocator_lock(); - - the_spinlock = _POSIX_Spinlock_Get( spinlock, &lock_context ); - if ( the_spinlock == NULL ) { - _Objects_Allocator_unlock(); - return EINVAL; - } - _CORE_spinlock_Acquire_critical( &the_spinlock->Spinlock, &lock_context ); - - if ( _CORE_spinlock_Is_busy( &the_spinlock->Spinlock ) ) { - _CORE_spinlock_Release( &the_spinlock->Spinlock, &lock_context ); - _Objects_Allocator_unlock(); - return EBUSY; - } - - _CORE_spinlock_Release( &the_spinlock->Spinlock, &lock_context ); - - _Objects_Close( &_POSIX_Spinlock_Information, &the_spinlock->Object ); - _POSIX_Spinlock_Free( the_spinlock ); - _Objects_Allocator_unlock(); + the_spinlock = _POSIX_Spinlock_Get( spinlock ); + _SMP_ticket_lock_Destroy( &the_spinlock->Lock ); +#endif return 0; } diff --git a/cpukit/posix/src/pspininit.c b/cpukit/posix/src/pspininit.c index bc131e2e81..313633a11e 100644 --- a/cpukit/posix/src/pspininit.c +++ b/cpukit/posix/src/pspininit.c @@ -11,6 +11,8 @@ * COPYRIGHT (c) 1989-2006. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2016 embedded brains GmbH + * * 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. @@ -20,58 +22,18 @@ #include "config.h" #endif -#include -#include - -#include #include -/* - * pthread_spinlock_init - * - * This directive creates a spinlock. A spinlock id is returned. - * - * Input parameters: - * spinlock - pointer to spinlock id - * pshared - is this spinlock shared between processes - * - * Output parameters: - * spinlock - spinlock id - * 0 - if successful - * error code - if unsuccessful - */ - int pthread_spin_init( pthread_spinlock_t *spinlock, int pshared ) { - POSIX_Spinlock_Control *the_spinlock; +#if defined(RTEMS_SMP) && defined(POSIX_SPINLOCKS_ARE_SELF_CONTAINED) + POSIX_Spinlock_Control *the_spinlock; - if ( !spinlock ) - return EINVAL; - - switch ( pshared ) { - case PTHREAD_PROCESS_PRIVATE: /* only supported values */ - break; - case PTHREAD_PROCESS_SHARED: - default: - return EINVAL; - } - - the_spinlock = _POSIX_Spinlock_Allocate(); - - if ( !the_spinlock ) { - _Objects_Allocator_unlock(); - return EAGAIN; - } - - _CORE_spinlock_Initialize( &the_spinlock->Spinlock ); - - _Objects_Open_u32( &_POSIX_Spinlock_Information, &the_spinlock->Object, 0 ); - - *spinlock = the_spinlock->Object.id; - - _Objects_Allocator_unlock(); + the_spinlock = _POSIX_Spinlock_Get( spinlock ); + _SMP_ticket_lock_Initialize( &the_spinlock->Lock ); +#endif return 0; } diff --git a/cpukit/posix/src/pspinlock.c b/cpukit/posix/src/pspinlock.c index a2db911698..a9b04d8392 100644 --- a/cpukit/posix/src/pspinlock.c +++ b/cpukit/posix/src/pspinlock.c @@ -9,6 +9,8 @@ * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2016 embedded brains GmbH + * * 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. @@ -19,24 +21,92 @@ #endif #include -#include + +#if defined(POSIX_SPINLOCKS_ARE_SELF_CONTAINED) +RTEMS_STATIC_ASSERT( +#if defined(RTEMS_SMP) + offsetof( POSIX_Spinlock_Control, Lock.next_ticket ) +#else + offsetof( POSIX_Spinlock_Control, reserved[ 0 ] ) +#endif + == offsetof( pthread_spinlock_t, _Lock._next_ticket ), + POSIX_SPINLOCK_T_LOCK_NEXT_TICKET +); + +RTEMS_STATIC_ASSERT( +#if defined(RTEMS_SMP) + offsetof( POSIX_Spinlock_Control, Lock.now_serving ) +#else + offsetof( POSIX_Spinlock_Control, reserved[ 1 ] ) +#endif + == offsetof( pthread_spinlock_t, _Lock._now_serving ), + POSIX_SPINLOCK_T_LOCK_NOW_SERVING +); + +RTEMS_STATIC_ASSERT( + offsetof( POSIX_Spinlock_Control, interrupt_state ) + == offsetof( pthread_spinlock_t, _interrupt_state ), + POSIX_SPINLOCK_T_INTERRUPT_STATE +); + +RTEMS_STATIC_ASSERT( + sizeof( POSIX_Spinlock_Control ) == sizeof( pthread_spinlock_t ), + POSIX_SPINLOCK_T_SIZE +); +#else +#if defined(RTEMS_SMP) +POSIX_Spinlock_Control _POSIX_Spinlock_Global; + +uint32_t _POSIX_Spinlock_Owner = 0xffffffff; +#endif + +int _POSIX_Spinlock_Nest_level; +#endif int pthread_spin_lock( pthread_spinlock_t *spinlock ) { POSIX_Spinlock_Control *the_spinlock; - ISR_lock_Context lock_context; - Status_Control status; + ISR_Level level; +#if defined(RTEMS_SMP) && defined(RTEMS_PROFILING) + Per_CPU_Control *cpu_self; +#endif - the_spinlock = _POSIX_Spinlock_Get( spinlock, &lock_context ); - if ( the_spinlock == NULL ) { - return EINVAL; + the_spinlock = _POSIX_Spinlock_Get( spinlock ); + _ISR_Local_disable( level ); +#if defined(POSIX_SPINLOCKS_ARE_SELF_CONTAINED) +#if defined(RTEMS_SMP) +#if defined(RTEMS_PROFILING) + /* The lock statistics are incorrect in case of nested pthread spinlocks */ + cpu_self = _Per_CPU_Get(); +#endif + _SMP_ticket_lock_Acquire( + &the_spinlock->Lock, + &cpu_self->Lock_stats, + &cpu_self->Lock_stats_context + ); +#endif + the_spinlock->interrupt_state = level; +#else +#if defined(RTEMS_SMP) + if ( _POSIX_Spinlock_Owner != _SMP_Get_current_processor() ) { +#if defined(RTEMS_PROFILING) + cpu_self = _Per_CPU_Get(); +#endif + _SMP_ticket_lock_Acquire( + &the_spinlock->Lock, + &cpu_self->Lock_stats, + &cpu_self->Lock_stats_context + ); + _POSIX_Spinlock_Owner = _SMP_Get_current_processor(); +#endif } - status = _CORE_spinlock_Seize( - &the_spinlock->Spinlock, - true, - 0, - &lock_context - ); - return _POSIX_Get_error( status ); + if ( ++_POSIX_Spinlock_Nest_level == 1) { + the_spinlock->interrupt_state = level; + } +#endif + return 0; } + +int pthread_spin_trylock( pthread_spinlock_t *spinlock ) + RTEMS_ALIAS( pthread_spin_lock ); diff --git a/cpukit/posix/src/pspintrylock.c b/cpukit/posix/src/pspintrylock.c deleted file mode 100644 index a8264aba97..0000000000 --- a/cpukit/posix/src/pspintrylock.c +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @file - * - * @brief Wait at a Spinlock - * @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 -#include - -int pthread_spin_trylock( pthread_spinlock_t *spinlock ) -{ - POSIX_Spinlock_Control *the_spinlock; - ISR_lock_Context lock_context; - Status_Control status; - - the_spinlock = _POSIX_Spinlock_Get( spinlock, &lock_context ); - if ( the_spinlock == NULL ) { - return EINVAL; - } - - status = _CORE_spinlock_Seize( - &the_spinlock->Spinlock, - false, - 0, - &lock_context - ); - return _POSIX_Get_error( status ); -} diff --git a/cpukit/posix/src/pspinunlock.c b/cpukit/posix/src/pspinunlock.c index b92473d7c1..b508df7384 100644 --- a/cpukit/posix/src/pspinunlock.c +++ b/cpukit/posix/src/pspinunlock.c @@ -11,6 +11,8 @@ * COPYRIGHT (c) 1989-2007. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2016 embedded brains GmbH + * * 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. @@ -21,19 +23,33 @@ #endif #include -#include -int pthread_spin_unlock( pthread_spinlock_t *spinlock ) +int pthread_spin_unlock( pthread_spinlock_t *lock ) { POSIX_Spinlock_Control *the_spinlock; - ISR_lock_Context lock_context; - Status_Control status; + ISR_Level level; - the_spinlock = _POSIX_Spinlock_Get( spinlock, &lock_context ); - if ( the_spinlock == NULL ) { - return EINVAL; + the_spinlock = _POSIX_Spinlock_Get( lock ); + level = the_spinlock->interrupt_state; +#if defined(POSIX_SPINLOCKS_ARE_SELF_CONTAINED) +#if defined(RTEMS_SMP) + _SMP_ticket_lock_Release( + &the_spinlock->Lock, + &_Per_CPU_Get()->Lock_stats_context + ); +#endif + _ISR_Local_enable( level ); +#else + if ( --_POSIX_Spinlock_Nest_level == 0 ) { +#if defined(RTEMS_SMP) + _POSIX_Spinlock_Owner = 0xffffffff; + _SMP_ticket_lock_Release( + &the_spinlock->Lock, + &_Per_CPU_Get()->Lock_stats_context + ); +#endif + _ISR_Local_enable( level ); } - - status = _CORE_spinlock_Surrender( &the_spinlock->Spinlock, &lock_context ); - return _POSIX_Get_error( status ); +#endif + return 0; } diff --git a/cpukit/rtems/src/rtemsobjectgetapiclassname.c b/cpukit/rtems/src/rtemsobjectgetapiclassname.c index dd92e6ce6e..07bfb1b3a0 100644 --- a/cpukit/rtems/src/rtemsobjectgetapiclassname.c +++ b/cpukit/rtems/src/rtemsobjectgetapiclassname.c @@ -54,7 +54,6 @@ static const rtems_assoc_t rtems_object_api_posix_assoc[] = { { "Condition Variable", OBJECTS_POSIX_CONDITION_VARIABLES, 0}, { "Timer", OBJECTS_POSIX_TIMERS, 0}, { "Barrier", OBJECTS_POSIX_BARRIERS, 0}, - { "Spinlock", OBJECTS_POSIX_SPINLOCKS, 0}, { "RWLock", OBJECTS_POSIX_RWLOCKS, 0}, { NULL, 0, 0} }; diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h index be817bbf1d..3a718ba452 100644 --- a/cpukit/sapi/include/confdefs.h +++ b/cpukit/sapi/include/confdefs.h @@ -2068,10 +2068,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; #define CONFIGURE_MAXIMUM_POSIX_RWLOCKS \ rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE) #endif - #if !defined(CONFIGURE_MAXIMUM_POSIX_SPINLOCKS) - #define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS \ - rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE) - #endif #endif /* RTEMS_POSIX_API */ #endif /* CONFIGURE_UNLIMITED_OBJECTS */ @@ -2468,7 +2464,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; #include #include #include - #include #include #include @@ -2614,23 +2609,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; #define CONFIGURE_MEMORY_FOR_POSIX_BARRIERS(_barriers) \ _Configure_Object_RAM(_barriers, sizeof(POSIX_Barrier_Control) ) - /** - * This configuration parameter specifies the maximum number of - * POSIX API spinlocks. - */ - #ifndef CONFIGURE_MAXIMUM_POSIX_SPINLOCKS - #define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS 0 - #endif - - /** - * This macro is calculated to specify the memory required for - * POSIX API spinlocks. - * - * This is an internal parameter. - */ - #define CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS(_spinlocks) \ - _Configure_Object_RAM(_spinlocks, sizeof(POSIX_Spinlock_Control) ) - /** * This configuration parameter specifies the maximum number of * POSIX API rwlocks. @@ -2871,8 +2849,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( \ CONFIGURE_MAXIMUM_POSIX_SEMAPHORES) + \ CONFIGURE_MEMORY_FOR_POSIX_BARRIERS(CONFIGURE_MAXIMUM_POSIX_BARRIERS) + \ - CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS( \ - CONFIGURE_MAXIMUM_POSIX_SPINLOCKS) + \ CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS( \ CONFIGURE_MAXIMUM_POSIX_RWLOCKS) + \ CONFIGURE_MEMORY_FOR_POSIX_TIMERS(CONFIGURE_MAXIMUM_POSIX_TIMERS)) @@ -3339,7 +3315,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; CONFIGURE_MAXIMUM_POSIX_SEMAPHORES, CONFIGURE_MAXIMUM_POSIX_BARRIERS, CONFIGURE_MAXIMUM_POSIX_RWLOCKS, - CONFIGURE_MAXIMUM_POSIX_SPINLOCKS, CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE, CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME }; @@ -3554,7 +3529,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; uint32_t POSIX_MESSAGE_QUEUES; uint32_t POSIX_SEMAPHORES; uint32_t POSIX_BARRIERS; - uint32_t POSIX_SPINLOCKS; uint32_t POSIX_RWLOCKS; #endif @@ -3608,7 +3582,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES ), CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( CONFIGURE_MAXIMUM_POSIX_SEMAPHORES ), CONFIGURE_MEMORY_FOR_POSIX_BARRIERS( CONFIGURE_MAXIMUM_POSIX_BARRIERS ), - CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS( CONFIGURE_MAXIMUM_POSIX_SPINLOCKS ), CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS( CONFIGURE_MAXIMUM_POSIX_RWLOCKS ), CONFIGURE_MEMORY_FOR_POSIX_TIMERS( CONFIGURE_MAXIMUM_POSIX_TIMERS ), #endif @@ -3680,7 +3653,6 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES != 0) || \ (CONFIGURE_MAXIMUM_POSIX_SEMAPHORES != 0) || \ (CONFIGURE_MAXIMUM_POSIX_BARRIERS != 0) || \ - (CONFIGURE_MAXIMUM_POSIX_SPINLOCKS != 0) || \ (CONFIGURE_MAXIMUM_POSIX_RWLOCKS != 0) || \ defined(CONFIGURE_POSIX_INIT_THREAD_TABLE)) #error "CONFIGURATION ERROR: POSIX API support not configured!!" diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index 02b0bfb260..9b376c3f06 100644 --- a/cpukit/score/Makefile.am +++ b/cpukit/score/Makefile.am @@ -112,8 +112,6 @@ include_rtems_score_HEADERS += include/rtems/score/cpuopts.h include_rtems_score_HEADERS += include/rtems/score/basedefs.h if HAS_PTHREADS -include_rtems_score_HEADERS += include/rtems/score/corespinlock.h -include_rtems_score_HEADERS += include/rtems/score/corespinlockimpl.h include_rtems_score_HEADERS += include/rtems/score/corerwlock.h include_rtems_score_HEADERS += include/rtems/score/corerwlockimpl.h endif @@ -196,12 +194,6 @@ endif ## CORE_SEMAPHORE_C_FILES libscore_a_SOURCES += src/coresem.c -## CORE_SPINLOCK_C_FILES -if HAS_PTHREADS -libscore_a_SOURCES += src/corespinlockrelease.c \ - src/corespinlockwait.c -endif - ## HEAP_C_FILES libscore_a_SOURCES += src/heap.c src/heapallocate.c src/heapextend.c \ src/heapfree.c src/heapsizeofuserarea.c src/heapwalk.c src/heapgetinfo.c \ diff --git a/cpukit/score/include/rtems/score/corespinlock.h b/cpukit/score/include/rtems/score/corespinlock.h deleted file mode 100644 index 1666538bf6..0000000000 --- a/cpukit/score/include/rtems/score/corespinlock.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @file rtems/score/corespinlock.h - * - * @brief Constants and Structures Associated with the Spinlock Handler - * - * This include file contains all the constants and structures associated - * with the Spinlock Handler. - */ - -/* - * COPYRIGHT (c) 1989-2006. - * 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_SCORE_CORESPINLOCK_H -#define _RTEMS_SCORE_CORESPINLOCK_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup ScoreSpinlock Spinlock Handler - * - * @ingroup Score - * - * This handler encapsulates functionality which provides the foundation - * Spinlock services used in all of the APIs supported by RTEMS. - */ -/**@{*/ - -/** - * The following defines the control block used to manage each - * spinlock. - */ -typedef struct { - /** - * @brief Lock to protect the other fields. - * - * This implementation is a bit stupid. However, test cases in the Linux - * Test Project do things like sleep() and printf() while owning a - * pthread_spinlock_t, e.g. - * testcases/open_posix_testsuite/conformance/interfaces/pthread_spin_lock/1-2.c - */ - ISR_LOCK_MEMBER( Lock ) - - /** This field is the lock. - */ - uint32_t lock; - - /** This field is a count of the current number of threads using - * this spinlock. It includes the thread holding the lock as well - * as those waiting. - */ - uint32_t users; - - /** This field is the Id of the thread holding the lock. It may or may - * not be the thread which acquired it. - */ - Thread_Control *holder; -} CORE_spinlock_Control; - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/cpukit/score/include/rtems/score/corespinlockimpl.h b/cpukit/score/include/rtems/score/corespinlockimpl.h deleted file mode 100644 index 140529b573..0000000000 --- a/cpukit/score/include/rtems/score/corespinlockimpl.h +++ /dev/null @@ -1,130 +0,0 @@ -/** - * @file - * - * @brief Inlined Routines Associated with the SuperCore Spinlock - * - * This include file contains all of the inlined routines associated - * with the SuperCore spinlock. - */ - -/* - * 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. - */ - -#ifndef _RTEMS_SCORE_CORESPINLOCKIMPL_H -#define _RTEMS_SCORE_CORESPINLOCKIMPL_H - -#include -#include -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @addtogroup ScoreSpinlock - */ -/**@{**/ - -/** This indicates the lock is available. */ -#define CORE_SPINLOCK_UNLOCKED 0 - -/** This indicates the lock is unavailable. */ -#define CORE_SPINLOCK_LOCKED 1 - -/** - * @brief Initialize the spinlock. - * - * This routine initializes the spinlock based on the parameters passed. - * - * @param[in] the_spinlock is the spinlock control block to initialize - */ -RTEMS_INLINE_ROUTINE void _CORE_spinlock_Initialize( - CORE_spinlock_Control *the_spinlock -) -{ - memset( the_spinlock, 0, sizeof( *the_spinlock ) ); -} - -RTEMS_INLINE_ROUTINE void _CORE_spinlock_Acquire_critical( - CORE_spinlock_Control *the_spinlock, - ISR_lock_Context *lock_context -) -{ - _ISR_lock_Acquire( &the_spinlock->Lock, lock_context ); -} - -RTEMS_INLINE_ROUTINE void _CORE_spinlock_Release( - CORE_spinlock_Control *the_spinlock, - ISR_lock_Context *lock_context -) -{ - _ISR_lock_Release_and_ISR_enable( &the_spinlock->Lock, lock_context ); -} - -/** - * @brief Wait for spinlock. - * - * This routine wait for the spinlock to be released. If the spinlock - * is set to automatic and this is the appropriate thread, then it returns - * immediately. Otherwise, the calling thread is blocked until the spinlock - * is released. - * - * @param[in] the_spinlock is the spinlock to wait for - * @param[in] wait is true if willing to wait - * @param[in] timeout is the maximum number of ticks to spin (0 is forever) - * - * @retval A status is returned which indicates the success or failure of - * this operation. - */ -Status_Control _CORE_spinlock_Seize( - CORE_spinlock_Control *the_spinlock, - bool wait, - Watchdog_Interval timeout, - ISR_lock_Context *lock_context -); - -/** - * @brief Manually release the spinlock. - * - * This routine manually releases the spinlock. All of the threads waiting - * for the spinlock will be readied. - * - * @param[in] the_spinlock is the spinlock to surrender - */ -Status_Control _CORE_spinlock_Surrender( - CORE_spinlock_Control *the_spinlock, - ISR_lock_Context *lock_context -); - -/** - * This method is used to determine if the spinlock is available or not. - * - * @param[in] the_spinlock will be checked - * - * @return This method will return true if the spinlock is busy - * and false otherwise. - */ -RTEMS_INLINE_ROUTINE bool _CORE_spinlock_Is_busy( - CORE_spinlock_Control *the_spinlock -) -{ - return (the_spinlock->users != 0); -} - -/** @} */ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h index f5beb3b971..a00aa2276e 100644 --- a/cpukit/score/include/rtems/score/objectimpl.h +++ b/cpukit/score/include/rtems/score/objectimpl.h @@ -92,8 +92,7 @@ typedef enum { OBJECTS_POSIX_CONDITION_VARIABLES = 8, OBJECTS_POSIX_TIMERS = 9, OBJECTS_POSIX_BARRIERS = 10, - OBJECTS_POSIX_SPINLOCKS = 11, - OBJECTS_POSIX_RWLOCKS = 12 + OBJECTS_POSIX_RWLOCKS = 11 } Objects_POSIX_API; /** This macro is used to generically specify the last API index. */ diff --git a/cpukit/score/include/rtems/sysinit.h b/cpukit/score/include/rtems/sysinit.h index ad68c45c5c..a0ab17c8ec 100644 --- a/cpukit/score/include/rtems/sysinit.h +++ b/cpukit/score/include/rtems/sysinit.h @@ -54,7 +54,6 @@ extern "C" { #define RTEMS_SYSINIT_POSIX_TIMER 000366 #define RTEMS_SYSINIT_POSIX_BARRIER 000367 #define RTEMS_SYSINIT_POSIX_RWLOCK 000368 -#define RTEMS_SYSINIT_POSIX_SPINLOCK 000369 #define RTEMS_SYSINIT_POSIX_CLEANUP 00036a #define RTEMS_SYSINIT_POSIX_KEYS 00036b #define RTEMS_SYSINIT_IDLE_THREADS 000380 diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am index a6943244b5..4d468e5dde 100644 --- a/cpukit/score/preinstall.am +++ b/cpukit/score/preinstall.am @@ -409,14 +409,6 @@ $(PROJECT_INCLUDE)/rtems/score/basedefs.h: include/rtems/score/basedefs.h $(PROJ PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/basedefs.h if HAS_PTHREADS -$(PROJECT_INCLUDE)/rtems/score/corespinlock.h: include/rtems/score/corespinlock.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/corespinlock.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/corespinlock.h - -$(PROJECT_INCLUDE)/rtems/score/corespinlockimpl.h: include/rtems/score/corespinlockimpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/corespinlockimpl.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/corespinlockimpl.h - $(PROJECT_INCLUDE)/rtems/score/corerwlock.h: include/rtems/score/corerwlock.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/corerwlock.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/corerwlock.h diff --git a/cpukit/score/src/corespinlockrelease.c b/cpukit/score/src/corespinlockrelease.c deleted file mode 100644 index 4a4f9528b3..0000000000 --- a/cpukit/score/src/corespinlockrelease.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file - * - * @brief Release a Spinlock - * @ingroup ScoreSpinlock - */ - -/* - * COPYRIGHT (c) 1989-2006. - * 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 -#include - -Status_Control _CORE_spinlock_Surrender( - CORE_spinlock_Control *the_spinlock, - ISR_lock_Context *lock_context -) -{ - _CORE_spinlock_Acquire_critical( the_spinlock, lock_context ); - - /* - * It must locked by the current thread before it can be unlocked. - */ - if ( - the_spinlock->lock != CORE_SPINLOCK_LOCKED - || the_spinlock->holder != _Thread_Executing - ) { - _CORE_spinlock_Release( the_spinlock, lock_context ); - return STATUS_NOT_OWNER; - } - - /* - * Let it be unlocked. - */ - the_spinlock->users -= 1; - the_spinlock->lock = CORE_SPINLOCK_UNLOCKED; - the_spinlock->holder = 0; - - _CORE_spinlock_Release( the_spinlock, lock_context ); - return STATUS_SUCCESSFUL; -} diff --git a/cpukit/score/src/corespinlockwait.c b/cpukit/score/src/corespinlockwait.c deleted file mode 100644 index 4aacb60b74..0000000000 --- a/cpukit/score/src/corespinlockwait.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * @file - * - * @brief Wait for Spinlock - * @ingroup ScoreSpinlock - */ - -/* - * COPYRIGHT (c) 1989-2009. - * 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 -#include - -Status_Control _CORE_spinlock_Seize( - CORE_spinlock_Control *the_spinlock, - bool wait, - Watchdog_Interval timeout, - ISR_lock_Context *lock_context -) -{ - Thread_Control *executing; - - #if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API) - Watchdog_Interval limit = _Watchdog_Ticks_since_boot + timeout; - #endif - - executing = _Thread_Executing; - - _CORE_spinlock_Acquire_critical( the_spinlock, lock_context ); - if ( the_spinlock->lock == CORE_SPINLOCK_LOCKED && - the_spinlock->holder == executing ) { - _CORE_spinlock_Release( the_spinlock, lock_context ); - return STATUS_NESTING_NOT_ALLOWED; - } - the_spinlock->users += 1; - for ( ;; ) { - if ( the_spinlock->lock == CORE_SPINLOCK_UNLOCKED ) { - the_spinlock->lock = CORE_SPINLOCK_LOCKED; - the_spinlock->holder = executing; - _CORE_spinlock_Release( the_spinlock, lock_context ); - return STATUS_SUCCESSFUL; - } - - /* - * Spinlock is unavailable. If not willing to wait, return. - */ - if ( !wait ) { - the_spinlock->users -= 1; - _CORE_spinlock_Release( the_spinlock, lock_context ); - return STATUS_UNAVAILABLE; - } - - #if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API) - /* - * They are willing to wait but there could be a timeout. - */ - if ( timeout && (limit <= _Watchdog_Ticks_since_boot) ) { - the_spinlock->users -= 1; - _CORE_spinlock_Release( the_spinlock, lock_context ); - return STATUS_TIMEOUT; - } - #endif - - /* - * The thread is willing to spin so let's set things up so - * another thread has a chance of running. This spinlock has - * to be released by either another thread or an ISR. Since - * POSIX does not say anything about ISRs, that implies that - * another thread must be able to run while spinning. We are - * not blocking so that implies we are at least preemptible - * and possibly time-sliced. - * - * So first, we will enable interrpts to allow for them to happen. - * Then we will "flash" the thread dispatching critical section - * so other threads have a chance to run. - * - * A spinlock cannot be deleted while it is being used so we are - * safe from deletion. - */ - - _CORE_spinlock_Release( the_spinlock, lock_context ); - - /* - * An ISR could occur here. Another thread could get dispatched here. - * Reenter the critical sections so we can attempt the lock again. - */ - - _ISR_lock_ISR_disable( lock_context ); - _CORE_spinlock_Acquire_critical( the_spinlock, lock_context ); - } - -} diff --git a/testsuites/psxtests/Makefile.am b/testsuites/psxtests/Makefile.am index a3bffb900f..0ff5cb300e 100644 --- a/testsuites/psxtests/Makefile.am +++ b/testsuites/psxtests/Makefile.am @@ -11,7 +11,7 @@ _SUBDIRS += psxhdrs psx01 psx02 psx03 psx04 psx05 psx06 psx07 psx08 psx09 \ psxitimer psxmsgq01 psxmsgq02 psxmsgq03 psxmsgq04 \ psxmutexattr01 psxobj01 psxrwlock01 psxsem01 psxsignal01 psxsignal02 \ psxsignal03 psxsignal04 psxsignal05 psxsignal06 \ - psxspin01 psxspin02 psxsysconf \ + psxspin01 psxsysconf \ psxtime psxtimer01 psxtimer02 psxualarm psxusleep psxfatal01 psxfatal02 \ psxintrcritical01 psxstack01 psxstack02 \ psxeintr_join psxgetattrnp01 psxclock01 diff --git a/testsuites/psxtests/configure.ac b/testsuites/psxtests/configure.ac index be4a21f6c7..29f9a192fa 100644 --- a/testsuites/psxtests/configure.ac +++ b/testsuites/psxtests/configure.ac @@ -197,7 +197,6 @@ psxsignal04/Makefile psxsignal05/Makefile psxsignal06/Makefile psxspin01/Makefile -psxspin02/Makefile psxstack01/Makefile psxstack02/Makefile psxstat/Makefile diff --git a/testsuites/psxtests/psxconfig01/init.c b/testsuites/psxtests/psxconfig01/init.c index 582fd11197..1513b54d73 100644 --- a/testsuites/psxtests/psxconfig01/init.c +++ b/testsuites/psxtests/psxconfig01/init.c @@ -67,7 +67,6 @@ const char rtems_test_name[] = "PSXCONFIG 1"; #define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 7 #define CONFIGURE_MAXIMUM_POSIX_RWLOCKS 31 #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 41 -#define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS 17 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION #define CONFIGURE_MAXIMUM_POSIX_THREADS 3 @@ -515,18 +514,6 @@ static rtems_task Init(rtems_task_argument argument) ); #endif -#ifdef CONFIGURE_MAXIMUM_POSIX_SPINLOCKS - for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_SPINLOCKS; ++i) { - pthread_spinlock_t spinlock; - eno = pthread_spin_init(&spinlock, 0); - rtems_test_assert(eno == 0); - } - rtems_resource_snapshot_take(&snapshot); - rtems_test_assert( - snapshot.posix_api.active_spinlocks == CONFIGURE_MAXIMUM_POSIX_SPINLOCKS - ); -#endif - #ifdef CONFIGURE_MAXIMUM_POSIX_THREADS for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_THREADS; ++i) { pthread_t thread; diff --git a/testsuites/psxtests/psxspin01/main.c b/testsuites/psxtests/psxspin01/main.c index 6793784f75..4c3bc27fc5 100644 --- a/testsuites/psxtests/psxspin01/main.c +++ b/testsuites/psxtests/psxspin01/main.c @@ -41,8 +41,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS 2 -#define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS 1 - #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/psxtests/psxspin01/psxspin01.scn b/testsuites/psxtests/psxspin01/psxspin01.scn index 5c0e752969..dae970f1a0 100644 --- a/testsuites/psxtests/psxspin01/psxspin01.scn +++ b/testsuites/psxtests/psxspin01/psxspin01.scn @@ -1,32 +1,18 @@ *** BEGIN OF TEST PSXSPIN 1 *** -pthread_spin_init( NULL, PTHREAD_PROCESS_PRIVATE ) -- EINVAL -pthread_spin_init( NULL, PTHREAD_PROCESS_SHARED ) -- EINVAL -pthread_spin_init( &spinlock, 0x1234 ) -- EINVAL -pthread_spin_init( &spinlock, PTHREAD_PROCESS_SHARED ) -- EINVAL -pthread_spin_init( &Spinlock, PTHREAD_PROCESS_PRIVATE ) -- OK -pthread_spin_init( &spinlock, PTHREAD_PROCESS_PRIVATE ) -- EAGAIN -pthread_spin_init( &spinlock, PTHREAD_PROCESS_PRIVATE ) -- EAGAIN -pthread_spin_lock( NULL ) -- EINVAL -pthread_spin_trylock( NULL ) -- EINVAL -pthread_spin_unlock( NULL ) -- EINVAL -pthread_spin_destroy( NULL ) -- EINVAL -pthread_spin_lock( &spinlock ) -- EINVAL -pthread_spin_trylock( &spinlock ) -- EINVAL -pthread_spin_unlock( &spinlock ) -- EINVAL -pthread_spin_destroy( &spinlock ) -- EINVAL -pthread_spin_unlock( &Spinlock ) -- EPERM -pthread_spin_lock( &Spinlock ) -- OK -pthread_spin_lock( &Spinlock ) -- EDEADLK -pthread_spin_trylock( &Spinlock ) -- EDEADLK -pthread_spin_unlock( &Spinlock ) -- OK -pthread_spin_trylock( &Spinlock ) -- OK -pthread_spin_unlock( &Spinlock ) -- OK -pthread_spin_lock( &Spinlock ) from Thread -- OK -sleep to allow main thread to run -pthread_spin_unlock( &Spinlock ) -- EPERM -pthread_spin_lock( &Spinlock ) -- OK -pthread_spin_unlock( &Spinlock ) from Thread -- OK -pthread_spin_destroy( &Spinlock ) -- EBUSY -pthread_spin_unlock( &Spinlock ) -- OK -pthread_spin_destroy( &Spinlock ) -- OK +pthread_spin_init( &spinlock, PTHREAD_PROCESS_PRIVATE ) -- OK +pthread_spin_destroy( &spinlock ) -- OK +pthread_spin_init( &spinlock, PTHREAD_PROCESS_SHARED ) -- OK +pthread_spin_destroy( &spinlock ) -- OK +pthread_spin_init( &spinlock, 0x1234 ) -- OK +pthread_spin_init( &spinlock2, 0 ) -- OK +pthread_spin_lock( &spinlock ) -- OK +pthread_spin_lock( &spinlock2 ) -- OK +pthread_spin_unlock( &spinlock2 ) -- OK +pthread_spin_unlock( &spinlock ) -- OK +pthread_spin_trylock( &spinlock ) -- OK +pthread_spin_trylock( &spinlock2 ) -- OK +pthread_spin_unlock( &spinlock2 ) -- OK +pthread_spin_unlock( &spinlock ) -- OK +pthread_spin_destroy( &spinlock2 ) -- OK +pthread_spin_destroy( &spinlock ) -- OK *** END OF TEST PSXSPIN 1 *** diff --git a/testsuites/psxtests/psxspin01/test.c b/testsuites/psxtests/psxspin01/test.c index 270cdcfc86..33153addda 100644 --- a/testsuites/psxtests/psxspin01/test.c +++ b/testsuites/psxtests/psxspin01/test.c @@ -17,6 +17,7 @@ #include "config.h" #endif +#define TESTS_USE_PRINTK #include "tmacros.h" #include #include @@ -30,38 +31,6 @@ const char rtems_test_name[] = "PSXSPIN 1"; /* forward declarations to avoid warnings */ int test_main(void); -rtems_task SpinlockThread(rtems_task_argument arg); - -pthread_spinlock_t Spinlock; - -volatile int mainThreadSpinning; - -rtems_task SpinlockThread(rtems_task_argument arg) -{ - int status; - - if ( mainThreadSpinning ) { - puts( "main thread is not supposed to be spinning yet" ); - exit(0); - } - puts( "pthread_spin_lock( &Spinlock ) from Thread -- OK" ); - status = pthread_spin_lock( &Spinlock ); - rtems_test_assert( status == 0 ); - - puts( "sleep to allow main thread to run" ); - sleep( 1 ); - - if ( !mainThreadSpinning ) { - puts( "main thread is not spinning on lock" ); - exit(0); - } - - puts( "pthread_spin_unlock( &Spinlock ) from Thread -- OK" ); - status = pthread_spin_unlock( &Spinlock ); - rtems_test_assert( status == 0 ); - - rtems_task_delete( RTEMS_SELF ); -} /* * main entry point to the test @@ -77,158 +46,93 @@ int main( #endif { pthread_spinlock_t spinlock; + pthread_spinlock_t spinlock2; int status; - rtems_status_code rstatus; - rtems_id taskid; TEST_BEGIN(); - puts( "pthread_spin_init( NULL, PTHREAD_PROCESS_PRIVATE ) -- EINVAL" ); - status = pthread_spin_init( NULL, PTHREAD_PROCESS_PRIVATE ); - rtems_test_assert( status == EINVAL ); - - puts( "pthread_spin_init( NULL, PTHREAD_PROCESS_SHARED ) -- EINVAL" ); - status = pthread_spin_init( NULL, PTHREAD_PROCESS_PRIVATE ); - rtems_test_assert( status == EINVAL ); - - puts( "pthread_spin_init( &spinlock, 0x1234 ) -- EINVAL" ); - status = pthread_spin_init( &spinlock, 0x1234 ); - rtems_test_assert( status == EINVAL ); - - puts( "pthread_spin_init( &spinlock, PTHREAD_PROCESS_SHARED ) -- EINVAL" ); - status = pthread_spin_init( &spinlock, PTHREAD_PROCESS_SHARED ); - rtems_test_assert( status == EINVAL ); - - /* This successfully creates one */ - puts( "pthread_spin_init( &Spinlock, PTHREAD_PROCESS_PRIVATE ) -- OK" ); - status = pthread_spin_init( &Spinlock, PTHREAD_PROCESS_PRIVATE ); + puts( "pthread_spin_init( &spinlock, PTHREAD_PROCESS_PRIVATE ) -- OK" ); + status = pthread_spin_init( &spinlock, PTHREAD_PROCESS_PRIVATE ); rtems_test_assert( status == 0 ); - puts( "pthread_spin_init( &spinlock, PTHREAD_PROCESS_PRIVATE ) -- EAGAIN" ); - status = pthread_spin_init( &spinlock, PTHREAD_PROCESS_PRIVATE ); - rtems_test_assert( status == EAGAIN ); + puts( "pthread_spin_destroy( &spinlock ) -- OK" ); + status = pthread_spin_destroy( &spinlock ); + rtems_test_assert( status == 0 ); - puts( "pthread_spin_init( &spinlock, PTHREAD_PROCESS_PRIVATE ) -- EAGAIN" ); + puts( "pthread_spin_init( &spinlock, PTHREAD_PROCESS_SHARED ) -- OK" ); status = pthread_spin_init( &spinlock, PTHREAD_PROCESS_PRIVATE ); - rtems_test_assert( status == EAGAIN ); - - puts( "pthread_spin_lock( NULL ) -- EINVAL" ); - status = pthread_spin_lock( NULL ); - rtems_test_assert( status == EINVAL ); + rtems_test_assert( status == 0 ); - puts( "pthread_spin_trylock( NULL ) -- EINVAL" ); - status = pthread_spin_trylock( NULL ); - rtems_test_assert( status == EINVAL ); + puts( "pthread_spin_destroy( &spinlock ) -- OK" ); + status = pthread_spin_destroy( &spinlock ); + rtems_test_assert( status == 0 ); - puts( "pthread_spin_unlock( NULL ) -- EINVAL" ); - status = pthread_spin_unlock( NULL ); - rtems_test_assert( status == EINVAL ); + puts( "pthread_spin_init( &spinlock, 0x1234 ) -- OK" ); + status = pthread_spin_init( &spinlock, 0x1234 ); + rtems_test_assert( status == 0 ); - puts( "pthread_spin_destroy( NULL ) -- EINVAL" ); - status = pthread_spin_destroy( NULL ); - rtems_test_assert( status == EINVAL ); + puts( "pthread_spin_init( &spinlock2, 0 ) -- OK" ); + status = pthread_spin_init( &spinlock2, 0 ); + rtems_test_assert( status == 0 ); - spinlock = 0; + rtems_test_assert( _ISR_Get_level() == 0 ); - puts( "pthread_spin_lock( &spinlock ) -- EINVAL" ); + puts( "pthread_spin_lock( &spinlock ) -- OK" ); status = pthread_spin_lock( &spinlock ); - rtems_test_assert( status == EINVAL ); + rtems_test_assert( status == 0 ); - puts( "pthread_spin_trylock( &spinlock ) -- EINVAL" ); - status = pthread_spin_trylock( &spinlock ); - rtems_test_assert( status == EINVAL ); + rtems_test_assert( _ISR_Get_level() != 0 ); - puts( "pthread_spin_unlock( &spinlock ) -- EINVAL" ); - status = pthread_spin_unlock( &spinlock ); - rtems_test_assert( status == EINVAL ); - - puts( "pthread_spin_destroy( &spinlock ) -- EINVAL" ); - status = pthread_spin_destroy( &spinlock ); - rtems_test_assert( status == EINVAL ); + puts( "pthread_spin_lock( &spinlock2 ) -- OK" ); + status = pthread_spin_lock( &spinlock2 ); + rtems_test_assert( status == 0 ); - puts( "pthread_spin_unlock( &Spinlock ) -- EPERM" ); - status = pthread_spin_unlock( &Spinlock ); - rtems_test_assert( status == EPERM ); + rtems_test_assert( _ISR_Get_level() != 0 ); - /* Now some basic locking and unlocking with a deadlock verification */ - puts( "pthread_spin_lock( &Spinlock ) -- OK" ); - status = pthread_spin_lock( &Spinlock ); + puts( "pthread_spin_unlock( &spinlock2 ) -- OK" ); + status = pthread_spin_unlock( &spinlock2 ); rtems_test_assert( status == 0 ); - puts( "pthread_spin_lock( &Spinlock ) -- EDEADLK" ); - status = pthread_spin_lock( &Spinlock ); - rtems_test_assert( status == EDEADLK ); - - puts( "pthread_spin_trylock( &Spinlock ) -- EDEADLK" ); - status = pthread_spin_trylock( &Spinlock ); - rtems_test_assert( status == EDEADLK ); + rtems_test_assert( _ISR_Get_level() != 0 ); - puts( "pthread_spin_unlock( &Spinlock ) -- OK" ); - status = pthread_spin_unlock( &Spinlock ); + puts( "pthread_spin_unlock( &spinlock ) -- OK" ); + status = pthread_spin_unlock( &spinlock ); rtems_test_assert( status == 0 ); - /* Try lock/unlock pair */ - puts( "pthread_spin_trylock( &Spinlock ) -- OK" ); - status = pthread_spin_trylock( &Spinlock ); - rtems_test_assert( status == 0 ); + rtems_test_assert( _ISR_Get_level() == 0 ); - puts( "pthread_spin_unlock( &Spinlock ) -- OK" ); - status = pthread_spin_unlock( &Spinlock ); + puts( "pthread_spin_trylock( &spinlock ) -- OK" ); + status = pthread_spin_trylock( &spinlock ); rtems_test_assert( status == 0 ); - /* Let another thread lock a spinlock and we contend with it */ - - mainThreadSpinning = 0; + rtems_test_assert( _ISR_Get_level() != 0 ); - /* Create a helper task */ - rstatus = rtems_task_create( - rtems_build_name( 'S', 'P', 'I', 'N' ), - 1, - RTEMS_MINIMUM_STACK_SIZE, - RTEMS_DEFAULT_MODES, - RTEMS_DEFAULT_ATTRIBUTES, - &taskid - ); - rtems_test_assert( rstatus == RTEMS_SUCCESSFUL ); + puts( "pthread_spin_trylock( &spinlock2 ) -- OK" ); + status = pthread_spin_trylock( &spinlock2 ); + rtems_test_assert( status == 0 ); - rstatus = rtems_task_start( taskid, SpinlockThread, 0 ); - rtems_test_assert( rstatus == RTEMS_SUCCESSFUL ); - /* We should be preempted immediately. The thread is expected to: - * + verify we haven't set the main thread spinning flag - * + lock the spinlock - * + delay - */ + rtems_test_assert( _ISR_Get_level() != 0 ); - mainThreadSpinning = 1; + puts( "pthread_spin_unlock( &spinlock2 ) -- OK" ); + status = pthread_spin_unlock( &spinlock2 ); + rtems_test_assert( status == 0 ); - puts( "pthread_spin_unlock( &Spinlock ) -- EPERM" ); - status = pthread_spin_unlock( &Spinlock ); - rtems_test_assert( status == EPERM ); + rtems_test_assert( _ISR_Get_level() != 0 ); - puts( "pthread_spin_lock( &Spinlock ) -- OK" ); - status = pthread_spin_lock( &Spinlock ); + puts( "pthread_spin_unlock( &spinlock ) -- OK" ); + status = pthread_spin_unlock( &spinlock ); rtems_test_assert( status == 0 ); - /* The thread wakes up, unlocks spin lock, and deletes itself. - * So when we get back here, about a second has passed and we now - * have the spinlock locked. - */ + rtems_test_assert( _ISR_Get_level() == 0 ); - /* spin lock should be locked when we return so destroying it gives busy */ - puts( "pthread_spin_destroy( &Spinlock ) -- EBUSY" ); - status = pthread_spin_destroy( &Spinlock ); - rtems_test_assert( status == EBUSY ); - - /* Unlock it for a normal destroy */ - puts( "pthread_spin_unlock( &Spinlock ) -- OK" ); - status = pthread_spin_unlock( &Spinlock ); + puts( "pthread_spin_destroy( &spinlock2 ) -- OK" ); + status = pthread_spin_destroy( &spinlock2 ); rtems_test_assert( status == 0 ); - puts( "pthread_spin_destroy( &Spinlock ) -- OK" ); - status = pthread_spin_destroy( &Spinlock ); + puts( "pthread_spin_destroy( &spinlock ) -- OK" ); + status = pthread_spin_destroy( &spinlock ); rtems_test_assert( status == 0 ); - /*************** END OF TEST *****************/ TEST_END(); exit(0); } diff --git a/testsuites/psxtests/psxspin02/Makefile.am b/testsuites/psxtests/psxspin02/Makefile.am deleted file mode 100644 index ad56e2ae28..0000000000 --- a/testsuites/psxtests/psxspin02/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ - -rtems_tests_PROGRAMS = psxspin02 -psxspin02_SOURCES = main.c test.c ../include/pmacros.h - -dist_rtems_tests_DATA = psxspin02.scn -dist_rtems_tests_DATA += psxspin02.doc - -include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg -include $(top_srcdir)/../automake/compile.am -include $(top_srcdir)/../automake/leaf.am - - -AM_CPPFLAGS += -I$(top_srcdir)/include -AM_CPPFLAGS += -I$(top_srcdir)/../support/include - -LINK_OBJS = $(psxspin02_OBJECTS) -LINK_LIBS = $(psxspin02_LDLIBS) - -psxspin02$(EXEEXT): $(psxspin02_OBJECTS) \ - $(psxspin02_DEPENDENCIES) - @rm -f psxspin02$(EXEEXT) - $(make-exe) - -include $(top_srcdir)/../automake/local.am diff --git a/testsuites/psxtests/psxspin02/main.c b/testsuites/psxtests/psxspin02/main.c deleted file mode 100644 index 15eb51ea6c..0000000000 --- a/testsuites/psxtests/psxspin02/main.c +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @file - * - * Simple test program wrapper for Spinlocks - */ - -/* - * COPYRIGHT (c) 1989-2012. - * 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. - */ - -#define CONFIGURE_INIT - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include - -/* forward declarations to avoid warnings */ -rtems_task Init(rtems_task_argument ignored); -void test_main(void); - -rtems_task Init( - rtems_task_argument ignored -) -{ - test_main(); - rtems_test_exit( 0 ); -} - -/* configuration information */ - -#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER -#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER - -#define CONFIGURE_MAXIMUM_TASKS 2 - -#define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS 1 - -#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION - -#define CONFIGURE_RTEMS_INIT_TASKS_TABLE -#define CONFIGURE_INIT_TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE * 2) -#define CONFIGURE_INIT_TASK_PRIORITY 2 -#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_PREEMPT - -#define CONFIGURE_EXTRA_TASK_STACKS RTEMS_MINIMUM_STACK_SIZE - -#define CONFIGURE_INIT - -#include - -/* end of file */ diff --git a/testsuites/psxtests/psxspin02/psxspin02.doc b/testsuites/psxtests/psxspin02/psxspin02.doc deleted file mode 100644 index 43a871d4a9..0000000000 --- a/testsuites/psxtests/psxspin02/psxspin02.doc +++ /dev/null @@ -1,25 +0,0 @@ -# COPYRIGHT (c) 1989-2009. -# 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. -# - -This file describes the directives and concepts tested by this test set. - -test set name: psxspin02 - -directives: - - pthread_spin_lock - pthread_spin_trylock - pthread_spin_unlock - -concepts: - -+ Ensure that attempting to obtain a locked spin lock with - pthread_spin_trylock returns the correct error. - -+ Ensure that attempting to release a locked spin lock from a thread which - did not lock it returns the correct error. diff --git a/testsuites/psxtests/psxspin02/psxspin02.scn b/testsuites/psxtests/psxspin02/psxspin02.scn deleted file mode 100644 index 8e71ca6e1b..0000000000 --- a/testsuites/psxtests/psxspin02/psxspin02.scn +++ /dev/null @@ -1,8 +0,0 @@ -*** POSIX SPINLOCK TEST 02 *** -pthread_spin_init( &Spinlock, PTHREAD_PROCESS_PRIVATE ) -- OK -pthread_spin_lock( &Spinlock ) -- OK -pthread_spin_trylock( &Spinlock ) -- EBUSY -pthread_spin_unlock( &Spinlock ) -- EPERM -pthread_spin_unlock( &Spinlock ) -- OK -pthread_spin_destroy( &Spinlock ) -- OK -*** END OF POSIX SPINLOCK TEST 02 *** diff --git a/testsuites/psxtests/psxspin02/test.c b/testsuites/psxtests/psxspin02/test.c deleted file mode 100644 index 36bcbb91ba..0000000000 --- a/testsuites/psxtests/psxspin02/test.c +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @file - * - * This test exercises the POSIX Spinlock manager. - */ - -/* - * COPYRIGHT (c) 1989-2012. - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "tmacros.h" -#include -#include -#include - -#include - -#include /* for task creation */ - -const char rtems_test_name[] = "PSXSPIN 2"; - -/* forward declarations to avoid warnings */ -int test_main(void); -rtems_task SpinlockThread(rtems_task_argument arg); - -pthread_spinlock_t Spinlock; - -rtems_task SpinlockThread(rtems_task_argument arg) -{ - int status; - - puts( "pthread_spin_trylock( &Spinlock ) -- EBUSY" ); - status = pthread_spin_trylock( &Spinlock ); - rtems_test_assert( status == EBUSY ); - - puts( "pthread_spin_unlock( &Spinlock ) -- EPERM" ); - status = pthread_spin_unlock( &Spinlock ); - rtems_test_assert( status == EPERM ); - - rtems_task_delete( RTEMS_SELF ); -} - -/* - * main entry point to the test - */ - -#if defined(__rtems__) -int test_main(void) -#else -int main( - int argc, - char **argv -) -#endif -{ - int status; - rtems_status_code rstatus; - rtems_id taskid; - - TEST_BEGIN(); - - /* This successfully creates one */ - puts( "pthread_spin_init( &Spinlock, PTHREAD_PROCESS_PRIVATE ) -- OK" ); - status = pthread_spin_init( &Spinlock, PTHREAD_PROCESS_PRIVATE ); - rtems_test_assert( status == 0 ); - - /* Lock it */ - puts( "pthread_spin_lock( &Spinlock ) -- OK" ); - status = pthread_spin_lock( &Spinlock ); - rtems_test_assert( status == 0 ); - - /* Create a helper task */ - rstatus = rtems_task_create( - rtems_build_name( 'S', 'P', 'I', 'N' ), - 1, - RTEMS_MINIMUM_STACK_SIZE, - RTEMS_DEFAULT_MODES, - RTEMS_DEFAULT_ATTRIBUTES, - &taskid - ); - rtems_test_assert( rstatus == RTEMS_SUCCESSFUL ); - - rstatus = rtems_task_start( taskid, SpinlockThread, 0 ); - rtems_test_assert( rstatus == RTEMS_SUCCESSFUL ); - - sleep(1); - - puts( "pthread_spin_unlock( &Spinlock ) -- OK" ); - status = pthread_spin_unlock( &Spinlock ); - rtems_test_assert( status == 0 ); - - puts( "pthread_spin_destroy( &Spinlock ) -- OK" ); - status = pthread_spin_destroy( &Spinlock ); - rtems_test_assert( status == 0 ); - - /*************** END OF TEST *****************/ - TEST_END(); - exit(0); -} diff --git a/testsuites/sptests/spsysinit01/init.c b/testsuites/sptests/spsysinit01/init.c index 1ce22d5c08..b81fbabbac 100644 --- a/testsuites/sptests/spsysinit01/init.c +++ b/testsuites/sptests/spsysinit01/init.c @@ -43,7 +43,6 @@ #include #include #include -#include #include #endif /* RTEMS_POSIX_API */ #include @@ -118,8 +117,6 @@ typedef enum { POSIX_BARRIER_POST, POSIX_RWLOCK_PRE, POSIX_RWLOCK_POST, - POSIX_SPINLOCK_PRE, - POSIX_SPINLOCK_POST, POSIX_CLEANUP_PRE, POSIX_CLEANUP_POST, #endif /* RTEMS_POSIX_API */ @@ -527,18 +524,6 @@ LAST(RTEMS_SYSINIT_POSIX_RWLOCK) next_step(POSIX_RWLOCK_POST); } -FIRST(RTEMS_SYSINIT_POSIX_SPINLOCK) -{ - assert(_POSIX_Spinlock_Information.maximum == 0); - next_step(POSIX_SPINLOCK_PRE); -} - -LAST(RTEMS_SYSINIT_POSIX_SPINLOCK) -{ - assert(_POSIX_Spinlock_Information.maximum != 0); - next_step(POSIX_SPINLOCK_POST); -} - static size_t user_extensions_pre_posix_cleanup; FIRST(RTEMS_SYSINIT_POSIX_CLEANUP) @@ -767,8 +752,6 @@ static void *POSIX_Init(void *arg) #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 1 -#define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS 1 - #define CONFIGURE_MAXIMUM_POSIX_TIMERS 1 #define CONFIGURE_MAXIMUM_POSIX_THREADS 1 -- cgit v1.2.3