| 251 | } |
| 252 | |
| 253 | int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt) |
| 254 | { |
| 255 | ceph_assert(in_thread()); |
| 256 | int r = 0; |
| 257 | if (fd >= nevent) { |
| 258 | int new_size = nevent << 2; |
| 259 | while (fd >= new_size) |
| 260 | new_size <<= 2; |
| 261 | ldout(cct, 20) << __func__ << " event count exceed " << nevent << ", expand to " << new_size << dendl; |
| 262 | r = driver->resize_events(new_size); |
| 263 | if (r < 0) { |
| 264 | lderr(cct) << __func__ << " event count is exceed." << dendl; |
| 265 | return -ERANGE; |
| 266 | } |
| 267 | file_events.resize(new_size); |
| 268 | nevent = new_size; |
| 269 | } |
| 270 | |
| 271 | EventCenter::FileEvent *event = _get_file_event(fd); |
| 272 | ldout(cct, 20) << __func__ << " create event started fd=" << fd << " mask=" << mask |
| 273 | << " original mask is " << event->mask << dendl; |
| 274 | if (event->mask == mask) |
| 275 | return 0; |
| 276 | |
| 277 | r = driver->add_event(fd, event->mask, mask); |
| 278 | if (r < 0) { |
| 279 | // Actually we don't allow any failed error code, caller doesn't prepare to |
| 280 | // handle error status. So now we need to assert failure here. In practice, |
| 281 | // add_event shouldn't report error, otherwise it must be a innermost bug! |
| 282 | lderr(cct) << __func__ << " add event failed, ret=" << r << " fd=" << fd |
| 283 | << " mask=" << mask << " original mask is " << event->mask << dendl; |
| 284 | ceph_abort_msg("BUG!"); |
| 285 | return r; |
| 286 | } |
| 287 | |
| 288 | event->mask |= mask; |
| 289 | if (mask & EVENT_READABLE) { |
| 290 | event->read_cb = ctxt; |
| 291 | } |
| 292 | if (mask & EVENT_WRITABLE) { |
| 293 | event->write_cb = ctxt; |
| 294 | } |
| 295 | ldout(cct, 20) << __func__ << " create event end fd=" << fd << " mask=" << mask |
| 296 | << " current mask is " << event->mask << dendl; |
| 297 | return 0; |
| 298 | } |
| 299 | |
| 300 | void EventCenter::delete_file_event(int fd, int mask) |
| 301 | { |