Подробности

[В начало]

Проблема в стандарте № 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

[В начало]