[Spice-devel] [vdagent-win v2 1/2] vdagent: rework on event_dispatcher
Frediano Ziglio
fziglio at redhat.com
Thu Aug 11 14:01:27 UTC 2016
>
> As _stop_event is not mandatory, we are initializing the events array
> with something that might be NULL. The problem is with the following
> patch as I'm introducing a new non mandatory event and logic starts to
> get a bit hard to follow.
>
> So this patch makes explicit if we are setting or receiving a
> _stop_event or not and uses an auxiliary enum and array 'actions' to
> work around this non mandatory events and the return value of
> MsgWaitForMultipleObjectsEx()
> ---
> vdagent/vdagent.cpp | 39 ++++++++++++++++++++++++++++++---------
> 1 file changed, 30 insertions(+), 9 deletions(-)
>
> diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp
> index 959881d..d3cbd5f 100644
> --- a/vdagent/vdagent.cpp
> +++ b/vdagent/vdagent.cpp
> @@ -478,12 +478,27 @@ void VDAgent::input_desktop_message_loop()
> CloseDesktop(hdesk);
> }
>
> +#define G_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0]))
> +
Oh.. you can use SPICE_N_ELEMENTS, should be available
> void VDAgent::event_dispatcher(DWORD timeout, DWORD wake_mask)
> {
> - HANDLE events[] = {_control_event, _stop_event};
> - DWORD event_count = _stop_event ? 2 : 1;
> + HANDLE events[2];
> + DWORD event_count = 1;
> DWORD wait_ret;
> + DWORD action;
action should be of enumerator type ...
> MSG msg;
> + enum {
> + CONTROL_ACTION,
> + STOP_ACTION,
> + } actions[G_N_ELEMENTS(events)];
... I would put here as
} actions[G_N_ELEMENTS(events)], action;
> +
> + events[0] = _control_event;
> + actions[0] = CONTROL_ACTION;
> + if (_stop_event) {
> + events[event_count] = _stop_event;
> + actions[event_count] = STOP_ACTION;
> + event_count++;
> + }
>
> wait_ret = MsgWaitForMultipleObjectsEx(event_count, events, timeout,
> wake_mask, MWMO_ALERTABLE);
> if (wait_ret == WAIT_OBJECT_0 + event_count) {
> @@ -492,19 +507,25 @@ void VDAgent::event_dispatcher(DWORD timeout, DWORD
> wake_mask)
> DispatchMessage(&msg);
> }
> return;
> + } else if (wait_ret == WAIT_IO_COMPLETION || wait_ret == WAIT_TIMEOUT) {
> + return;
> + } else if (wait_ret < WAIT_OBJECT_0 || wait_ret > WAIT_OBJECT_0 +
> event_count) {
> + vd_printf("MsgWaitForMultipleObjectsEx failed: %lu %lu", wait_ret,
> GetLastError());
> + _running = false;
> + return;
> }
> - switch (wait_ret) {
> - case WAIT_OBJECT_0:
> +
> + action = actions[wait_ret - WAIT_OBJECT_0];
> + switch (action) {
> + case CONTROL_ACTION:
> handle_control_event();
> break;
> - case WAIT_OBJECT_0 + 1:
> + case STOP_ACTION:
> + vd_printf("%s: received stop event", __func__);
> _running = false;
> break;
> - case WAIT_IO_COMPLETION:
> - case WAIT_TIMEOUT:
> - break;
> default:
> - vd_printf("MsgWaitForMultipleObjectsEx failed: %lu %lu", wait_ret,
> GetLastError());
> + vd_printf("%s: action not handled (%lu)", __func__, action);
> _running = false;
> }
> }
Beside these small changes looks fine.
Acked-by: Frediano Ziglio <fziglio at redhat.com>
Frediano
More information about the Spice-devel
mailing list