Обработка ошибок в sem_wait и shmget: в relibc заработал потоковый модуль Python

05.06.2026

В relibc исправлена обработка ошибок в sem_trywait, sem_clockwait и sem_wait. Из-за ошибок в ней не работал потоковый модуль Python; заодно добавлена проверка переполнения размера в shmget.

Что было не так

Семафор — это примитив синхронизации со счётчиком: поток может либо уменьшить счётчик и продолжить, либо уснуть до освобождения. Функции семейства sem_* сообщают о результате через код возврата, и этот код должен разбираться правильно.

Ошибка в разборе кода возврата ломала не тонкий случай, а самый обычный: потоки в Python использовали семафоры для блокировок, и модуль потоков оказывался нерабочим на Redox. Признак — исключение при работе с потоками, а не при сборке.

Что ещё поправили в том же духе

В shmget добавлена проверка переполнения размера. Размер разделяемого сегмента — это число, которое складывается из длины и флага; если переноса не проверяли, при неудачных значениях можно было получить не тот размер, который запросили. Теперь на переполнение возвращается EINVAL.

Почему это важно за пределами Redox

Код, который работает с семафорами и разделяемой памятью через libc, на Redox встречается часто — это ровно то, на чём держатся потоки и межпроцессное взаимодействие. Ошибки обработки здесь проявляются как «программа падает при многопоточности», и поиск уводит в сторону приложения, а не в libc.

Оригинал

Коммиты Fix sem_trywait and sem_wait error handling от 5 июня и fix: shmget: return EINVAL on size overflow от 8 июня 2026 года в репозитории redox-os/relibc

Упоминаний: 1 · Просмотров: 3