/* * CORE Semaphore Handler * * DESCRIPTION: * * This package is the implementation of the CORE Semaphore Handler. * This core object utilizes standard Dijkstra counting semaphores to provide * synchronization and mutual exclusion capabilities. * * COPYRIGHT (c) 1989-1998. * On-Line Applications Research Corporation (OAR). * Copyright assigned to U.S. Government, 1994. * * 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$ */ #include #include #include #include #include #include #if defined(RTEMS_MULTIPROCESSING) #include #endif /*PAGE * * _CORE_semaphore_Seize * * This routine attempts to allocate a core semaphore to the calling thread. * * Input parameters: * the_semaphore - pointer to semaphore control block * id - id of object to wait on * wait - TRUE if wait is allowed, FALSE otherwise * timeout - number of ticks to wait (0 means forever) * * Output parameters: NONE * * INTERRUPT LATENCY: * available * wait */ void _CORE_semaphore_Seize( CORE_semaphore_Control *the_semaphore, Objects_Id id, boolean wait, Watchdog_Interval timeout ) { Thread_Control *executing; ISR_Level level; executing = _Thread_Executing; executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL; _ISR_Disable( level ); if ( the_semaphore->count != 0 ) { the_semaphore->count -= 1; _ISR_Enable( level ); return; } if ( !wait ) { _ISR_Enable( level ); executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT; return; } _Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue ); executing->Wait.queue = &the_semaphore->Wait_queue; executing->Wait.id = id; _ISR_Enable( level ); _Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout ); }