URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [exec/] [score/] [include/] [rtems/] [score/] [coremutex.h] - Rev 593
Go to most recent revision | Compare with Previous | Blame | View Log
/* mutex.h * * This include file contains all the constants and structures associated * with the Mutex Handler. A mutex is an enhanced version of the standard * Dijkstra binary semaphore used to provide synchronization and mutual * exclusion capabilities. * * COPYRIGHT (c) 1989-1999. * 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.OARcorp.com/rtems/license.html. * * $Id: coremutex.h,v 1.2 2001-09-27 11:59:32 chris Exp $ */ #ifndef __RTEMS_CORE_MUTEX_h #define __RTEMS_CORE_MUTEX_h #ifdef __cplusplus extern "C" { #endif #include <rtems/score/thread.h> #include <rtems/score/threadq.h> #include <rtems/score/priority.h> #include <rtems/score/watchdog.h> /* * The following type defines the callout which the API provides * to support global/multiprocessor operations on mutexes. */ typedef void ( *CORE_mutex_API_mp_support_callout )( Thread_Control *, Objects_Id ); /* * Blocking disciplines for a mutex. */ typedef enum { CORE_MUTEX_DISCIPLINES_FIFO, CORE_MUTEX_DISCIPLINES_PRIORITY, CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT, CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING } CORE_mutex_Disciplines; /* * Mutex handler return statuses. */ typedef enum { CORE_MUTEX_STATUS_SUCCESSFUL, CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT, CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED, CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE, CORE_MUTEX_WAS_DELETED, CORE_MUTEX_TIMEOUT, CORE_MUTEX_STATUS_CEILING_VIOLATED } CORE_mutex_Status; /* * Mutex lock nesting behavior * * CORE_MUTEX_NESTING_ACQUIRES: * This sequence has no blocking or errors: * lock(m) * lock(m) * unlock(m) * unlock(m) * * CORE_MUTEX_NESTING_IS_ERROR * This sequence returns an error at the indicated point: * lock(m) * lock(m) - already locked error * unlock(m) * * CORE_MUTEX_NESTING_BLOCKS * This sequence performs as indicated: * lock(m) * lock(m) - deadlocks or timeouts * unlock(m) - releases */ typedef enum { CORE_MUTEX_NESTING_ACQUIRES, CORE_MUTEX_NESTING_IS_ERROR, CORE_MUTEX_NESTING_BLOCKS } CORE_mutex_Nesting_behaviors; /* * Locked and unlocked values */ #define CORE_MUTEX_UNLOCKED 1 #define CORE_MUTEX_LOCKED 0 /* * The following defines the control block used to manage the * attributes of each mutex. */ typedef struct { CORE_mutex_Nesting_behaviors lock_nesting_behavior; boolean only_owner_release; CORE_mutex_Disciplines discipline; Priority_Control priority_ceiling; } CORE_mutex_Attributes; /* * The following defines the control block used to manage each mutex. */ typedef struct { Thread_queue_Control Wait_queue; CORE_mutex_Attributes Attributes; unsigned32 lock; unsigned32 nest_count; Thread_Control *holder; Objects_Id holder_id; } CORE_mutex_Control; /* * _CORE_mutex_Initialize * * DESCRIPTION: * * This routine initializes the mutex based on the parameters passed. */ void _CORE_mutex_Initialize( CORE_mutex_Control *the_mutex, Objects_Classes the_class, CORE_mutex_Attributes *the_mutex_attributes, unsigned32 initial_lock, Thread_queue_Extract_callout proxy_extract_callout ); /* * _CORE_mutex_Seize * * DESCRIPTION: * * This routine attempts to receive a unit from the_mutex. * If a unit is available or if the wait flag is FALSE, then the routine * returns. Otherwise, the calling task is blocked until a unit becomes * available. */ void _CORE_mutex_Seize( CORE_mutex_Control *the_mutex, Objects_Id id, boolean wait, Watchdog_Interval timeout ); /* * _CORE_mutex_Surrender * * DESCRIPTION: * * This routine frees a unit to the mutex. If a task was blocked waiting for * a unit from this mutex, then that task will be readied and the unit * given to that task. Otherwise, the unit will be returned to the mutex. */ CORE_mutex_Status _CORE_mutex_Surrender( CORE_mutex_Control *the_mutex, Objects_Id id, CORE_mutex_API_mp_support_callout api_mutex_mp_support ); /* * _CORE_mutex_Flush * * DESCRIPTION: * * This routine assists in the deletion of a mutex by flushing the associated * wait queue. */ void _CORE_mutex_Flush( CORE_mutex_Control *the_mutex, Thread_queue_Flush_callout remote_extract_callout, unsigned32 status ); #ifndef __RTEMS_APPLICATION__ #include <rtems/score/coremutex.inl> #endif #ifdef __cplusplus } #endif #endif /* end of include file */
Go to most recent revision | Compare with Previous | Blame | View Log