LINUX.ORG.RU

Новая версия библиотеки plibsys 0.0.4

 , , , ,


3

6

Вышла новая версия библиотеки plibsys 0.0.4. plibsys - это системная библиотека, написанная на С, и портированная на большое количество систем и компиляторов. Библиотека обеспечивает работу с потоками, межпроцессное взаимодействие, сокеты и много чего полезного. Так как ранее она уже была представлена здесь сообществу, то подробное описание можно прочитать из соответствующей новости.

Во-первых, хочется выразить благодарность ЛОРу за конструктивную критику и пожелания. Это помогает переосмысливать некоторые вещи. Во-вторых, спасибо тем, кто создал пакеты под разные системы и дистрибутивы, помог с распространением. И спасибо тем, кто помогал в некоторых моментах с тестированием (особенно на ПК «Эльбрус»).

Теперь к изменениям в новой версии. Возможно, некоторые из изменений уже были отражены в прошлой новости частично, но я дам полный список для простоты.

Общие изменения:

  • Переход на лицензию MIT с LGPLv2+
  • Вместо тестов на Boost теперь используется собственный мини-фреймворк
  • Методы API помечаются атрибутами видимости (visibility)
  • Добавлен пакет под Debian
  • Добавлен пакет под ALT Linux (система сборки gear)
  • Добавлен пакет под Conan
  • Документация генерируется опционально

Новые платформы и компиляторы:

  • BlackBerry 10 (AArch32, x86)
  • Cray Linux Environment
  • AmigaOS 4.1 (PPC)
  • Android (x86, x64, AArch32, AArch64)
  • iOS, tvOS, watchOS (x86, x64, AArch32, AArch64)
  • PGI (x64) под macOS

Новые API:

  • Макросы для переменных аргументов

Интеграция с AppVeyor:

  • Добавлены сборки под Visual Studio 2017
  • Добавлены сборки тестов с компилятором Watcom

Интеграция с Travis:

  • Добавлены сборки GCC 7.x
  • Добавлены сборки Clang 4.0 и 5.0
  • Добавлены сборки MinGW 7.1.x (x64)
  • Обновлены сборки MinGW 6.3.x (x64)
  • Добавлены сборки Xcode 8.3 и 9.1

Другие правки:

  • Устаревший вызов readdir_r() не используется с glibc >= 2.24
  • Для хеша ГОСТ Р 34.11 используется S-box от КриптоПро
  • Семафор POSIX корректно инициализируется в режиме создания
  • Используется более корректное значение SONAME

Библиотека доступна также в менеджере пакетов vcpkg от Microsoft.

Документация

>>> Репозиторий на GitHub

Хорошая вещь по ходу. Главное не превращайте в слишком громоздкий комбайн (не слишком больше всяких boost) и пишите качественную документацию (очень важно для серьёзного проекта нехипстерского).

Deleted ()

А почему такая скромная нумерация версий? Пользоваться то уже можно?

Crocodoom ★★ ()
Ответ на: комментарий от Crocodoom

А почему такая скромная нумерация версий? Пользоваться то уже можно?

Нумерация скромная, потому что только несколько «официальных» релизов было, до этого просто разработка велась своим ходом. В следующий раз планирую увеличить версию. Пользоваться можно, на все есть юнит-тесты и они прогоняются на большом количестве систем и компиляторов. Есть автоматизация CI с AppVeyor и Travis.

HardCode ()
Ответ на: комментарий от Deleted

Главное не превращайте в слишком громоздкий комбайн (не слишком больше всяких boost) и пишите качественную документацию (очень важно для серьёзного проекта нехипстерского).

Спасибо! Планов превращать в громоздкую либу нет, потому что таких уже итак полно, от glib и poco до самой Qt. Основное назначение - системные задачи. Если надо делать более прикладные вещи, то стоит смотреть в сторону специализированных решений.

HardCode ()
P_LIB_API void 	p_libsys_init_full (const PMemVTable *vtable)
 	Initializes library resources along with the memory table.

👍 Библиотека начинается с правильных вещей.

P_LIB_API double 	p_strtod (const pchar *str)
 	Converts a string to double without a locale dependency.

...и продолжается ими же!

Уже самое начало документации внушает оптимизм.

devzero ()
Ответ на: комментарий от devzero

Спасибо! Да, в свое время словили проблему с конвертацией atof() и локалью. После это перестали использовать atof().

HardCode ()
Ответ на: комментарий от HardCode

Нет ли планов добавить в библиотеку средства для арифметически-безопасных вычислений, такие как integer with NaN? Чтобы было понятно, о чем речь, покажу пример из своих самописных запасов:

typedef uint32_t u32nan_t;
#define U32NAN_MIN 0
#define U32NAN_MAX (UINT32_MAX - 1)
#define U32NAN_NAN UINT32_MAX

Q_INLINE int u32nan_isnan(u32nan_t x)
{
    return x == U32NAN_NAN;
}

Q_INLINE u32nan_t u32nan_add(u32nan_t x, u32nan_t y)
{
    u32nan_t res = x + y;
    res |= -(res < x);
    return res;
}

Q_INLINE u32nan_t u32nan_sub(u32nan_t x, u32nan_t y)
{
    u32nan_t res = x - y;
    res |= -(u32nan_isnan(x) | u32nan_isnan(y) | (res > x));
    return res;
}
void test_to_nan(void)
{
    TEST_CHECK(
        !u32nan_isnan(U32NAN_FROM(0)));
    TEST_CHECK(
        !u32nan_isnan(U32NAN_FROM(1)));
    TEST_CHECK(
        u32nan_isnan(U32NAN_FROM(-1)));
    TEST_CHECK(
        u32nan_isnan(U32NAN_FROM(UINT32_MAX)));

    TEST_CHECK(
        !u32nan_isnan(U32NAN_FROM(0.0)));
    TEST_CHECK(
        !u32nan_isnan(U32NAN_FROM(1.0)));
    TEST_CHECK(
        u32nan_isnan(U32NAN_FROM(-1.0)));
    TEST_CHECK(
        u32nan_isnan(U32NAN_FROM(UINT32_MAX * 2.0)));
    TEST_CHECK(
        u32nan_isnan(U32NAN_FROM(UINT32_MAX * -2.0)));
}

void test_add(void)
{
    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_add(
            U32NAN_NAN,
            U32NAN_NAN
        )
    );

    TEST_CHECK(
        U32NAN_FROM(223) ==
        u32nan_add(
            U32NAN_FROM(100),
            U32NAN_FROM(123)
        )
    );

    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_add(
            U32NAN_FROM(0),
            U32NAN_FROM(-1)
        )
    );

    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_add(
            U32NAN_FROM(-1),
            U32NAN_FROM(-1)
        )
    );

    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_add(
            U32NAN_FROM(U32NAN_MAX),
            U32NAN_FROM(U32NAN_MAX)
        )
    );

    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_add(
            U32NAN_FROM(U32NAN_MAX),
            U32NAN_FROM(1)
        )
    );

    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_add(
            U32NAN_FROM(UINT32_MAX),
            U32NAN_FROM(UINT32_MAX)
        )
    );

    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_add(
            U32NAN_FROM(0.0),
            U32NAN_FROM(10000000000.0)
        )
    );

}

void test_sub(void)
{
    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_sub(
            U32NAN_NAN,
            U32NAN_NAN
        )
    );


    TEST_CHECK(
        U32NAN_FROM(100) ==
        u32nan_sub(
            U32NAN_FROM(223),
            U32NAN_FROM(123)
        )
    );

    TEST_CHECK(
        1000 ==
        u32nan_sub(
            U32NAN_FROM(5500.0),
            U32NAN_FROM(4500.0)
        )
    );

    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_sub(
            U32NAN_FROM(0),
            U32NAN_FROM(-1)
        )
    );

    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_sub(
            U32NAN_FROM(12),
            U32NAN_FROM(20)
        )
    );

    TEST_CHECK(
        0 ==
        u32nan_sub(
            U32NAN_FROM(U32NAN_MAX),
            U32NAN_FROM(U32NAN_MAX)
        )
    );

    TEST_CHECK(
        U32NAN_FROM(U32NAN_MAX - 1) ==
        u32nan_sub(
            U32NAN_FROM(U32NAN_MAX),
            U32NAN_FROM(1)
        )
    );

    TEST_CHECK(
        U32NAN_NAN ==
        u32nan_sub(
            U32NAN_FROM(UINT32_MAX),
            U32NAN_FROM(UINT32_MAX)
        )
    );

}

Я бы мог поработать над соответствующим пулл-реквестом, если такие функции лежат в русле развития plibsys.

devzero ()

Кстати, насчёт сравнений с glib из предыдущей новости.

Давно чешутся руки сделать библиотеку, в которой есть всё нужное из glib + есть нормальная модульность, чтобы это можно было собирать статикой и засовывать во всякий embedded, не получая на выходе 100500 килобайт всякой херни.

Я, впрочем, не одинок в таких желаниях. Например: http://www.fefe.de/libowfat/ , https://skarnet.org/software/skalibs/

devzero ()

Добавлены сборки тестов с компилятором Watcom

Ватком жив ?

kto_tama ★★★★★ ()
Ответ на: комментарий от devzero

P_LIB_API double p_strtod (const pchar *str)
Converts a string to double without a locale dependency.

The decimal point is '.' as in the 'C' locale.

Нинужно, закапывайте.

anonymous ()
Ответ на: комментарий от devzero

Если вы оформите модуль с полным набором арифметики (плюс, минус, умножить, разделить, и т.д., что там обычно используется) под все типы (uint8, uint16, uint32, uint64), с документацией и тестами - то, конечно, можно включить в библиотеку.

HardCode ()
Ответ на: комментарий от HardCode

в свое время словили проблему с конвертацией atof() и локалью.

На которую, конечно же был заведён баг разработчикам?

Или же нет? И лёгким движением руки проблема с «конвертацией atof() и локалью» превращается в проблему незнания разработчиком самых азов и принципиального игнорирования манов?

LamerOk ★★★★★ ()
Последнее исправление: LamerOk (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.