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 нужно, конечно, убрать, иначе код будет падать.
21 июня 2013 07:30

Refaim (инкогнито)
21 июня 2013, 08:15

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

Евгений Степанищев (bolknote.ru)
21 июня 2013, 08:20, ответ предназначен Refaim

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

Евгений Степанищев (bolknote.ru)
21 июня 2013, 08:25

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

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)