[rtems-libbsd commit] Add rtems_bsd_force_select_timeout()

Sebastian Huber sebh at rtems.org
Tue Nov 4 12:02:23 UTC 2014


Module:    rtems-libbsd
Branch:    master
Commit:    ffbee8a6c43141a77801b4ca40a145b3e56faf7a
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=ffbee8a6c43141a77801b4ca40a145b3e56faf7a

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Nov  3 09:18:14 2014 +0100

Add rtems_bsd_force_select_timeout()

---

 freebsd/sys/kern/sys_generic.c    |   46 +++++++++++++++++++++++++++++++++++++
 rtemsbsd/include/rtems/bsd/util.h |   19 +++++++++++++++
 2 files changed, 65 insertions(+), 0 deletions(-)

diff --git a/freebsd/sys/kern/sys_generic.c b/freebsd/sys/kern/sys_generic.c
index fefc94d..6fc16fc 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 a2cd1e8..86aacf3 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 */



More information about the vc mailing list