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 нужно, конечно, убрать, иначе код будет падать.
А зачем дважды кастовать?
Комментарий для Refaim:
Так я показываю, что это не… как бы сказать,… не аналог преобразования совместимых классов в других языках, а просто я это место памяти использую иначе.
Надо, наверное, пояснить, что на вход этих функций попадает специальная довольно сложная структура CRITICAL_SECTION, которую Виндоуз использует, а pthread_mutex_t — структура попроще, я просто размещаю её в том месте памяти, которое выделено для CRITICAL_SECTION, она должна помещаться без проблем.
Но это не значит, что эти структуры взаимозаменяемые, я просто использую тот же клочок памяти под другие данные. Вот на это я хотел указать, кастуя сначала в нетипизированный указатель.