[Spice-devel] [vdagent-win v1 1/2] vdagent: small rework on event_dispatcher
Victor Toso
lists at victortoso.com
Wed Aug 10 19:17:34 UTC 2016
Hi,
On Wed, Aug 10, 2016 at 11:21:30AM -0400, Frediano Ziglio wrote:
> >
> > 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.
> >
> > So this patch makes explicit if we are setting or receiving a
> > _stop_event or not.
> > ---
> > vdagent/vdagent.cpp | 19 +++++++++++++++----
> > 1 file changed, 15 insertions(+), 4 deletions(-)
> >
> > diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp
> > index 959881d..45ff55d 100644
> > --- a/vdagent/vdagent.cpp
> > +++ b/vdagent/vdagent.cpp
> > @@ -480,11 +480,17 @@ void VDAgent::input_desktop_message_loop()
> >
> > 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;
> > MSG msg;
> >
> > + events[0] = _control_event;
> > + if (_stop_event) {
> > + events[event_count] = _stop_event;
> > + event_count++;
> > + }
> > +
> > wait_ret = MsgWaitForMultipleObjectsEx(event_count, events, timeout,
> > wake_mask, MWMO_ALERTABLE);
> > if (wait_ret == WAIT_OBJECT_0 + event_count) {
> > while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
> > @@ -498,8 +504,13 @@ void VDAgent::event_dispatcher(DWORD timeout, DWORD
> > wake_mask)
> > handle_control_event();
> > break;
> > case WAIT_OBJECT_0 + 1:
> > - _running = false;
> > - break;
> > + /* As _stop_event is not mandatory, the wait_ret index might refer
> > to a
> > + * different event, we should explicit check it */
> > + if (_stop_event) {
> > + vd_printf("%s: received stop event", __func__);
> > + _running = false;
> > + break;
> > + }
>
> I understand what you are trying to do (looking also at 2/2) but looks
> like it's hard to maintain.
Yes
> Why don't you do an additional enumeration for actions to do (or use
> a function pointer). Something like
>
> HANDLE events[2];
> DWORD event_count = 1;
> enum {
> CONTROL_ACTION,
> STOP_ACTION,
> } actions[G_N_ELEMENTS(events)];
> ...
>
> events[0] = _control_event;
> actions[0] = CONTROL_ACTION;
> if (_stop_event) {
> events[event_count] = _stop_event;
> actions[event_count] = STOP_ACTION;
> event_count++;
> }
>
> ...
> res_wait =
> wait_ret = MsgWaitForMultipleObjectsEx(event_count, events, timeout, wake_mask, MWMO_ALERTABLE);
> ...
>
> if (wait_ret >= WAIT_OBJECT_0 && wait_ret < WAIT_OBJECT_0 + event_count) {
> switch (actions[wait_ret - WAIT_OBJECT_0]) {
> case CONTROL_ACTION:
> ...
> case STOP_ACTION:
> ...
> ...
>
Right, something like this can improve the switch there which makes
everything easier to read. I'll send a v2, many thanks!
toso
> Frediano
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list