Повторный вызов event_add для одного и того же дескриптора файла с одним и тем же тайм-аутом

Если я сделаю следующее

  1. вызвать event_add для определенного файлового дескриптора fd1 и тайм-аута t1 = 5 секунд
  2. через 1 секунду, не дожидаясь какого-либо события, я снова вызываю event_add для f1 и t1 = 5 секунд.

Отменит ли второй вызов event_add предыдущий вызов? то есть, если событие не произойдет, произойдет ли тайм-аут теперь через 6 секунд вместо 5 секунд? Или у нас будет 2 тайм-аута - один на 5 и другой на 6 секунд

Отличается ли это поведение между версиями libevent 1 и 2? Я не нашел никакой документации, относящейся к этому. Я не могу понять это из чтения кода. Я, конечно, могу написать программу для проверки этого, но поскольку программа должна работать на разных платформах, было бы лучше, если бы была конкретная документация, описывающая поведение в этих условиях.


person doon    schedule 01.09.2013    source источник


Ответы (1)


Цитата из официальной документации (Создание событий как ожидающих и неотложенных раздел):

Если вы вызовете event_add() для события, которое уже находится в ожидании, оно оставит его в ожидании и перепланирует его с заданным тайм-аутом.

Таким образом, вы можете ожидать, что событие сработает по тайм-ауту через 6 секунд. Конечно, любое событие, происходящее в структуре события (например, если оно связано с файловым дескриптором) между двумя вызовами event_add(), также сбросит таймер.


Однако, дополнив ответ незаданным советом, обратите внимание на следующую часть:

Если событие уже ожидается и вы повторно добавляете его с тайм-аутом NULL, event_add() не будет иметь никакого эффекта.

Таким образом, если вы хотите удалить тайм-аут для существующего события, вы можете выбрать между:

  1. Использование event_add() напрямую с тайм-аутом, отличным от NULL, установленным на {0, 0}
  2. Удаление/добавление события с event_del()/event_add(), на этот раз установив время ожидания NULL

Я бы рекомендовал последнее.

person Bernard Rosset    schedule 03.09.2014