diff --git a/src/handshake.h b/src/handshake.h index 7136087a..7f597b06 100644 --- a/src/handshake.h +++ b/src/handshake.h @@ -164,23 +164,27 @@ struct handshake_state { handshake_event_func_t event_func; }; -#define handshake_event(_hs, event, ...) \ - (__extension__ ({ \ - bool freed = false; \ - \ - if ((_hs)->event_func && !(_hs)->in_event) { \ - (_hs)->in_event = true; \ - (_hs)->event_func((_hs), event, (_hs)->user_data, \ - ##__VA_ARGS__); \ - \ - if (!(_hs)->in_event) { \ - handshake_state_free((_hs)); \ - freed = true; \ - } else \ - (_hs)->in_event = false; \ - } \ - freed; \ - })) +#define HSID(x) UNIQUE_ID(handshake_, x) + +#define handshake_event(_hs, event, ...) \ + ({ \ + bool HSID(freed) = false; \ + typeof(_hs) HSID(hs) = (_hs); \ + \ + if (HSID(hs)->event_func && !HSID(hs)->in_event) { \ + HSID(hs)->in_event = true; \ + HSID(hs)->event_func(HSID(hs), (event), \ + HSID(hs)->user_data, \ + ##__VA_ARGS__); \ + \ + if (!HSID(hs)->in_event) { \ + handshake_state_free(HSID(hs)); \ + HSID(freed) = true; \ + } else \ + HSID(hs)->in_event = false; \ + } \ + HSID(freed); \ + }) void handshake_state_free(struct handshake_state *s); diff --git a/src/util.h b/src/util.h index b55a7ea7..75c29039 100644 --- a/src/util.h +++ b/src/util.h @@ -26,6 +26,10 @@ #include #include +#define ___PASTE(a, b) a ## b +#define __PASTE(a, b) ___PASTE(a, b) +#define UNIQUE_ID(x, id) __PASTE(__unique_prefix_, __PASTE(x, id)) + #define align_len(len, boundary) (((len)+(boundary)-1) & ~((boundary)-1)) #define MAC "%02x:%02x:%02x:%02x:%02x:%02x"