[PATCH wayland 2/2] scanner: Generate all SINCE_VERSION macros for everyone

Quentin Glidic sardemff7+wayland at sardemff7.net
Wed Aug 10 12:47:06 UTC 2016


On 10/08/2016 14:36, Pekka Paalanen wrote:
> On Tue, 9 Aug 2016 11:05:49 +0300
> Pekka Paalanen <ppaalanen at gmail.com> wrote:
>
>> On Mon, 8 Aug 2016 15:59:37 +0200
>> Quentin Glidic <sardemff7+wayland at sardemff7.net> wrote:
>>
>>> On 08/08/2016 15:45, Pekka Paalanen wrote:
>>>> On Tue,  5 Jul 2016 20:41:50 +0200
>>>> Quentin Glidic <sardemff7+wayland at sardemff7.net> wrote:
>>>>
>>>>> From: Quentin Glidic <sardemff7+git at sardemff7.net>
>>>>>
>>>>> Practical example: a client supporting version 2 of wl_output will wait
>>>>> for the wl_output.done event before starting wl_output-related
>>>>> operations. However, if the server only supports version 1, no event
>>>>> will ever come, and it must fallback to use the wl_output.geometry event
>>>>> alone.
>>>>> Without this macro, it cannot check for that in a nice way.
>>>>>
>>>>> Signed-off-by: Quentin Glidic <sardemff7+git at sardemff7.net>
>>>>> ---
>>>>>
>>>>> I do not have a real world use-case for the request macro on the server-side,
>>>>> but I guess you could do the same: wait the for a "commit" request if client is
>>>>> new enough, otherwise use some older request as commit.
>>>>>
>>>>> Actually I think there was something like that somewhere, now that I write that,
>>>>> but I do not remember where exactly.
>>>>>
>>>>>
>>>>>  src/scanner.c | 2 ++
>>>>>  1 file changed, 2 insertions(+)
>>>>>
>>>>> diff --git a/src/scanner.c b/src/scanner.c
>>>>> index 4708cae..a4c1984 100644
>>>>> --- a/src/scanner.c
>>>>> +++ b/src/scanner.c
>>>>> @@ -1544,10 +1544,12 @@ emit_header(struct protocol *protocol, enum side side)
>>>>>  			emit_structs(&i->request_list, i, side);
>>>>>  			emit_opcodes(&i->event_list, i);
>>>>>  			emit_opcode_versions(&i->event_list, i);
>>>>> +			emit_opcode_versions(&i->request_list, i);
>>>>>  			emit_event_wrappers(&i->event_list, i);
>>>>>  		} else {
>>>>>  			emit_structs(&i->event_list, i, side);
>>>>>  			emit_opcodes(&i->request_list, i);
>>>>> +			emit_opcode_versions(&i->event_list, i);
>>>>>  			emit_opcode_versions(&i->request_list, i);
>>>>>  			emit_stubs(&i->request_list, i);
>>>>>  		}
>>>>
>>>> Hi,
>>>>
>>>> I have just one question about this. Users must be able to include both
>>>> server and client headers in the same compilation unit. Wouldn't this
>>>> cause the same thing to be #defined in two different headers? More
>>>> importantly, are we sure it won't cause problems?
>>>
>>> At least with GCC, you can have twice the same #define (same name + same
>>> value) without issue. I do not know about the C standard take on that
>>> though.
>>
>> Hi,
>>
>> I would need more proof/opinions than just a "it worked for me".
>>
>>> If that would cause problems, it would be because a request and an event
>>> have the same name, and come from different versions. But if a user must
>>> be able to include both client and server headers, it is already an issue.
>>
>> I think we can assume that client and server side should use the same
>> version of the XML files.
>>
>> How is it already an issue? Do we already #define something in both
>> headers?

The issue shows up for this kind of protocol:
<request name="something" since="3" />
<event name="something" since="2" />

Currently, with this protocol, including both client and server headers 
will fail, because one #define will be 3 and the other 2.
This patch will break even when including one header.

I guess this kind of protocol is just considered bad design? :-)


>> At least we already seem to have a test in the Wayland test suite that
>> includes both client and server protocol headers in the same
>> compilation unit.
>>
>>> If you really want, I can make server-side define events + prefixed
>>> requests and the other way around.
>>>
>>> server.h:
>>> #define NAMESPACE_INTERFACE_SOMEEV_SINCE_VERSION 2
>>> #define NAMESPACE_INTERFACE_REQUEST_SOMEREQ_SINCE_VERSION 3
>>> client.h:
>>> #define NAMESPACE_INTERFACE_EVENT_SOMEEV_SINCE_VERSION 2
>>> #define NAMESPACE_INTERFACE_SOMEREQ_SINCE_VERSION 3
>>
>> I'd like to avoid that naming hassle if possible. I just want to know
>> if it is possible.
>
> Hi all,
>
> after talking to my colleagues and noting that no Microsoft
> compiler would ever be used to compile this code, my worries have
> cleared.
>
> GCC has this:
> https://gcc.gnu.org/onlinedocs/cpp/Undefining-and-Redefining-Macros.html
>
> I assume Clang would be similar.
>
> We can add duplicate #defines just fine. In the unlikely case that it
> will blow up something, we can fix the generator to emit
> #ifndef/#define/#endif instead of just #define.
>
> How's that for a contingency plan?

Good enough for me.


> The patch is
> Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>

Thanks,

-- 

Quentin “Sardem FF7” Glidic


More information about the wayland-devel mailing list