tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: EV_SET() better C++ compat with alternative implementations



On 13.08.2019 20:22, Jaromir Dolecek wrote:
> I think the rationale was to make it possible to use for integer values and operations without cast. And make it clear it can hold arbitrary value, not necessarily pointer. Unfortunately intptr_t has different size in 32 vs 64 bit same as void *, which I didnt consider. 
> 
> Using (void *) would be bad IMO. If we want to change this, please follow the mac OS and use explicit integer 64bit types instead. This would of course change ABI so needs versioning. 
> 

Darwin uses void* for udata.

     The kevent structure is defined as:

     struct kevent {
             uintptr_t ident;        /* identifier for this event */
             short     filter;       /* filter for event */
             u_short   flags;        /* action flags for kqueue */
             u_int     fflags;       /* filter flag value */
             intptr_t  data;         /* filter data value */
             void      *udata;       /* opaque user data identifier */
     };


https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/kqueue.2.html

Imho int64_t make things actually worse.

 1. Every pointer than can exceed 32bit intptr_t can just be allocated
on a heap and we should pass a pointer to it.
 2. int64 does not resolve any C++ issues with strict types.
 3. ABI brekage

void* does not prevent storing inside it numbers.

void* (or char*, int*,...) is a typical userdata argument. It can be
found in this form in other places such as set_panel_userptr(3),
FTSENT.fts_pointer in fts(3) or tss_set(3).

> Jaromir
> 
> 
> 
>> Le 12 août 2019 à 14:51, Valery Ushakov <uwe%stderr.spb.ru@localhost> a écrit :
>>
>>> On Mon, Aug 12, 2019 at 03:43:56 +0000, maya%NetBSD.org@localhost wrote:
>>>
>>> So, this is when we changed to intptr_t. We also went through a
>>> "int64_t udata" revision at some point, later.
>>>
>>> Module Name:    syssrc
>>> Committed By:   jdolecek
>>> Date:           Wed Oct  2 19:09:37 UTC 2002
>>>
>>> Modified Files:
>>>        syssrc/sys/sys [kqueue]: event.h
>>>
>>> Log Message:
>>> make 'udata' field of struct kevent intptr_t (was 'void *')
>> [...]
>>> jdolecek, do you remember why you wanted to switch?
>>
>> Could it be related to 64-bit kernel vs. 32-bit userland (one of the
>> mips ABIs?)
>>
>> -uwe


Attachment: signature.asc
Description: OpenPGP digital signature



Home | Main Index | Thread Index | Old Index