Ticket #4662: netbsd_kqueue_reactor.diff

File netbsd_kqueue_reactor.diff, 3.2 KB (added by Degroote <degroote@…>, 12 years ago)
  • boost/asio/detail/impl/kqueue_reactor.ipp

     
    2626
    2727#include <boost/asio/detail/push_options.hpp>
    2828
     29#ifdef __NetBSD__
     30#define TO_KQUEUE_DATA(x) reinterpret_cast<intptr_t>(x)
     31#define FROM_KQUEUE_DATA(x) reinterpret_cast<void*>(x)
     32#else
     33#define TO_KQUEUE_DATA(x) x
     34#define FROM_KQUEUE_DATA(x) x
     35#endif
     36
    2937namespace boost {
    3038namespace asio {
    3139namespace detail {
     
    130138    {
    131139    case read_op:
    132140      EV_SET(&event, descriptor, EVFILT_READ,
    133           EV_ADD | EV_ONESHOT, 0, 0, descriptor_data);
     141          EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(descriptor_data));
    134142      break;
    135143    case write_op:
    136144      EV_SET(&event, descriptor, EVFILT_WRITE,
    137           EV_ADD | EV_ONESHOT, 0, 0, descriptor_data);
     145          EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(descriptor_data));
    138146      break;
    139147    case except_op:
    140148      if (!descriptor_data->op_queue_[read_op].empty())
    141149        return; // Already registered for read events.
    142150      EV_SET(&event, descriptor, EVFILT_READ,
    143           EV_ADD | EV_ONESHOT, EV_OOBAND, 0, descriptor_data);
     151          EV_ADD | EV_ONESHOT, EV_OOBAND, 0, TO_KQUEUE_DATA(descriptor_data));
    144152      break;
    145153    }
    146154
     
    234242  for (int i = 0; i < num_events; ++i)
    235243  {
    236244    int descriptor = events[i].ident;
    237     void* ptr = events[i].udata;
     245    void* ptr = FROM_KQUEUE_DATA(events[i].udata);
    238246    if (ptr == &interrupter_)
    239247    {
    240248      // No need to reset the interrupter since we're leaving the descriptor
     
    247255
    248256      // Exception operations must be processed first to ensure that any
    249257      // out-of-band data is read before normal data.
    250       static const int filter[max_ops] =
     258      static const unsigned int filter[max_ops] =
    251259        { EVFILT_READ, EVFILT_WRITE, EVFILT_READ };
    252260      for (int j = max_ops - 1; j >= 0; --j)
    253261      {
     
    283291      case EVFILT_READ:
    284292        if (!descriptor_data->op_queue_[read_op].empty())
    285293          EV_SET(&event, descriptor, EVFILT_READ,
    286               EV_ADD | EV_ONESHOT, 0, 0, descriptor_data);
     294              EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(descriptor_data));
    287295        else if (!descriptor_data->op_queue_[except_op].empty())
    288296          EV_SET(&event, descriptor, EVFILT_READ,
    289               EV_ADD | EV_ONESHOT, EV_OOBAND, 0, descriptor_data);
     297              EV_ADD | EV_ONESHOT, EV_OOBAND, 0, TO_KQUEUE_DATA(descriptor_data));
    290298        else
    291299          continue;
    292300      case EVFILT_WRITE:
    293301        if (!descriptor_data->op_queue_[write_op].empty())
    294302          EV_SET(&event, descriptor, EVFILT_WRITE,
    295               EV_ADD | EV_ONESHOT, 0, 0, descriptor_data);
     303              EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(descriptor_data));
    296304        else
    297305          continue;
    298306      default:
     
    323331{
    324332  struct kevent event;
    325333  EV_SET(&event, interrupter_.read_descriptor(),
    326       EVFILT_READ, EV_ADD | EV_ONESHOT, 0, 0, &interrupter_);
     334      EVFILT_READ, EV_ADD | EV_ONESHOT, 0, 0, TO_KQUEUE_DATA(&interrupter_));
    327335  ::kevent(kqueue_fd_, &event, 1, 0, 0, 0);
    328336}
    329337