Пример использования dbus c api для тайм-аута и отмены ожидающей переменной
Существует пример dbus C api http://www.matthew.ath.cx/misc/dbus. Он также включен на github с улучшениями https://github.com/wware/stuff/blob/master/dbus-example/dbus-example.c. В функции query(), которая выполняет вызов и получает ответ, нужно ли обрабатывать тайм-аут, как показано ниже, добавляя строки с 19 по 23? Если мы сделаем это, мы должны вызвать... unref на ожидающей линии в строке 20? Читая поток этого примера, я думаю, что это то, что мы должны сделать.
// send message and get a handle for a reply
if (!dbus_connection_send_with_reply (conn, msg, &pending, -1)) { // -1 is default timeout
fprintf(stderr, "Out Of Memory!\n");
exit(1);
}
if (NULL == pending) {
fprintf(stderr, "Pending Call Null\n");
exit(1);
}
dbus_connection_flush(conn);
printf("Request Sent\n");
// free message
dbus_message_unref(msg);
// block until we recieve a reply
dbus_pending_call_block(pending);
/*do we need to handle the timeout case? -- line 20*/
if ( ! dbus_pending_call_get_completed(pending) ) {
/*do we need to unref pending? -- line 22 */
dbus_pending_call_unref(pending); /* --line 23 */
fprintf(stderr, "Reply timeout\n");
return(1);
}
1 ответ
После некоторого чтения и экспериментов, вот ответ:
if ( ! dbus_pending_call_get_completed(pending) ) {
/* always safe to call cancel */
dbus_pending_call_cancel(pending);
/*do we need to unref pending? yes. if not it would be a memory leak */
dbus_pending_call_unref(pending);
fprintf(stderr, "Reply failed to complete\n");
return(1);
}
/* timeout notes:
* it always reaches here, _completed() always returns true.
* if destination name does not exist, it consumes 0 time and returns
* a string indicating the possible error.
* if destination replies late, it consumes full timeout duration and
* returns a string about the possible error.
* to abort before complete, use the _cancel() call. it is safe to call
* _cancel() even if it has been completed.
*/