Подробности
[В начало]
Проблема в стандарте № S0398
Краткое описание
Несоответствие определения констант, определяющих тип мьютекса, в LSB 3.1 и в glibc-2.3.4.
Подробное описание
Тесты OLVER, скомпилированные с использованием LSB Software Development Kit (SDK) на RHEL 4 Update 2 (glibc-2.3.4) , обнаружили проблему, которая проявляется при работе следующего кода:
int code;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
code = pthread_mutex_trylock(&mutex);
code = pthread_mutex_trylock(&mutex);
code = pthread_mutex_unlock(&mutex);
code = pthread_mutex_destroy(&mutex);
Второй вызов функции pthread_mutex_trylock должен возвращать EBUSY (как для PTHREAD_MUTEX_DEFAULT), а возвращает 0 (как для PTHREAD_MUTEX_ RECURSIVE).
Проблема возникает из-за того, что в LSB 3.1. в pthread.h константы, обозначающие тип мьютекса, определены следующим образом:
#define PTHREAD_MUTEX_DEFAULT 1
#define PTHREAD_MUTEX_NORMAL 1
#define PTHREAD_MUTEX_RECURSIVE 2
#define PTHREAD_MUTEX_ERRORCHECK 3
В то время как в glibc 2.3.4 в pthread.h эти константы определяются так:
enum
{
PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_ADAPTIVE_NP
PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
};
В результате константы, обозначающие тип мьютекса, имеют следующие значения:
PTHREAD_MUTEX_NORMAL = 0, PTHREAD_MUTEX_RECURSIVE = 1, PTHREAD_MUTEX_ERRORCHECK = 2, PTHREAD_MUTEX_DEFAULT = 0, что не соответствует значениям этих констант, определяемым в LSB 3.1.
Раздел стандарта
Linux Standard Base Core Specification 3.1, Chapter 13. Base Libraries, 13.10. Data Definitions for libpthread, 13.10.1. pthread.h.<br> LSB Software Development Kit (SDK).
Возможные последствия
Некорректная работа приложений, соответствующих POSIX, скомпилированных с использованием LSB Software Development Kit (SDK).
Принято
LSB Bugzilla, 1432
Статус
Исправлена в LSB 3.1 Update 1
[В начало]