{"object_kind":"push","event_name":"push","before":"0393fd8a72e044a669ec4da0729dee52660c7397","after":"f11ab0da3e500ab6f3c9531696bfc67370752550","ref":"refs/heads/master","ref_protected":true,"checkout_sha":"f11ab0da3e500ab6f3c9531696bfc67370752550","message":null,"user_id":3060,"user_name":"Wim Taymans","user_username":"wtaymans","user_email":"","user_avatar":"https://secure.gravatar.com/avatar/1ca1bed246cb9b95b7ead6d6be96bb09f0c112953140c8bb38b41aedf4465270?s=80&d=identicon","project_id":4753,"project":{"id":4753,"name":"pipewire","description":"Multimedia processing graphs","web_url":"https://gitlab.freedesktop.org/pipewire/pipewire","avatar_url":"https://gitlab.freedesktop.org/uploads/-/system/project/avatar/4753/pipewire.png","git_ssh_url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","git_http_url":"https://gitlab.freedesktop.org/pipewire/pipewire.git","namespace":"PipeWire","visibility_level":20,"path_with_namespace":"pipewire/pipewire","default_branch":"master","ci_config_path":"","homepage":"https://gitlab.freedesktop.org/pipewire/pipewire","url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","ssh_url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","http_url":"https://gitlab.freedesktop.org/pipewire/pipewire.git"},"commits":[{"id":"f11ab0da3e500ab6f3c9531696bfc67370752550","message":"spa: loop: Mark cancellation fields as volatile\n\nCancellation handlers use setjmp/longjmp, for which the C99\nspecification has the following note:\n\n> 17.3.2.1 (3)\n> All accessible objects have values, and all other components of the\n> abstract machine) have state, as of the time the longjmp function was\n> called, except that the values of objects of automatic storage\n> duration that are local to the function containing the invocation of\n> the corresponding setjmp macro that do not have volatile-qualified\n> type and have been changed between the setjmp invocation and longjmp\n> call are indeterminate.\n\nWhile everything works fine with GCC, with Clang we see that the\ncancellation handler doesn't seem to have an effect (loop-test fails\nwhen it notices that its spa_source's priv and mask have not been\ncleaned up).\n\nThe underlying cause is that the compiler can assume data.ep_count is\nonly used in loop_iterate_cancel(), and so can be cached in a register.\nWhen we access that field in the cancellation handler, it was never\nactually written to the memory on the stack, so the read in\ncancellation_handler() does not see the current value.\n\nWe fix this by marking all fields on the stack that we expect to be\nmodified in loop_iterate_cancel() as volatile, forcing the memory to be\nupdated and correctly available to the cancellation handler.\n","title":"spa: loop: Mark cancellation fields as volatile","timestamp":"2026-03-12T09:24:53+00:00","url":"https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/f11ab0da3e500ab6f3c9531696bfc67370752550","author":{"name":"Arun Raghavan","email":"arunr@valvesoftware.com"},"added":[],"modified":["spa/plugins/support/loop.c"],"removed":[]}],"total_commits_count":1,"push_options":{},"repository":{"name":"pipewire","url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","description":"Multimedia processing graphs","homepage":"https://gitlab.freedesktop.org/pipewire/pipewire","git_http_url":"https://gitlab.freedesktop.org/pipewire/pipewire.git","git_ssh_url":"git@ssh.gitlab.freedesktop.org:pipewire/pipewire.git","visibility_level":20}}