Module Name: src Committed By: kamil Date: Sat Aug 10 15:02:03 UTC 2019
Modified Files: src/sys/sys: event.h Log Message: Handle more corner cases in sys/event.h for C++ EV_SET() Handle the udata argument as Plain-Old-Data types separately. - int, long int, long long int - unsigned int, unsigned long int, unsigned long long int - void * This approach handles each of the POD types separately on purpose as intermediate types such as intptr_t can be either int or long (even long long) and handling them is not portable. This approach is compatibile with C++98 and newer. Fixes i386 usage. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/sys/sys/event.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/sys/event.h diff -u src/sys/sys/event.h:1.34 src/sys/sys/event.h:1.35 --- src/sys/sys/event.h:1.34 Sat Aug 10 11:20:50 2019 +++ src/sys/sys/event.h Sat Aug 10 15:02:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: event.h,v 1.34 2019/08/10 11:20:50 kamil Exp $ */ +/* $NetBSD: event.h,v 1.35 2019/08/10 15:02:03 kamil Exp $ */ /*- * Copyright (c) 1999,2000,2001 Jonathan Lemon <jle...@freebsd.org> @@ -55,39 +55,89 @@ struct kevent { intptr_t udata; /* opaque user data identifier */ }; +#ifdef __cplusplus +#define EV_SET(kevp, ident, filter, flags, fflags, data, udata) \ + _EV_SET((kevp), __CAST(uintptr_t, (ident)), (filter), (flags), \ + (fflags), (data), (udata)) + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion-null" + static __inline void _EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter, - uint32_t _flags, uint32_t _fflags, int64_t _data, intptr_t _udata) + uint32_t _flags, uint32_t _fflags, int64_t _data, void *_udata) { _kevp->ident = _ident; _kevp->filter = _filter; _kevp->flags = _flags; _kevp->fflags = _fflags; _kevp->data = _data; - _kevp->udata = _udata; + _kevp->udata = reinterpret_cast<intptr_t>(_udata); } -#ifdef __cplusplus -#define EV_SET(kevp, ident, filter, flags, fflags, data, udata) \ - _EV_SET((kevp), __CAST(uintptr_t, (ident)), (filter), (flags), \ - (fflags), (data), (udata)) +static __inline void +_EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter, + uint32_t _flags, uint32_t _fflags, int64_t _data, int _udata) +{ + _EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data, + reinterpret_cast<void *>(static_cast<intptr_t>(_udata))); +} static __inline void _EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter, - uint32_t _flags, uint32_t _fflags, int64_t _data, void *_udata) + uint32_t _flags, uint32_t _fflags, int64_t _data, long int _udata) { _EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data, - reinterpret_cast<intptr_t>(_udata)); + reinterpret_cast<void *>(static_cast<intptr_t>(_udata))); } static __inline void _EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter, - uint32_t _flags, uint32_t _fflags, int64_t _data, int _udata) + uint32_t _flags, uint32_t _fflags, int64_t _data, long long int _udata) +{ + _EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data, + reinterpret_cast<void *>(static_cast<intptr_t>(_udata))); +} + +static __inline void +_EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter, + uint32_t _flags, uint32_t _fflags, int64_t _data, unsigned int _udata) +{ + _EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data, + reinterpret_cast<void *>(static_cast<intptr_t>(_udata))); +} + +static __inline void +_EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter, + uint32_t _flags, uint32_t _fflags, int64_t _data, unsigned long int _udata) +{ + _EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data, + reinterpret_cast<void *>(static_cast<intptr_t>(_udata))); +} + +static __inline void +_EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter, + uint32_t _flags, uint32_t _fflags, int64_t _data, + unsigned long long int _udata) { _EV_SET(_kevp, _ident, _filter, _flags, _fflags, _data, - static_cast<intptr_t>(_udata)); + reinterpret_cast<void *>(static_cast<intptr_t>(_udata))); } + +#pragma GCC diagnistic pop #else +static __inline void +_EV_SET(struct kevent *_kevp, uintptr_t _ident, uint32_t _filter, + uint32_t _flags, uint32_t _fflags, int64_t _data, intptr_t _udata) +{ + _kevp->ident = _ident; + _kevp->filter = _filter; + _kevp->flags = _flags; + _kevp->fflags = _fflags; + _kevp->data = _data; + _kevp->udata = _udata; +} + #define EV_SET(kevp, ident, filter, flags, fflags, data, udata) \ _EV_SET((kevp), __CAST(uintptr_t, (ident)), (filter), (flags), \ (fflags), (data), __CAST(intptr_t, (udata)))