obj := $(src-o-files)
$(all-daemon)
-tests_src := bitmap_test.c heap_test.c buffer_test.c event_test.c flowspec_test.c bitops_test.c patmatch_test.c fletcher16_test.c slist_test.c checksum_test.c lists_test.c mac_test.c ip_test.c hash_test.c printf_test.c slab_test.c
+tests_src := attribute_cleanup_test.c bitmap_test.c heap_test.c buffer_test.c event_test.c flowspec_test.c bitops_test.c patmatch_test.c fletcher16_test.c slist_test.c checksum_test.c lists_test.c mac_test.c ip_test.c hash_test.c printf_test.c slab_test.c
tests_targets := $(tests_targets) $(tests-target-files)
tests_objs := $(tests_objs) $(src-o-files)
--- /dev/null
+/*
+ * BIRD Library -- Auto storage attribute cleanup test
+ *
+ * (c) 2023 Maria Matejka <mq@jmq.cz>
+ * (c) 2023 CZ.NIC z.s.p.o.
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include "test/birdtest.h"
+
+static int order_pos;
+//#define PUSH(n) bt_assert(order_pos++ == (n))
+#define CHECK(n) ASSERT_DIE(order_pos++ == (n))
+
+static void
+tacd_cleanup(int *val)
+{
+ CHECK(*val);
+}
+
+static void
+tacd_aux(int pos)
+{
+ CHECK(pos + 0);
+
+ __attribute__((cleanup(tacd_cleanup))) int upmost = pos + 18;
+
+ if (order_pos > 0)
+ {
+ CHECK(pos + 1);
+ __attribute__((cleanup(tacd_cleanup))) int inner_if = pos + 3;
+ CHECK(pos + 2);
+ }
+
+ for (int i=0; i<3; i++)
+ {
+ CHECK(pos + 4 + 3*i);
+ __attribute__((cleanup(tacd_cleanup))) int inner_for = pos + 6 + 3*i;
+ CHECK(pos + 5 + 3*i);
+ }
+
+ for (
+ __attribute__((cleanup(tacd_cleanup))) int i = pos + 15;
+ i < pos + 16; i++)
+ {
+ CHECK(pos + 13);
+ __attribute__((cleanup(tacd_cleanup))) int inner_for = pos + 15;
+ CHECK(pos + 14);
+ }
+
+ CHECK(pos + 17);
+}
+
+#define CHECKCNT 19
+
+static int
+t_attribute_cleanup_direct(void)
+{
+ order_pos = 0;
+ CHECK(0);
+
+ for (int i=0; i<3; i++)
+ {
+ CHECK(i*(CHECKCNT+3) + 1);
+ __attribute__((cleanup(tacd_cleanup))) int inner_for = (i+1) * (CHECKCNT+3);
+ tacd_aux(i*(CHECKCNT+3) + 2);
+ CHECK((i+1) * (CHECKCNT+3) - 1);
+ }
+
+ CHECK(3 * (CHECKCNT+3) + 1);
+
+ return 1;
+}
+
+int main(int argc, char **argv)
+{
+ bt_init(argc, argv);
+
+ bt_test_suite(t_attribute_cleanup_direct, "Directly using __attribute__((cleanup))");
+
+ return bt_exit_value();
+}
debug("Not found.\n");
}
-static void
-my_check(int *whatever UNUSED)
-{
- printf("Everything works well.\n");
-}
-
/**
* resource_init - initialize the resource manager
*
void
resource_init(void)
{
- __attribute__((cleanup(my_check))) int test = 42;
resource_sys_init();
root_pool.r.class = &pool_class;