Пишу, по большей части, про историю, свою жизнь и немного про программирование.

ReactOS/Windows *CriticalSection API → Linux

Вчера портировал часть «РеактОС» под Линукс, пришлось разобраться что делает небольшой фрагмент АПИ Виндоуз («РеактОС» — это операционная система, совместима с Виндоуз).

Функции оказались небольшими, но вдруг кому-то время сэкономит:

#include <pthread.h>

inline void InitializeCriticalSection(CRITICAL_SECTION *cs)
{
    pthread_mutexattr_t mAttr;
    pthread_mutexattr_settype(&mAttr, PTHREAD_MUTEX_RECURSIVE_NP);
    pthread_mutex_init((pthread_mutex_t *) (void *) cs, &mAttr);
    pthread_mutexattr_destroy(&mAttr);
}

inline void DeleteCriticalSection(CRITICAL_SECTION *cs)
{
    pthread_mutex_destroy((pthread_mutex_t *) (void *) cs);
}

inline void EnterCriticalSection(CRITICAL_SECTION *cs)
{
    pthread_mutex_lock ((pthread_mutex_t *) (void *) cs);
}

inline void LeaveCriticalSection(CRITICAL_SECTION *cs)
{
    pthread_mutex_unlock ((pthread_mutex_t *) (void *) cs);
}

После этого все другие обращения к структуре CRITICAL_SECTION нужно, конечно, убрать, иначе код будет падать.

3 комментария
Refaim 2013

А зачем дважды кастовать?

Евгений Степанищев (bolknote.ru) 2013

Комментарий для Refaim:

Так я показываю, что это не… как бы сказать,… не аналог преобразования совместимых классов в других языках, а просто я это место памяти использую иначе.

Евгений Степанищев (bolknote.ru) 2013

Надо, наверное, пояснить, что на вход этих функций попадает специальная довольно сложная структура CRITICAL_SECTION, которую Виндоуз использует, а pthread_mutex_t — структура попроще, я просто размещаю её в том месте памяти, которое выделено для CRITICAL_SECTION, она должна помещаться без проблем.

Но это не значит, что эти структуры взаимозаменяемые, я просто использую тот же клочок памяти под другие данные. Вот на это я хотел указать, кастуя сначала в нетипизированный указатель.