3

Reading chromium code, found helpful macro for handling EINTR errno of system calls on POSIX compliant systems. Here are the code(base/posix/eintr_wrapper.h):

#define HANDLE_EINTR(x) ({ \ decltype(x) eintr_wrapper_result; \ do { \ eintr_wrapper_result = (x); \ } while (eintr_wrapper_result == -1 && errno == EINTR); \ eintr_wrapper_result; \ }) 

The question is what is the role of last statement in macro eintr_wrapper_result; ? If we use commas instead of semicolons - it will be clear - to return the result of last operation(comma operator). But what is purpose in this case?

1

1 Answer 1

9

This macro uses the Statement-Expressions GCC extension. The last expression in the inner block serves as the value for the whole, once it has been executed, much like the comma operator.

Sign up to request clarification or add additional context in comments.

2 Comments

For interest, why not just use the comma operator?
@simonwo Because do{}while() is not an expression, and thus can't be an operand of the comma operator.