Hi Shaobo,
On Nov 10 12:15, Shaobo Song wrote:
> This commit revises `pthread_cleanup_push` and `pthread_cleanup_pop` macros to
> use a `do { ... } while(0)` wrapper, preventing syntax errors when used in
> certain contexts. The original code could fail when they are wrapped within a
> `do { ... } while(0)`, causing unintended behavior or compilation issues.
> Example of error:
>
> #include <pthread.h>
>
> #define pthread_cleanup_push_wrapper(_fn, _arg) do { \
> pthread_cleanup_push(_fn, _arg); \
> } while (0)
>
> #define pthread_cleanup_pop_wrapper(_execute) do { \
> pthread_cleanup_pop(_execute); \
> } while (0)
>
> void cleanup_fn (void *arg) {}
>
> void *thread_func (void *arg)
> {
> pthread_cleanup_push_wrapper(cleanup_fn, NULL);
> pthread_cleanup_pop_wrapper(1);
> return NULL;
> }
>
> int main (int argc, char **argv) {
> pthread_t thread_id;
> pthread_create(&thread_id, NULL, thread_func, NULL);
> }
>
> This would fail due to unmatched braces in the macro expansion. The new
> structure ensures the macro expands correctly in all cases.
>
> Signed-off-by: Shaobo Song <[email protected]>
Thanks for the patch. Pushed with an extra "Fixes" line in the
commit message to main and cygwin-3_5-branch.
Corinna