[PATCH 4/6] libtest: Add support to seize/surrender objects

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Feb 22 08:43:47 UTC 2021


---
 cpukit/include/rtems/test.h        |  5 +++
 cpukit/libtest/t-test-rtems-objs.c | 54 ++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+)

diff --git a/cpukit/include/rtems/test.h b/cpukit/include/rtems/test.h
index b42bf5f058..10ff665107 100644
--- a/cpukit/include/rtems/test.h
+++ b/cpukit/include/rtems/test.h
@@ -36,6 +36,7 @@
 
 #ifdef __rtems__
 #include <rtems/score/cpu.h>
+#include <rtems/rtems/status.h>
 #endif
 
 #ifdef __cplusplus
@@ -2512,6 +2513,10 @@ typedef enum {
 } T_thread_timer_state;
 
 T_thread_timer_state T_get_thread_timer_state(uint32_t);
+
+void *T_seize_objects(rtems_status_code (*)(void *, uint32_t *), void *);
+
+void T_surrender_objects(void **, rtems_status_code (*)(uint32_t));
 #endif /* __rtems__ */
 
 /**
diff --git a/cpukit/libtest/t-test-rtems-objs.c b/cpukit/libtest/t-test-rtems-objs.c
index ad8d153154..6548848c49 100644
--- a/cpukit/libtest/t-test-rtems-objs.c
+++ b/cpukit/libtest/t-test-rtems-objs.c
@@ -410,3 +410,57 @@ T_check_rtems_timers(T_event event, const char *name)
 		break;
 	};
 }
+
+void *
+T_seize_objects(rtems_status_code (*create)(void *, uint32_t *), void *arg)
+{
+	void *objects;
+
+	objects = NULL;
+
+	while (true) {
+		rtems_status_code sc;
+		rtems_id id;
+
+		id = 0;
+		sc = (*create)(arg, &id);
+
+		if (sc == RTEMS_SUCCESSFUL) {
+			const Objects_Information *info;
+			Objects_Control *obj;
+
+			info = _Objects_Get_information_id(id);
+			T_quiet_assert_not_null(info);
+			obj = _Objects_Get_no_protection(id, info);
+			T_quiet_assert_not_null(obj);
+			obj->Node.next = objects;
+			objects = obj;
+		} else {
+			T_quiet_rsc(sc, RTEMS_TOO_MANY);
+			break;
+		}
+	}
+
+	return objects;
+}
+
+void
+T_surrender_objects(void **objects_p, rtems_status_code (*delete)(uint32_t))
+{
+	void *objects;
+
+	objects = *objects_p;
+	*objects_p = NULL;
+
+	while (objects != NULL) {
+		Objects_Control *obj;
+		rtems_status_code sc;
+
+		obj = objects;
+		objects = _Chain_Next(&obj->Node);
+		_Chain_Set_off_chain(&obj->Node);
+
+		sc = (*delete)(obj->id);
+		T_quiet_rsc_success(sc);
+	}
+}
-- 
2.26.2



More information about the devel mailing list