Index: boost/asio/detail/impl/kqueue_reactor.ipp =================================================================== --- boost/asio/detail/impl/kqueue_reactor.ipp (revision 65468) +++ boost/asio/detail/impl/kqueue_reactor.ipp (working copy) @@ -26,6 +26,14 @@ #include +#ifdef __NetBSD__ +#define TO_KQUEUE_DATA(x) reinterpret_cast(x) +#define FROM_KQUEUE_DATA(x) reinterpret_cast(x) +#else +#define TO_KQUEUE_DATA(x) x +#define FROM_KQUEUE_DATA(x) x +#endif + namespace boost { namespace asio { namespace detail { @@ -130,17 +138,17 @@ { case read_op: EV_SET(&event, descriptor, EVFILT_READ, - EV_ADD | EV_ONESHOT, 0, 0, descriptor_data); + EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(descriptor_data)); break; case write_op: EV_SET(&event, descriptor, EVFILT_WRITE, - EV_ADD | EV_ONESHOT, 0, 0, descriptor_data); + EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(descriptor_data)); break; case except_op: if (!descriptor_data->op_queue_[read_op].empty()) return; // Already registered for read events. EV_SET(&event, descriptor, EVFILT_READ, - EV_ADD | EV_ONESHOT, EV_OOBAND, 0, descriptor_data); + EV_ADD | EV_ONESHOT, EV_OOBAND, 0, TO_KQUEUE_DATA(descriptor_data)); break; } @@ -234,7 +242,7 @@ for (int i = 0; i < num_events; ++i) { int descriptor = events[i].ident; - void* ptr = events[i].udata; + void* ptr = FROM_KQUEUE_DATA(events[i].udata); if (ptr == &interrupter_) { // No need to reset the interrupter since we're leaving the descriptor @@ -247,7 +255,7 @@ // Exception operations must be processed first to ensure that any // out-of-band data is read before normal data. - static const int filter[max_ops] = + static const unsigned int filter[max_ops] = { EVFILT_READ, EVFILT_WRITE, EVFILT_READ }; for (int j = max_ops - 1; j >= 0; --j) { @@ -283,16 +291,16 @@ case EVFILT_READ: if (!descriptor_data->op_queue_[read_op].empty()) EV_SET(&event, descriptor, EVFILT_READ, - EV_ADD | EV_ONESHOT, 0, 0, descriptor_data); + EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(descriptor_data)); else if (!descriptor_data->op_queue_[except_op].empty()) EV_SET(&event, descriptor, EVFILT_READ, - EV_ADD | EV_ONESHOT, EV_OOBAND, 0, descriptor_data); + EV_ADD | EV_ONESHOT, EV_OOBAND, 0, TO_KQUEUE_DATA(descriptor_data)); else continue; case EVFILT_WRITE: if (!descriptor_data->op_queue_[write_op].empty()) EV_SET(&event, descriptor, EVFILT_WRITE, - EV_ADD | EV_ONESHOT, 0, 0, descriptor_data); + EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(descriptor_data)); else continue; default: @@ -323,7 +331,7 @@ { struct kevent event; EV_SET(&event, interrupter_.read_descriptor(), - EVFILT_READ, EV_ADD | EV_ONESHOT, 0, 0, &interrupter_); + EVFILT_READ, EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(&interrupter_)); ::kevent(kqueue_fd_, &event, 1, 0, 0, 0); }