User data of epoll event is reported abnormally by epoll_wait.

blake kim via Digitalmars-d digitalmars-d at puremagic.com
Wed Aug 20 03:01:05 PDT 2014


On Wednesday, 20 August 2014 at 07:02:52 UTC, blake kim wrote:
> On Wednesday, 20 August 2014 at 06:17:43 UTC, Dominikus Dittes 
> Scherkl wrote:
>> On Wednesday, 20 August 2014 at 06:11:42 UTC, blake kim wrote:
>>> But I don't think this is right. Many C APIs need structure 
>>> as argument and adjusting align each structure doesn't make 
>>> sense.
>>>
>>> Is this problem a Bug of D ?
>> Default alignment in D is pointersize (size_t) - so 8 on 64bit.
>> But most C compilers default to 4 regardless of pointersize.
>> I think this is more a bug in C than in D.
>
> epoll_wait is a system API on Linux.
>
> So, I can't agree that it is a bug of C in alignment.
>
> C uses 4 byte alignment, then, I think, it is sensible that D 
> should follow that.
>
> Actually,  In core.sys.linux.epoll.d, struct epoll_event 
> doesn't assign a specific align so that the problem is caused.

I found the solution.
This is a obvious bug of core.sys.linux.epoll.d.
The default alignment of all of both C and D is 8 on 64bit OS.
But epoll_event is packed as 
follows.(/usr/include/x86_64-linux-gnu/sys/epoll.h)

struct epoll_event
{
   uint32_t events;	/* Epoll events */
   epoll_data_t data;	/* User data variable */
} __attribute__ ((__packed__));

Therefore, epoll_event should be declared in D as follows.

extern(C) align(1) struct epoll_event {
align(1):
   uint events;
   epoll_data_t data;
}



More information about the Digitalmars-d mailing list