summaryrefslogtreecommitdiff
path: root/net/libtorrent/patches/patch-ab
blob: 2be27b07b6677a9e470cbff882b609084de7117e (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
$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