LINUX.ORG.RU

plibsys — кросс-платформенная системная библиотека на C

 , , ,


10

7

Недавно ко мне обратились с вопросом, не хочу ли я написать новость об одной из разрабатываемых библиотек (plibsys). В принципе, я не против, поэтому эксклюзивно для LOR.

Что такое plibsys?

plibsys — это кросс-платформенная системная библиотека, написанная на чистом C. Основной упор был изначально сделан на портируемость и поддержку широкого спектра компиляторов. Для достижения этих целей у библиотеки отсутствуют (небольшим исключением является SCO OpenServer 5 ввиду отсутствия на ней потоков) какие-либо зависимости — используются только те вызовы, которые доступны в целевой ОС. Также никакого ассемблера и использования прочих недокументированных возможностей. Для сборки нужен только рабочий компилятор и CMake.

Изначально библиотека писалась для запуска потоков и работы с сокетами, но постепенно функционал расширялся по мере необходимости. На данный момент есть следующий функционал:

  • Платформо-независимые типы данных
  • Потоки и средства синхронизации: мьютексы, условные переменные, блокировки чтения-записи, спинлоки, атомарные операции
  • Межпроцессное взаимодействие: семафоры, разделяемая память, кольцевой буфер
  • Сокеты (UDP, TCP) с поддержкой IPv4 и IPv6
  • Хэш-функции: MD5, SHA-1, SHA-2, SHA-3, GOST (R 34.11-94)
  • Бинарные деревья: несбалансированное, красно-черное, АВЛ
  • Загрузка разделяемых библиотек
  • Работа с памятью: mmap, установка собственного аллокатора
  • Замер времени исполнения (по возможности — в высоком разрешении)
  • Базовая работа с файлами и директориями
  • Парсер файлов INI
  • Макросы для определения архитектуры ЦПУ, ОС и компилятора
  • Различные вспомогательные структуры данных типа связанного списка, хэш-таблицы, обработка строк

На все есть документация.

Поддерживаемые платформы и компиляторы

Абсолютно все модули покрыты Unit-тестами. Есть интеграция с CI (Travis, AppVeyor), где прогоняется большое число разнообразных конфигураций. Также для улучшения качества кода и снижения числа ошибок используется сервис статического анализа кода Coverity. Для оценки покрытия тестами используется Codecov.

На данный момент поддерживаются следующие платформы:

  • GNU/Linux
  • macOS
  • Windows, Cygwin, MSYS
  • FreeBSD, NetBSD, OpenBSD, DragonFlyBSD
  • Solaris
  • AIX
  • HP-UX
  • Tru64
  • OpenVMS
  • OS/2
  • IRIX
  • QNX Neutrino, BlackBerry 10
  • UnixWare 7
  • SCO OpenServer 5
  • Haiku
  • Syllable
  • BeOS

Также работоспособность библиотеки проверена на следующих компиляторах и архитектурах:

  • MSVC (x86, x64) 2003 и выше
  • MinGW (x86, x64)
  • Open Watcom (x86)
  • Borland (x86)
  • GCC (x86, x64, PPC32be, PPC64be/le, IA-64/32, IA-64, Alpha, HPPA2.0-32, MIPS32, AArch32, SPARCv9)
  • Clang (x86, x64, PPC32be)
  • Intel (x86, x64)
  • QCC (x86, AArch32)
  • Oracle Solaris Studio (x86, x64, SPARCv9)
  • MIPSpro (MIPS32)
  • XL C (PPC64le)
  • DEC C (Alpha)
  • PGI (x86, x64)
  • Cray (x64)

Особенности работы библиотеки, сборки и тестирования на разных платформах с разными компиляторами подробно рассмотрены в Wiki.

Что дальше?

Библиотека по-тихоньку продолжает развиваться, хотя, к сожалению, свободного времени не так много. Например, недавно была добавлена поддержка для систем Cray.

Планирую сделать родной пакет для Debian. В общем-то, он готов, надо только протестировать. В связи с этим, если кто-то сможет выступить в качестве поручителя (он же sponsor в терминологии Debian) для проверки и заливки пакета — буду рад.

Если у кого-то есть доступ к каким-то машинам и компиляторам, которых нету в списке, и есть возможность организовать удаленный доступ для портирования — буду рад. В данный момент было бы интересно проверить под HP-UX с компилятором HP C/aC++. Или на машинах уровня BlueGene с компилятором IBM XL. Или на AmigaOS.

Пожелания, комментарии (конструктивные и не очень) и поток сознания (в меру) по библиотеке приветствуются :)

>>> Подробности

Круто, спасибо, надо посмотреть. И не слушай местных задротов-нытиков, удачи.

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

krotozer, можете проверить на Эльбрусе поледнюю версию из репозитория, ветка no-boost? Я таки выпилил там boost, теперь тесты прогоняются на своих макросах. На Debian проверил, должно на Эльбрусе завестись.

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

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

krotozer, можете проверить на Эльбрусе поледнюю версию из репозитория, ветка no-boost? Я таки выпилил там boost, теперь тесты прогоняются на своих макросах. На Debian проверил, должно на Эльбрусе завестись.

Ещё не всё удачно, но уже значительно лучше.

Первая часть тестов:

----------------------------------
Run test patomic_test:
Running test case: patomic_general_test
Test passed
----------------------------------
Run test pcondvariable_test:
Running test case: pcondvariable_nomem_test
** Error: PCondVariable::p_cond_variable_new: failed to allocate memory **
Running test case: pcondvariable_bad_input_test
Running test case: pcondvariable_general_test
Test passed
----------------------------------
Run test pcryptohash_test:
Running test case: pcryptohash_nomem_test
** Error: PCryptoHash::p_crypto_hash_new: failed to allocate memory **
** Error: PCryptoHash::p_crypto_hash_new: failed to allocate memory **
** Error: PCryptoHash::p_crypto_hash_new: failed to allocate memory **
Running test case: pcryptohash_invalid_test
Running test case: md5_test
Running test case: sha1_test
Running test case: sha2_224_test
Running test case: sha2_256_test
Running test case: sha2_384_test
Running test case: sha2_512_test
Running test case: sha3_224_test
Running test case: sha3_256_test
Running test case: sha3_384_test
Running test case: sha3_512_test
Running test case: gost3411_94_test
Test passed
----------------------------------
Run test pdir_test:
Running test case: pdir_nomem_test
Running test case: pdir_general_test
Test passed
----------------------------------
Run test perror_test:
Running test case: perror_nomem_test
Running test case: perror_invalid_test
Running test case: perror_general_test
Test passed
----------------------------------
Run test pfile_test:
Running test case: pfile_general_test
Test passed
----------------------------------
Run test phashtable_test:
Running test case: phashtable_nomem_test
** Error: PHashTable::p_hash_table_new: failed(1) to allocate memory **
** Error: PHashTable::p_hash_table_insert: failed to allocate memory **
Running test case: phashtable_invalid_test
Running test case: phashtable_general_test
Running test case: phashtable_stress_test
Test passed
----------------------------------
Run test pinifile_test:
Running test case: pinifile_nomem_test
Running test case: pinifile_bad_input_test
Running test case: pinifile_read_test
Test passed
----------------------------------
Run test plibraryloader_test:
Running test case: plibraryloader_nomem_test
/root/plibsys-no-boost/tests/plibraryloader_test.cpp:56: required check failed
----------------------------------
Run test plist_test:
Running test case: plist_nomem_test
** Error: PList::p_list_append: failed to allocate memory **
** Error: PList::p_list_prepend: failed to allocate memory **
Running test case: plist_invalid_test
Running test case: plist_general_test
Test passed
----------------------------------
Run test pmacros_test:
Running test case: pmacros_general_test
** Warning: Test warning output **
** Error: Test error output **
** Debug: Test debug output **
** Debug: Likely condition triggered **
Test passed
----------------------------------
Run test pmain_test:
Running test case: pmain_general_test
Running test case: pmain_double_test
** Error: MAIN::p_libsys_init_full: failed to initialize memory table **
Running test case: pmain_vtable_test
Test passed
----------------------------------
Run test pmem_test:
Running test case: pmem_bad_input_test
Running test case: pmem_general_test
Test passed
----------------------------------
Run test pmutex_test:
Running test case: pmutex_nomem_test
** Error: PMutex::p_mutex_new: failed to allocate memory **
Running test case: pmutex_bad_input_test
Running test case: pmutex_general_test
Test passed
----------------------------------
Run test pprocess_test:
Running test case: pprocess_general_test
Test passed
----------------------------------
Run test prwlock_test:
Running test case: prwlock_nomem_test
** Error: PRWLock::p_rwlock_new: failed to allocate memory **
Running test case: prwlock_bad_input_test
Running test case: prwlock_general_test
Test passed

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

Вторая часть тестов:

----------------------------------
Run test psemaphore_test:
Running test case: psemaphore_nomem_test
Running test case: psemaphore_general_test
Running test case: psemaphore_thread_test
Test passed
----------------------------------
Run test pshmbuffer_test:
Running test case: pshmbuffer_nomem_test
Running test case: pshmbuffer_bad_input_test
Running test case: pshmbuffer_general_test
Running test case: pshmbuffer_thread_test
Test passed
----------------------------------
Run test pshm_test:
Running test case: pshm_nomem_test
Running test case: pshm_invalid_test
Running test case: pshm_general_test
Running test case: pshm_thread_test
Test passed
----------------------------------
Run test psocketaddress_test:
Running test case: psocketaddress_nomem_test
** Warning: PSocketAddress::p_socket_address_to_native: invalid buffer size for IPv4 **
** Error: PSocketAddress::p_socket_address_to_native: invalid buffer size for IPv6 **
** Error: PSocketAddress::p_socket_address_new: failed to allocate memory **
** Error: PSocketAddress::p_socket_address_new_any: failed to allocate memory **
** Error: PSocketAddress::p_socket_address_new_loopback: failed to allocate memory **
** Warning: PSocketAddress::p_socket_address_new_from_native: invalid IPv4 native size **
** Warning: PSocketAddress::p_socket_address_new_from_native: invalid IPv6 native size **
Running test case: psocketaddress_bad_input_test
Running test case: psocketaddress_general_test
Test passed
----------------------------------
Run test psocket_test:
Running test case: psocket_nomem_test
Running test case: psocket_bad_input_test
Running test case: psocket_general_udp_test
** Warning: PSocket::p_socket_set_keepalive: setsockopt() with SO_KEEPALIVE failed **
Running test case: psocket_general_tcp_test
** Warning: PSocket::p_socket_set_keepalive: setsockopt() with SO_KEEPALIVE failed **
Running test case: psocket_udp_test
Running test case: psocket_tcp_test
Running test case: psocket_shutdown_test
Test passed
----------------------------------
Run test pspinlock_test:
Running test case: pspinlock_nomem_test
** Error: PSpinLock::p_spinlock_new: failed to allocate memory **
Running test case: pspinlock_bad_input_test
Running test case: pspinlock_general_test
Test passed
----------------------------------
Run test pstring_test:
Running test case: pstring_nomem_test
Running test case: pstring_strdup_test
Running test case: pstring_strchomp_test
Running test case: pstring_strtok_test
Running test case: pstring_strtod_test
Test passed
----------------------------------
Run test ptimeprofiler_test:
Running test case: ptimeprofiler_nomem_test
** Error: PTimeProfiler: failed to allocate memory **
Running test case: ptimeprofiler_bad_input_test
Running test case: ptimeprofiler_general_test
Test passed
----------------------------------
Run test ptree_test:
Running test case: ptree_nomem_test
** Error: PTree::p_tree_new_full: failed to allocate memory **
** Error: PTree::p_tree_new_full: failed to allocate memory **
** Error: PTree::p_tree_new_full: failed to allocate memory **
Running test case: ptree_invalid_test
Running test case: ptree_general_test
Running test case: ptree_stress_test
Test passed
----------------------------------
Run test ptypes_test:
Running test case: ptypes_general_test
Running test case: ptypes_pointers_convert_test
Running test case: ptypes_min_max_test
Running test case: ptypes_modifiers_test
0x100
0xffffffffffffff00
0x200
0xfffffffffffffe00
0x400
0xfffffc00
0x800
0xfffff800
0x1000
0xfffffffffffff000
0x2000
Running test case: ptypes_formats_test
-256
256
512
-512
1024
-1024
2048
-2048
4096
-4096
8192
Running test case: ptypes_host_network_test
Test passed
----------------------------------
Run test puthread_test:
Running test case: puthread_nomem_test
** Error: PUThread::p_uthread_create_internal: failed to allocate memory **
** Error: PUThread::p_uthread_create_internal: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::p_uthread_current: failed to allocate memory **
** Error: PUThread::p_uthread_local_new: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::p_uthread_current: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
** Error: PUThread::pp_uthread_get_tls_key: failed to allocate memory **
Running test case: puthread_bad_input_test
** Warning: PUThread::p_uthread_exit: p_uthread_exit() cannot be called from an unknown thread **
Running test case: puthread_general_test
Running test case: puthread_nonjoinable_test
Running test case: puthread_tls_test
Test passed
Хорошо бы перевести этот разговор на почту, но тут личных сообщений не предусмотрено.

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

Спасибо за тест! Судя по логам, все тесты кроме разделяемой библиотеки работают. Уже неплохо :)

Хорошо бы перевести этот разговор на почту, но тут личных сообщений не предусмотрено.

У меня на гитхабе должны быть доступна почта, можете написать на нее? Постараюсь добить порт на Эльбрус.

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

Все-таки задам еще вопрос: тест plibraryloader_test вы руками запускали? Если да, то это единственный тест, которому надо параметром передать путь к разделяемой библиотеке plibsys. Именно поэтому я рекомендую прогонять тесты командой make test - оно там все учитывается.

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

У меня на гитхабе должны быть доступна почта, можете написать на нее? Постараюсь добить порт на Эльбрус.

Сразу после этих сообщений туда напишу. Уведомлений на ЛОР-е нет, так что я не был в курсе ответов здесь.

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

Все-таки задам еще вопрос: тест plibraryloader_test вы руками запускали? Если да, то это единственный тест, которому надо параметром передать путь к разделяемой библиотеке plibsys. Именно поэтому я рекомендую прогонять тесты командой make test - оно там все учитывается.

Нет, там тесты запускались командой BASH:

for FILE in *_test; do echo "Run test "$FILE":"; ./$FILE; echo "----------------------"; done

С этого момента, думаю, можно переходить на почту.

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

Специально для всех посетителей этого «трэда» подтверждаю:
Библиотека plibsys (ветка no-boost) успешно собралась и прошла тесты на ПК "Эльбрус 401-PC" (Эльбрус 4С+).

Running tests...
Test project /root/plibsys-build
      Start  1: patomic_test
 1/27 Test  #1: patomic_test .....................   Passed    0.01 sec
      Start  2: pcondvariable_test
 2/27 Test  #2: pcondvariable_test ...............   Passed    4.02 sec
      Start  3: pcryptohash_test
 3/27 Test  #3: pcryptohash_test .................   Passed   12.57 sec
      Start  4: perror_test
 4/27 Test  #4: perror_test ......................   Passed    0.01 sec
      Start  5: pdir_test
 5/27 Test  #5: pdir_test ........................   Passed    0.01 sec
      Start  6: pfile_test
 6/27 Test  #6: pfile_test .......................   Passed    0.01 sec
      Start  7: phashtable_test
 7/27 Test  #7: phashtable_test ..................   Passed    0.17 sec
      Start  8: pinifile_test
 8/27 Test  #8: pinifile_test ....................   Passed    0.02 sec
      Start  9: plibraryloader_test
 9/27 Test  #9: plibraryloader_test ..............   Passed    0.01 sec
      Start 10: plist_test
10/27 Test #10: plist_test .......................   Passed    0.01 sec
      Start 11: pmacros_test
11/27 Test #11: pmacros_test .....................   Passed    0.01 sec
      Start 12: pmain_test
12/27 Test #12: pmain_test .......................   Passed    0.01 sec
      Start 13: pmem_test
13/27 Test #13: pmem_test ........................   Passed    0.01 sec
      Start 14: pmutex_test
14/27 Test #14: pmutex_test ......................   Passed    1.08 sec
      Start 15: pprocess_test
15/27 Test #15: pprocess_test ....................   Passed    0.01 sec
      Start 16: prwlock_test
16/27 Test #16: prwlock_test .....................   Passed   10.03 sec
      Start 17: psemaphore_test
17/27 Test #17: psemaphore_test ..................   Passed    1.09 sec
      Start 18: pshmbuffer_test
18/27 Test #18: pshmbuffer_test ..................   Passed    8.85 sec
      Start 19: pshm_test
19/27 Test #19: pshm_test ........................   Passed    0.12 sec
      Start 20: psocket_test
20/27 Test #20: psocket_test .....................   Passed   35.31 sec
      Start 21: psocketaddress_test
21/27 Test #21: psocketaddress_test ..............   Passed    0.01 sec
      Start 22: pspinlock_test
22/27 Test #22: pspinlock_test ...................   Passed    1.08 sec
      Start 23: pstring_test
23/27 Test #23: pstring_test .....................   Passed    0.01 sec
      Start 24: ptimeprofiler_test
24/27 Test #24: ptimeprofiler_test ...............   Passed    1.36 sec
      Start 25: ptree_test
25/27 Test #25: ptree_test .......................   Passed    9.17 sec
      Start 26: ptypes_test
26/27 Test #26: ptypes_test ......................   Passed    0.01 sec
      Start 27: puthread_test
27/27 Test #27: puthread_test ....................   Passed   18.03 sec

100% tests passed, 0 tests failed out of 27

Total Test time (real) = 103.16 sec

krotozer ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.