URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [rtems/] [c/] [src/] [exec/] [score/] [src/] [coresemseize.c] - Rev 1765
Compare with Previous | Blame | View Log
/* * 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-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: coresemseize.c,v 1.2 2001-09-27 11:59:34 chris Exp $ */ #include <rtems/system.h> #include <rtems/score/isr.h> #include <rtems/score/coresem.h> #include <rtems/score/states.h> #include <rtems/score/thread.h> #include <rtems/score/threadq.h> #if defined(RTEMS_MULTIPROCESSING) #include <rtems/score/mpci.h> #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 ); }