LINUX.ORG.RU

GLib mmap: failed to allocate 4Gb

 , , , ,


1

2

Вероятно, делаю всё совсем неправильно. Вот код на Vala:

int fd = open("/dev/fb0", O_RDWR);
ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
long screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
uchar[] data = (uchar[])mmap((void *)0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
Всё выполняется ровно до строчки с mmap. Причём open совершенно точно возвращает правильный fd, и ioctl получает правильный vinfo, так что даже scrensize вычисляется верный.
Но вот на mmap ругается:
GLib-ERROR **: gmem.c:100: failed to allocate 4294967295 bytes
Причём аналогичная программа на C работает нормально. Явно я где-то накосячил.
Или есть какой-то хитрый GLib-специфичный способ это сделать? Может, при помощи GIO?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от hateyoufeel

Конкретно этот кусок вот в это:

_tmp0_ = g_strdup ("/dev/fb0");
_tmp1_ = open (_tmp0_, O_RDWR, (mode_t) 0);
fd = _tmp1_;
ioctl (fd, FBIOGET_VSCREENINFO, &self->vinfo);
_tmp2_ = self->vinfo;
_tmp3_ = _tmp2_.xres;
_tmp4_ = self->vinfo;
_tmp5_ = _tmp4_.yres;
_tmp6_ = self->vinfo;
_tmp7_ = _tmp6_.bits_per_pixel;
screensize = (glong) (((_tmp3_ * _tmp5_) * _tmp7_) / 8);
_tmp8_ = mmap ((void*) 0, (gsize) screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t) 0);
_tmp9_ = (((guchar*) _tmp8_) != NULL) ? _vala_array_dup1 ((guchar*) _tmp8_, -1) : ((gpointer) ((guchar*) _tmp8_));
_tmp9__length1 = -1;
data = _tmp9_;
data_length1 = _tmp9__length1;
_data_size_ = data_length1;
_tmp10_ = self->finfo;
Но вопрос немного не в том, где какой glib'овский тип данный вдруг почему-то принял значение -1.
Вопрос в том, как это принято делать в мире GLib.

CYB3R ★★★★★
() автор топика
Последнее исправление: CYB3R (всего исправлений: 1)

GLib-ERROR **: gmem.c:100: failed to allocate 4294967295 bytes

с чего ты взял что ругань про mmap - это ниразу не аллокация, память уже выделена а mmap просто отображает буфер в адресном пространстве пользовательского процесса.

anonymous
()

А как на тему поставить ватчпоит под дебаггером? А запустить под ес-трейсом?

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

Либо я не умею пользоваться valadoc.org, либо про mmap там ничего нет.

Поэтому, наверное, тебе в указатели. Массивы в Vala с длиной, как я понял.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Не умеешь. На valadoc лежит в posix/Posix.mmap. Но инфы там нет почти никакой, как говорится, читайте ман.

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

с чего ты взял что ругань про mmap

Строчка до mmap выполняется, а строчка после — нет.

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

_tmp9_ = (((guchar*) _tmp8_) != NULL) ? _vala_array_dup1 ((guchar*) _tmp8_, -1)
-1

Ну и что? Тут смысл в том, что -1 превратится в 4294967295 (32bit, да), если лишится знака. Так что, вероятно, -1 — это screensize. Но нет, в screensize осмысленное число. Но это осмысленный long, а mmap требует uintptr.

CYB3R ★★★★★
() автор топика
Последнее исправление: CYB3R (всего исправлений: 3)
Ответ на: комментарий от CYB3R

Прочти код повнимательнее. Оно пытается сделать эквивалент memdup() на указателе, полученном из mmap(). А -1 — это размер копируемого участка. Тебе нужен какой-нибудь unowned, наверное, или указатели, чтобы оно не пыталось копировать этот «массив».

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 4)
Ответ на: комментарий от CYB3R

А, ну там, похоже, поиск по top-level модулям не работает. Говорит «Query failed: (0)». Неудивительно, что я ничего не нашёл.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Хмм... Действительно. Думаю, что это решит проблему. Буду завтра на работе, попробую.

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

Надо бы отписать Флориану.

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

Кстати, забыл сказать, что всё хорошо работает, спасибо!

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