2006-11-15 Joel Sherrill <joel.sherrill@oarcorp.com>

* score/inline/rtems/score/threadq.inl, score/src/corerwlocktimeout.c:
	New files.
This commit is contained in:
Joel Sherrill
2006-11-15 14:15:24 +00:00
parent f029dd9b04
commit 5fdca8afca
3 changed files with 129 additions and 0 deletions

View File

@@ -1,3 +1,8 @@
2006-11-15 Joel Sherrill <joel.sherrill@oarcorp.com>
* score/inline/rtems/score/threadq.inl, score/src/corerwlocktimeout.c:
New files.
2006-11-15 Joel Sherrill <joel.sherrill@oarcorp.com>
* libcsupport/src/termios.c, posix/Makefile.am, posix/preinstall.am,

View File

@@ -0,0 +1,71 @@
/**
* @file rtems/score/threadq.inl
*
* This inline file contains all of the inlined routines associated with
* the manipulation of thread queues.
*/
/*
* 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.com/license/LICENSE.
*
* $Id$
*/
#ifndef _RTEMS_SCORE_THREADQ_INL
#define _RTEMS_SCORE_THREADQ_INL
#include <rtems/score/thread.h>
/**
* @addtogroup ScoreThreadQ
* @{
*/
/**
*
* @brief Process Thread Queue Timeout
*
* This is a shared helper routine which makes it easier to have multiple
* object class specific timeout routines.
*
* @param[in] the_thread is the thread to extract
*
* @note Assume Dispatching is disabled.
*/
static inline void _Thread_queue_Process_timeout(
Thread_Control *the_thread
)
{
Thread_queue_Control *the_thread_queue = the_thread->Wait.queue;
/*
* If the_thread_queue is not synchronized, then it is either
* "nothing happened", "timeout", or "satisfied". If the_thread
* is the executing thread, then it is in the process of blocking
* and it is the thread which is responsible for the synchronization
* process.
*
* If it is not satisfied, then it is "nothing happened" and
* this is the "timeout" transition. After a request is satisfied,
* a timeout is not allowed to occur.
*/
if ( the_thread_queue->sync_state != THREAD_QUEUE_SYNCHRONIZED &&
_Thread_Is_executing( the_thread ) ) {
if ( the_thread_queue->sync_state != THREAD_QUEUE_SATISFIED )
the_thread_queue->sync_state = THREAD_QUEUE_TIMEOUT;
} else {
the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
_Thread_queue_Extract( the_thread->Wait.queue, the_thread );
}
}
/**@}*/
#endif
/* end of include file */

View File

@@ -0,0 +1,53 @@
/*
* Thread Queue Handler
*
*
* 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.rtems.com/license/LICENSE.
*
* $Id$
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/system.h>
#include <rtems/score/corerwlock.h>
#include <rtems/score/corerwlock.h>
/*
* _CORE_RWLock_Timeout
*
* This routine processes a thread which timeouts while waiting on
* a thread queue. It is called by the watchdog handler.
*
* Input parameters:
* id - thread id
*
* Output parameters: NONE
*/
void _CORE_RWLock_Timeout(
Objects_Id id,
void *ignored
)
{
Thread_Control *the_thread;
Objects_Locations location;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_ERROR:
case OBJECTS_REMOTE: /* impossible */
break;
case OBJECTS_LOCAL:
_Thread_queue_Process_timeout( the_thread );
_Thread_Unnest_dispatch();
break;
}
}