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 <[email protected]>
@@ -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)))