X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/1fe5f5eb5378a47bf0f3451762743c162e40faad..HEAD:/lunaix-os/includes/lunaix/ds/ldga.h diff --git a/lunaix-os/includes/lunaix/ds/ldga.h b/lunaix-os/includes/lunaix/ds/ldga.h index c436798..a9b1430 100644 --- a/lunaix-os/includes/lunaix/ds/ldga.h +++ b/lunaix-os/includes/lunaix/ds/ldga.h @@ -12,10 +12,22 @@ #define __LUNAIX_LDGA_H #include +#include + +#define ldga_el_id(ga_name, el_name) __lga_##ga_name##_##el_name +#define ldga_section(ga_name) __attribute__((section(".lga." ga_name))) #define export_ldga_el(ga_name, el_name, type, val) \ - type __attribute__((section(".lga." #ga_name))) \ - __lga_##ga_name##_##el_name = (type)(val) + type ldga_section(#ga_name) must_emit ldga_el_id(ga_name, el_name) = (type)(val) + +#define export_ldga_el_sfx(ga_name, el_name, type, val, suffix) \ + type ldga_section(#ga_name "." #suffix) must_emit ldga_el_id(ga_name, el_name) = \ + (type)(val) + +#define export_ldga_el_idx(ga_name, i, type, val) \ + export_ldga_el(ga_name, i, type, val) +#define export_ldga_el_anon(ga_name, type, val) \ + export_ldga_el_idx(ga_name, __COUNTER__, type, val) #define ldga_foreach(ga_name, el_type, index, el) \ extern el_type __lga_##ga_name##_start[], __lga_##ga_name##_end; \ @@ -24,4 +36,19 @@ (ptr_t)&__lga_##ga_name##_end; \ el = __lga_##ga_name##_start[++index]) +/** + * @brief Invoke all elements in the array named `ga_name` of parameterless + * function pointers + * + */ +#define ldga_invoke_fn0(ga_name) \ + ({ \ + int i = 0; \ + ptr_t fn0; \ + ldga_foreach(ga_name, ptr_t, i, fn0) \ + { \ + ((void (*)())fn0)(); \ + } \ + }) + #endif /* __LUNAIX_LDGA_H */