Как мне преобразовать дескриптор порта завершения ввода-вывода Windows в GPollFD из GLib для пользовательского GSource?

#windows #glib #event-loop #libuv #io-completion-ports

#Windows #glib #цикл событий #libuv #завершение ввода-вывода-порты

Вопрос:

Я нахожусь в очень неудачном положении, когда мне нужно взаимодействовать с libuv nodejs и MainLoop GLib во всех трех основных операционных системах. Мне нужно чередовать как основной цикл libuv, так и цикл управления GLib, чтобы обе части проекта могли быть счастливы и жить вместе. В unix это достаточно просто, потому что libuv возвращает дескриптор файла для опроса:

 GSource source;
// ...
g_source_add_unix_fd (amp;source->source,
                      uv_backend_fd (loop),
                      (GIOCondition) (G_IO_IN | G_IO_OUT | G_IO_ERR));
  

Однако в Windows нет файлового дескриптора для опроса. Доступен дескриптор порта завершения ввода-вывода в uv loop->iocp . Я не совсем уверен, как действовать дальше. Я подумал, что мне, вероятно, следует использовать следующую функцию из GLIB:

 void
g_source_add_poll (GSource *source,
                   GPollFD *fd);
  

Но тогда мне нужно было бы создать GPollFD из этого, и я не уверен, как это сделать или если это правильный вариант. Приветствуется любой намек, который может помочь мне продвинуться.

Соответствующая ссылка: https://github.com/romgrk/node-gtk/blob/master/src/loop.cc#L68-L75

Комментарии:

1. все, что можно сделать с loop->iocp помощью call GetQueuedCompletionStatus[Ex] или NtRemoveIoCompletion на нем. но я не просматриваю такие вызовы в node-gtk . таким образом, эта библиотека не может работать с iocp . вам нужно самостоятельно обработать этот случай в Windows

2. Прошло так много времени с тех пор, как мне приходилось это делать, я не хочу пытаться отвечать, но IIRC лучшее решение — использовать g_io_channel_win32_make_pollfd для создания a GPollFD из a GIOChannel . Я думаю, что это сработает _open_osfhandle . Удачи :/

3. @nemequ — потому что в glib нет вызовов GetQueuedCompletionStatus[Ex] или [Zw / Nt]RemoveIoCompletion — это в любом случае не может работать с iocp