Я пытаюсь интегрировать zeromq в основной цикл glib, но не могу понять, почему моя программа работает с segfault'ом.
Вот функция, которая гарантирует segfault после запуска g_main_loop_run (loop):
/** set poll fn to operate on zmq or unix sockets */
g_main_context_set_poll_func( g_context, (GPollFunc) zmq_poll );
Я думал, что это будет работать, учитывая, что zmq_poll
имеет ту же структуру, что и poll
, и вызов этой же функции с помощью s / zmq_poll / poll / работает нормально.
Урезанная версия моего кода, в которой он по-прежнему находится на segfault'ing: http://paste.pocoo.org/show/568289/.
(не проверено) Полная версия: http://paste.pocoo.org/show/568292/.
StackTrace:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6a2bd50 in ?? ()
from /usr/lib/libzmq.so.1
(gdb) bt
#0 0x00007ffff6a2bd50 in ?? ()
from /usr/lib/libzmq.so.1
#1 0x00007ffff6a34b4d in zmq_getsockopt ()
from /usr/lib/libzmq.so.1
#2 0x00007ffff6a34e1b in zmq_poll ()
from /usr/lib/libzmq.so.1
#3 0x00007ffff6c89dc8 in ?? ()
from /usr/lib/libglib-2.0.so.0
#4 0x00007ffff6c8a5f2 in g_main_loop_run ()
from /usr/lib/libglib-2.0.so.0
#5 0x0000000000402978 in main (argc=1,
argv=0x7fffffffe5e8) at server.c:229
Скомпилируйте код (при условии, что у вас установлены gstreamer и zeromq) с помощью:
gcc --debug `pkg-config gstreamer-0.10 --libs` -lzmq `pkg-config gstreamer-0.10 --cflags` -o test test.c
Что я делаю не так?
Любая помощь приветствуется, спасибо.
РЕДАКТИРОВАТЬ: Получил работать с тем, что Александр предложил с помощью этой функции в качестве замены моего опроса:
gint zmq_poll_adapter(GPollFD *ufds, guint nfsd, gint timeout_)
{
zmq_pollitem_t ufds0[nfsd];
int i;
for (i = 0; i < nfsd; i++)
{
ufds0[i].socket = NULL;
ufds0[i].fd = ufds[i].fd;
ufds0[i].events = ufds[i].events;
ufds0[i].revents = ufds[i].revents;
}
zmq_poll(ufds0, nfsd, timeout_);
}
Если честно, я даже не уверен, как это работало так хорошо, как это было, но я новичок в C и понятия не имею, как сделать адаптивную адаптацию ().