Ticket #4662: netbsd_kqueue_reactor.diff
File netbsd_kqueue_reactor.diff, 3.2 KB (added by , 12 years ago) |
---|
-
boost/asio/detail/impl/kqueue_reactor.ipp
26 26 27 27 #include <boost/asio/detail/push_options.hpp> 28 28 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 29 37 namespace boost { 30 38 namespace asio { 31 39 namespace detail { … … 130 138 { 131 139 case read_op: 132 140 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)); 134 142 break; 135 143 case write_op: 136 144 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)); 138 146 break; 139 147 case except_op: 140 148 if (!descriptor_data->op_queue_[read_op].empty()) 141 149 return; // Already registered for read events. 142 150 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)); 144 152 break; 145 153 } 146 154 … … 234 242 for (int i = 0; i < num_events; ++i) 235 243 { 236 244 int descriptor = events[i].ident; 237 void* ptr = events[i].udata;245 void* ptr = FROM_KQUEUE_DATA(events[i].udata); 238 246 if (ptr == &interrupter_) 239 247 { 240 248 // No need to reset the interrupter since we're leaving the descriptor … … 247 255 248 256 // Exception operations must be processed first to ensure that any 249 257 // out-of-band data is read before normal data. 250 static const int filter[max_ops] =258 static const unsigned int filter[max_ops] = 251 259 { EVFILT_READ, EVFILT_WRITE, EVFILT_READ }; 252 260 for (int j = max_ops - 1; j >= 0; --j) 253 261 { … … 283 291 case EVFILT_READ: 284 292 if (!descriptor_data->op_queue_[read_op].empty()) 285 293 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)); 287 295 else if (!descriptor_data->op_queue_[except_op].empty()) 288 296 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)); 290 298 else 291 299 continue; 292 300 case EVFILT_WRITE: 293 301 if (!descriptor_data->op_queue_[write_op].empty()) 294 302 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)); 296 304 else 297 305 continue; 298 306 default: … … 323 331 { 324 332 struct kevent event; 325 333 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_)); 327 335 ::kevent(kqueue_fd_, &event, 1, 0, 0, 0); 328 336 } 329 337