[Spice-devel] [PATCH spice 3/5] spicec: don't send agent messages directly from ClipboardListener callbacks

Arnon Gilboa agilboa at redhat.com
Thu Oct 7 05:13:34 PDT 2010


ack

Hans de Goede wrote:
> ClipboardListener callbacks can run from another thread then the
> main channel loop thread, where agent messages are normally dispatched from.
>
> So they may not send agent messages directly, instead they should post
> events to the main channel loop.
> ---
>  client/red_client.cpp |   33 +++++++++++++++++++++++++++------
>  client/red_client.h   |   32 ++++++++++++++++++++++++++++++++
>  2 files changed, 59 insertions(+), 6 deletions(-)
>
> diff --git a/client/red_client.cpp b/client/red_client.cpp
> index 0650e35..cf2ee35 100644
> --- a/client/red_client.cpp
> +++ b/client/red_client.cpp
> @@ -101,6 +101,21 @@ void ClipboardRequestEvent::response(AbstractProcessLoop& events_loop)
>          VD_AGENT_CLIPBOARD_REQUEST, sizeof(request), &request);
>  }
>  
> +void ClipboardNotifyEvent::response(AbstractProcessLoop& events_loop)
> +{
> +    static_cast<RedClient*>(events_loop.get_owner())->send_agent_clipboard_notify_message(
> +        _type, _data, _size);
> +}
> +
> +void ClipboardReleaseEvent::response(AbstractProcessLoop& events_loop)
> +{
> +    if (Platform::get_clipboard_owner() != Platform::owner_client)
> +        return;
> +
> +    static_cast<RedClient*>(events_loop.get_owner())->send_agent_clipboard_message(
> +        VD_AGENT_CLIPBOARD_RELEASE, 0, NULL);
> +}
> +
>  Migrate::Migrate(RedClient& client)
>      : _client (client)
>      , _running (false)
> @@ -861,6 +876,18 @@ void RedClient::on_clipboard_request(uint32_t type)
>  
>  void RedClient::on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size)
>  {
> +    AutoRef<ClipboardNotifyEvent> event(new ClipboardNotifyEvent(type, data, size));
> +    get_process_loop().push_event(*event);
> +}
> +
> +void RedClient::on_clipboard_release()
> +{
> +    AutoRef<ClipboardReleaseEvent> event(new ClipboardReleaseEvent());
> +    get_process_loop().push_event(*event);
> +}
> +
> +void RedClient::send_agent_clipboard_notify_message(uint32_t type, uint8_t *data, uint32_t size)
> +{
>      ASSERT(size && data);
>      if (!_agent_connected) {
>          return;
> @@ -892,12 +919,6 @@ void RedClient::on_clipboard_notify(uint32_t type, uint8_t* data, int32_t size)
>      }
>  }
>  
> -void RedClient::on_clipboard_release()
> -{
> -    if (Platform::get_clipboard_owner() == Platform::owner_client)
> -        send_agent_clipboard_message(VD_AGENT_CLIPBOARD_RELEASE, 0, NULL);
> -}
> -
>  void RedClient::set_mouse_mode(uint32_t supported_modes, uint32_t current_mode)
>  {
>      if (current_mode != _mouse_mode) {
> diff --git a/client/red_client.h b/client/red_client.h
> index 15f0617..dd64682 100644
> --- a/client/red_client.h
> +++ b/client/red_client.h
> @@ -173,6 +173,35 @@ private:
>      uint32_t _type;
>  };
>  
> +class ClipboardNotifyEvent : public Event {
> +public:
> +    ClipboardNotifyEvent(uint32_t type, uint8_t *data, uint32_t size)
> +    {
> +        _type = type;
> +        _data = new uint8_t [size];
> +        memcpy(_data, data, size);
> +        _size = size;
> +    }
> +    ~ClipboardNotifyEvent()
> +    {
> +        delete[] _data;
> +    }
> +
> +    virtual void response(AbstractProcessLoop& events_loop);
> +
> +private:
> +    uint32_t _type;
> +    uint8_t *_data;
> +    uint32_t _size;
> +};
> +
> +class ClipboardReleaseEvent : public Event {
> +public:
> +    ClipboardReleaseEvent() {}
> +    virtual void response(AbstractProcessLoop& events_loop);
> +};
> +
> +
>  class RedClient: public RedChannel,
>                   public Platform::ClipboardListener {
>  public:
> @@ -180,6 +209,8 @@ public:
>      friend class Migrate;
>      friend class ClipboardGrabEvent;
>      friend class ClipboardRequestEvent;
> +    friend class ClipboardNotifyEvent;
> +    friend class ClipboardReleaseEvent;
>  
>      RedClient(Application& application);
>      ~RedClient();
> @@ -265,6 +296,7 @@ private:
>                                          uint32_t msg_size);
>      void do_send_agent_clipboard();
>      void send_agent_clipboard_message(uint32_t message_type, uint32_t size = 0, void* data = NULL);
> +    void send_agent_clipboard_notify_message(uint32_t type, uint8_t *data, uint32_t size);
>  
>      ChannelFactory* find_factory(uint32_t type);
>      void create_channel(uint32_t type, uint32_t id);
>   



More information about the Spice-devel mailing list