diff --git a/meson.build b/meson.build index 11d146a5..e770eab0 100644 --- a/meson.build +++ b/meson.build @@ -182,6 +182,16 @@ cc_warning_flags = cc.get_supported_arguments(cc_warning_flags_test) cc_flags = [cc_debug_flags, cc_os_flags, cc_warning_flags] add_project_arguments(cc_flags, language : 'c') +# Meson's has_function_attribute doesn't know about GCC's extended +# version (with arguments), so we have to build a test program instead. +malloc_attribute_test = '''#include +__attribute__ ((malloc (free, 1))) +int func() { return 0; } +''' +if cc.compiles(malloc_attribute_test, name : 'malloc attribute with arguments') + add_project_arguments('-DHAVE_MALLOC_EXTENDED_ATTRIBUTE', language: 'c') +endif + incdir = include_directories('src/shared') einfo_incdir = include_directories('src/libeinfo') rc_incdir = include_directories('src/librc') diff --git a/src/librc/rc.h.in b/src/librc/rc.h.in index 651f317b..c5146fb6 100644 --- a/src/librc/rc.h.in +++ b/src/librc/rc.h.in @@ -528,8 +528,15 @@ bool rc_yesno(const char *); /*! @name String List functions * Every string list should be released with a call to rc_stringlist_free. */ -/*! Create a new stringlist +/*! Frees each item on the list and the list itself. + * @param list to free */ +void rc_stringlist_free(RC_STRINGLIST *); + +/*! Create a new stringlinst * @return pointer to new list */ +#ifdef HAVE_MALLOC_EXTENDED_ATTRIBUTE +__attribute__ ((malloc (rc_stringlist_free, 1))) +#endif RC_STRINGLIST *rc_stringlist_new(void); /*! Duplicate the item, add it to end of the list and return a pointer to it. @@ -568,10 +575,6 @@ RC_STRINGLIST *rc_stringlist_split(const char *, const char *); * @param list to sort */ void rc_stringlist_sort(RC_STRINGLIST **); -/*! Frees each item on the list and the list itself. - * @param list to free */ -void rc_stringlist_free(RC_STRINGLIST *); - typedef struct rc_pid { pid_t pid;