summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-11-03 09:18:14 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-11-04 13:02:55 +0100
commitffbee8a6c43141a77801b4ca40a145b3e56faf7a (patch)
treea2c2bcb398755936c8c7540d1433013aaaed14fb
parentd496d66f63539497153e8e87f7155cf129e01379 (diff)
downloadrtems-libbsd-ffbee8a6c43141a77801b4ca40a145b3e56faf7a.tar.bz2
Add rtems_bsd_force_select_timeout()
-rw-r--r--freebsd/sys/kern/sys_generic.c46
-rw-r--r--rtemsbsd/include/rtems/bsd/util.h19
2 files changed, 65 insertions, 0 deletions
diff --git a/freebsd/sys/kern/sys_generic.c b/freebsd/sys/kern/sys_generic.c
index fefc94d9..6fc16fc5 100644
--- a/freebsd/sys/kern/sys_generic.c
+++ b/freebsd/sys/kern/sys_generic.c
@@ -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__ */
diff --git a/rtemsbsd/include/rtems/bsd/util.h b/rtemsbsd/include/rtems/bsd/util.h
index a2cd1e80..86aacf3f 100644
--- a/rtemsbsd/include/rtems/bsd/util.h
+++ b/rtemsbsd/include/rtems/bsd/util.h
@@ -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 */