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
|
$NetBSD: patch-ab,v 1.10 2009/06/04 19:23:51 tron Exp $
Deal with the kqueue(2) API differences between NetBSD and the other BSDs.
The upstream bug report is here:
http://libtorrent.rakshasa.no/ticket/1765
--- src/torrent/poll_kqueue.cc.orig 2008-05-07 13:19:13.000000000 +0100
+++ src/torrent/poll_kqueue.cc 2009-06-04 18:10:50.000000000 +0100
@@ -57,6 +57,12 @@
#ifdef USE_KQUEUE
+#ifdef __NetBSD__
+typedef uintptr_t kevent_udata_t;
+#else
+typedef void *kevent_udata_t;
+#endif
+
inline uint32_t
PollKQueue::event_mask(Event* e) {
return m_table[e->file_descriptor()];
@@ -83,7 +89,7 @@
struct kevent* itr = m_changes + (m_changedEvents++);
- EV_SET(itr, event->file_descriptor(), mask, op, 0, 0, event);
+ EV_SET(itr, event->file_descriptor(), mask, op, 0, 0, (kevent_udata_t)event);
}
PollKQueue*
@@ -146,10 +152,10 @@
// Also check current mask.
- if (itr->filter == EVFILT_READ && itr->udata != NULL && event_mask((Event*)itr->udata) & flag_read)
+ if (itr->filter == EVFILT_READ && itr->udata != (kevent_udata_t)NULL && event_mask((Event*)itr->udata) & flag_read)
((Event*)itr->udata)->event_read();
- if (itr->filter == EVFILT_WRITE && itr->udata != NULL && event_mask((Event*)itr->udata) & flag_write)
+ if (itr->filter == EVFILT_WRITE && itr->udata != (kevent_udata_t)NULL && event_mask((Event*)itr->udata) & flag_write)
((Event*)itr->udata)->event_write();
}
@@ -173,10 +179,12 @@
throw internal_error("PollKQueue::close(...) called but the file descriptor is active");
for (struct kevent *itr = m_events, *last = m_events + m_waitingEvents; itr != last; ++itr)
- if (itr->udata == event)
- itr->udata = NULL;
+ if (itr->udata == (kevent_udata_t)event)
+ itr->udata = (kevent_udata_t)NULL;
+
+ struct kevent *oitr = m_changes;
- m_changedEvents = std::remove_if(m_changes, m_changes + m_changedEvents, rak::equal(event, rak::mem_ref(&kevent::udata))) - m_changes;
+ m_changedEvents = std::remove_if(m_changes, m_changes + m_changedEvents, rak::equal((kevent_udata_t)event, rak::mem_ref(&kevent::udata))) - m_changes;
}
// Use custom defines for EPOLL* to make the below code compile with
|