Add rtems_bsd_force_select_timeout()

This commit is contained in:
Sebastian Huber 2014-11-03 09:18:14 +01:00
parent d496d66f63
commit ffbee8a6c4
2 changed files with 65 additions and 0 deletions

View File

@ -1874,3 +1874,49 @@ selectinit(void *dummy __unused)
NULL, NULL, UMA_ALIGN_PTR, 0);
mtxpool_select = mtx_pool_create("select mtxpool", 128, MTX_DEF);
}
#ifdef __rtems__
#include <machine/rtems-bsd-thread.h>
#include <rtems/score/objectimpl.h>
#include <rtems/score/threadimpl.h>
#include <rtems/score/threadqimpl.h>
#include <rtems/bsd/util.h>
static void
force_select_timeout(Thread_Control *thread)
{
struct thread *td = rtems_bsd_get_thread(thread);
if (td != NULL) {
struct seltd *stp = td->td_sel;
if (thread->Wait.queue == &stp->st_wait.cv_waiters) {
_Thread_queue_Process_timeout(thread);
}
}
}
rtems_status_code rtems_bsd_force_select_timeout(rtems_id task_id)
{
Thread_Control *thread;
Objects_Locations location;
thread = _Thread_Get(task_id, &location);
switch (location) {
case OBJECTS_LOCAL:
force_select_timeout(thread);
_Objects_Put(&thread->Object);
break;
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
_Thread_Dispatch();
return (RTEMS_ILLEGAL_ON_REMOTE_OBJECT);
#endif
default:
return (RTEMS_INVALID_ID);
}
return (RTEMS_SUCCESSFUL);
}
#endif /* __rtems__ */

View File

@ -40,6 +40,8 @@
#include <stdint.h>
#include <rtems.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
@ -77,6 +79,23 @@ rtems_bsd_arp_processor_process(
rtems_bsd_arp_processor_context *ctx,
rtems_bsd_arp_processor processor, void *arg);
/**
* @brief Forces a select() timeout for the specified task.
*
* In case the specified task waits in a select(), then it is woken up with a
* timeout status, otherwise this call has no effect.
*
* @param[in] task_id The task identifier.
*
* @retval RTEMS_SUCCESSFUL Successful operation.
* @retval RTEMS_INVALID_ID No such task.
*
* @warning This function may go away once the signal support for condition
* variables is implemented.
*/
rtems_status_code
rtems_bsd_force_select_timeout(rtems_id task_id);
#ifdef __cplusplus
}
#endif /* __cplusplus */