Исходное значение Linux eventfd и его использование в блокируемом замке - PullRequest
2 голосов
/ 17 сентября 2011

Вопрос

eventfd() - это новый системный вызов, доступный в Linux с 2.6.22. Подпись звонка

int eventfd(unsigned int initval, int flags);

Я использую этот вызов при создании нового светового меча Lock класса, который можно использовать в цикле опроса.

Объект Python Lock запускается в разблокированном состоянии. Мое использование eventfd требует, чтобы начальное значение было ненулевым. Если внутренне значение равно uint64_t,

Объект содержит 64-битное целое число без знака (uint64_t), которое поддерживается ядро.

почему аргумент начального значения типа unsigned int?

Подробная информация

Если я использую ненулевые значения в качестве разблокированного состояния Lock, выпуски выполняются в письменной форме. Несколько выпусков без промежуточных приобретений ошибочны и требуют сбоя. Это требует сбоя записи, когда объект события содержит ненулевое значение. В режиме по умолчанию объект события будет добавлять значения, отправленные в него, до (uint64_t)0xfffffffffffffffe, прежде чем блокировать вызовы записи. Чтобы обнаружить эту ситуацию, я сделаю неблокирующую запись, которая выдвигает значение выше этого максимума, вызывая это обстоятельство:

Если добавление вызовет счетчик значение, превышающее максимальное значение, затем write (2) либо блокирует пока чтение (2) не будет выполнено для файлового дескриптора или не завершится неудачно с ошибкой EAGAIN, если дескриптор файла был сделан не блокировки.

1 Ответ

1 голос
/ 17 сентября 2011

Если я вас правильно понимаю, вы хотите, чтобы состояние этого зверя менялось от 0 до UINT64_MAX-1?

Тип начального значения, вероятно, существует только по историческим причинам. Как только такой интерфейс используется, он залипает, и потом его трудно изменить.

Если вам нужно, чтобы значение было изначально UINT64_MAX-1, почему бы просто не вызвать eventfd с аргументом 0 и сразу же выполнить write с UINT64_MAX-1, прежде чем передавать файловый дескриптор кому-либо еще:

int ev = eventfd(0, 0);
write(ev, &(uint64_t const){ UINT64_MAX-1 }, sizeof(uint64_t));

(хорошо, вы добавите код проверки ошибок, не так ли)

...