summaryrefslogtreecommitdiff
path: root/databases/mysql80-client/patches/patch-mysys_kqueue__timers.cc
blob: fb7692da68f2f112f723a791b9d088dbf5f00027 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
$NetBSD: patch-mysys_kqueue__timers.cc,v 1.1 2021/05/13 15:25:20 jdolecek Exp $

* support pre NetBSD 10 __intptr_t udata type
* Fix for systems whcich do not define EVFILT_USER

--- mysys/kqueue_timers.cc.orig	2021-03-22 08:44:50.000000000 +0000
+++ mysys/kqueue_timers.cc
@@ -40,6 +40,18 @@
 #include "mysys_err.h"
 #include "mysys_priv.h" /* key_thread_timer_notifier */
 
+#ifdef __NetBSD__
+#include <sys/param.h>
+#if __NetBSD_Version__ < 999001400
+#define KEVENT_UDATA_TYPE_CAST (__intptr_t)
+#else
+#define KEVENT_UDATA_TYPE_CAST
+#endif
+#else
+#define KEVENT_UDATA_TYPE_CAST
+#endif
+
+
 /* Kernel event queue file descriptor. */
 static int kq_fd = -1;
 
@@ -69,10 +81,12 @@ static void *timer_notify_thread_func(vo
     }
 
     if (kev.filter == EVFILT_TIMER) {
-      timer = static_cast<my_timer_t *>(kev.udata);
+      timer = static_cast<my_timer_t *>((void *)kev.udata);
       assert(timer->id == kev.ident);
       timer->notify_function(timer);
+#ifdef EVFILT_USER
     } else if (kev.filter == EVFILT_USER)
+#endif
       break;
   }
 
@@ -91,7 +105,9 @@ static void *timer_notify_thread_func(vo
 static int start_helper_thread(void) {
   struct kevent kev;
 
+#ifdef EVFILT_USER
   EV_SET(&kev, 0, EVFILT_USER, EV_ADD, 0, 0, 0);
+#endif
 
   if (kevent(kq_fd, &kev, 1, NULL, 0, NULL) < 0) {
     my_message_local(ERROR_LEVEL, EE_FAILED_TO_CREATE_TIMER, errno);
@@ -134,7 +150,9 @@ int my_timer_initialize(void) {
 void my_timer_deinitialize(void) {
   struct kevent kev;
 
+#ifdef EVFILT_USER
   EV_SET(&kev, 0, EVFILT_USER, 0, NOTE_TRIGGER, 0, 0);
+#endif
 
   if (kevent(kq_fd, &kev, 1, NULL, 0, NULL) < 0)
     my_message_local(ERROR_LEVEL,
@@ -165,7 +183,7 @@ int my_timer_create(my_timer_t *timer) {
 int my_timer_set(my_timer_t *timer, unsigned long time) {
   struct kevent kev;
 
-  EV_SET(&kev, timer->id, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, time, timer);
+  EV_SET(&kev, timer->id, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, time,KEVENT_UDATA_TYPE_CAST timer);
 
   return kevent(kq_fd, &kev, 1, NULL, 0, NULL);
 }