Страниц: [1]
  Печать  
Автор Тема: Проблема с posix_memalign в QNX6.5.0 SP1  (Прочитано 3954 раз)
bbceler
Full Member
***
Offline Offline

Сообщений: 149


Просмотр профиля WWW
« : Июля 14, 2012, 02:25:35 pm »

Во время моих работ с glib2 в SP1 я нашол по всей вероятьности ошибку в библетечной
функции posix_memalign. Вот тест программа Test.c
# cat Test.c
#include <stdlib.h>
int main(int argc, char **argv)
{
        void *ptr = 0;
        posix_memalign(&ptr, 16, 16 - 2 * sizeof (void*));
        posix_memalign(&ptr, 32, 32 - 2 * sizeof (void*));
        posix_memalign(&ptr, 64, 64 - 2 * sizeof (void*));
        posix_memalign(&ptr, 128, 128 - 2 * sizeof (void*));
        return (0);
}
# gcc -g -o Test Test.c
после ./Test программа стоить в STATE => RUNNIG.
Состаяние это возникаеть после вызова posix_memalign(&ptr, 128, 128 - 2 * sizeof (void*));
Так выглядить дебаггинг
# gdb Test
GNU gdb 6.8 qnx-nto (rev. 506)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-pc-nto-qnx6.5.0"...
(gdb) start
Temporary breakpoint 1 at 0x8048699: file Test.c, line 4.
Starting program: /root/Test0
[New pid 2007084 tid 1]

Temporary breakpoint 1, main (argc=1, argv=0x8047a04) at Test.c:4
4               void *ptr = 0;
(gdb) n
5               posix_memalign(&ptr, 16, 16 - 2 * sizeof (void*));
(gdb)
6               posix_memalign(&ptr, 32, 32 - 2 * sizeof (void*));
(gdb)
7               posix_memalign(&ptr, 64, 64 - 2 * sizeof (void*));
(gdb)
8               posix_memalign(&ptr, 128, 128 - 2 * sizeof (void*));
(gdb)     <= and  the program is standing in this place in the RUNNIG state
              <=  After the interrupt  - Ctrl C
Program received signal SIGINT, Interrupt.
0xb032799f in _band_get_aligned () from /usr/qnx650/target/qnx6/x86/lib/libc.so.3
(gdb) q
The program is running.  Exit anyway? (y or n) y
#
Самое интересное в том что этот вызов posix_memalign(&ptr, 128, 128 - 2 * sizeof (void*));
не кончаеться ошибкой а программа входить в бесконечный цикль.
Я проверял прогрвмма Test в QNX6.4.1 и QNX6.5.0 работаеть без проблем
Записан
vshemm
Sr. Member
****
Offline Offline

Сообщений: 317


Просмотр профиля
« Ответ #1 : Июля 14, 2012, 11:01:40 pm »

Попробуйте для теста вручную изменить band конфигурацию как описано здесь:
https://developer.blackberry.com/native/documentation/com.qnx.doc.neutrino.prog/topic/hat_Small_block.html
а именно - добавить побольше блоков размером 128 байт (+ добавить блоки кратные 128, например, 256).

Поинт в том, что posix_memalign() для выделения использует эээ Small Block allocator,
причем размер свободного блока должен быть не меньше alignment. Если свободных блоков
подходящего размера нет, то попытка тупо повторяется в надежде что он появится (это как
раз происходит в _band_get_aligned()). Если SP1 принес изменение band конфигурации по
умолчанию и 128-байтных блоков нет (или они уже все использованы), то все складывается -
100% загрузка одного ядра без возврата ошибки.

Правда, есть один нюанс, но под рукой ни бинарника библиотеки нет, ни исходников, так что пока
проверить его не могу.
Записан
mike
QOR.Moderator
*****
Offline Offline

Сообщений: 1186


Welcome to Lunatic Asylum.


Просмотр профиля WWW
« Ответ #2 : Сентября 04, 2012, 12:14:41 pm »

bbceler не забываем отписываться о результатах Wink
Thanks for the report, it's been addressed and if you have a priority support plan you can request a hotfix using reference #179337.

In the meantime you can work around the issue by setting your bin sizes as such:
MALLOC_BAND_CONFIG_STR="8:16,32,0:24,32,0:32,32,0:48,24,0:64,24,0:80,24,0:96,16,0:128,8,0"

And exporting that environment variable or setting the same parameters via mallopt().
Записан
vshemm
Sr. Member
****
Offline Offline

Сообщений: 317


Просмотр профиля
« Ответ #3 : Сентября 04, 2012, 09:04:41 pm »

Значит, они все-таки поменяли band конфигурацию по умолчанию, а вот от концевой
рекурсии в _band_get_aligned() не избавились - ай яй яй.
Записан
Страниц: [1]
  Печать  
 
Перейти в: