int EventCenter::create_file_event(int fd, int mask, EventCallbackRef ctxt)
{
int r = 0;
- std::lock_guard<std::mutex> l(file_lock);
if (fd >= nevent) {
int new_size = nevent << 2;
while (fd > new_size)
void EventCenter::delete_file_event(int fd, int mask)
{
assert(fd >= 0);
- std::lock_guard<std::mutex> l(file_lock);
if (fd >= nevent) {
ldout(cct, 1) << __func__ << " delete event fd=" << fd << " is equal or greater than nevent=" << nevent
<< "mask=" << mask << dendl;
ldout(cct, 10) << __func__ << " wait second " << tv.tv_sec << " usec " << tv.tv_usec << dendl;
vector<FiredFileEvent> fired_events;
numevents = driver->event_wait(fired_events, &tv);
- file_lock.lock();
for (int j = 0; j < numevents; j++) {
int rfired = 0;
FileEvent *event;
EventCallbackRef cb;
event = _get_file_event(fired_events[j].fd);
- // FIXME: Actually we need to pick up some ways to reduce potential
- // file_lock contention here.
/* note the event->mask & mask & ... code: maybe an already processed
* event removed an element that fired and we still didn't
* processed, so we check if the event is still valid. */
if (event->mask & fired_events[j].mask & EVENT_READABLE) {
rfired = 1;
cb = event->read_cb;
- file_lock.unlock();
cb->do_request(fired_events[j].fd);
- file_lock.lock();
}
if (event->mask & fired_events[j].mask & EVENT_WRITABLE) {
if (!rfired || event->read_cb != event->write_cb) {
cb = event->write_cb;
- file_lock.unlock();
cb->do_request(fired_events[j].fd);
- file_lock.lock();
}
}
ldout(cct, 20) << __func__ << " event_wq process is " << fired_events[j].fd << " mask is " << fired_events[j].mask << dendl;
}
- file_lock.unlock();
if (trigger_time)
numevents += process_time_events();
int nevent;
// Used only to external event
pthread_t owner;
- std::mutex external_lock, file_lock;;
+ std::mutex external_lock;
std::atomic_ulong external_num_events;
deque<EventCallbackRef> external_events;
vector<FileEvent> file_events;