| Предыдущий | Следующий |
| STATUS_MUTANT_NOT_OWNED | STATUS_PORT_ALREADY_SET |
STATUS_SEMAPHORE_LIMIT_EXCEEDED
Счётчик семафора превысил бы максимальное значение
Семафор хранит текущий счётчик между нулём и фиксированным максимумом. Успешные ожидания уменьшают счётчик; ReleaseSemaphore увеличивает его. Этот статус означает, что запрошенное увеличение при освобождении превысило бы максимум, что обычно указывает на несопоставленное освобождение или неправильный учёт единиц ресурса.
Запишите максимум семафора, величину освобождения и предыдущий счётчик, если API его предоставляет. Повтор не исправит инвариант, пока счётчик не изменится. Ищите пути очистки, освобождающие ресурс после неудачного захвата, дублирующиеся обратные вызовы завершения или код, освобождающий больше единиц, чем было получено. Не увеличивайте максимум только для сокрытия ошибки учёта, если модель ёмкости действительно не изменилась.
Что проверить
- Сопоставляйте каждой полученной единице семафора ровно один путь освобождения.
- Записывайте величину освобождения и предыдущее значение счётчика около ошибок.
- Проверьте очистку отмены и ошибок на освобождения, выполняющиеся без успешного ожидания.
Ссылки
- Microsoft: объекты семафоров
- Microsoft: ReleaseSemaphore
- Открытые спецификации Microsoft: значения NTSTATUS
Нужно найти другой код? Найти другой код состояния или ошибки.
