[Spice-devel] [PATCH] client: Fix for clipboard sending; It wasn't thread safe.
Arnon Gilboa
agilboa at redhat.com
Sun Aug 15 07:13:38 PDT 2010
Yonit Halperin wrote:
> ---
> client/red_client.cpp | 23 +++++++++++++++++++----
> client/red_client.h | 9 ++++++++-
> 2 files changed, 27 insertions(+), 5 deletions(-)
>
> diff --git a/client/red_client.cpp b/client/red_client.cpp
> index 9a8078e..b6a412e 100644
> --- a/client/red_client.cpp
> +++ b/client/red_client.cpp
> @@ -75,6 +75,11 @@ private:
> RedClient& _client;
> };
>
> +void ClipboardEvent::response(AbstractProcessLoop& events_loop)
> +{
> + static_cast<RedClient*>(events_loop.get_owner())->send_agent_clipboard();
> +}
> +
> Migrate::Migrate(RedClient& client)
> : _client (client)
> , _running (false)
> @@ -747,7 +752,7 @@ uint32_t get_agent_clipboard_type(uint32_t type)
> }
> }
>
> -void RedClient::post_agent_clipboard()
> +void RedClient::do_send_agent_clipboard()
> {
> uint32_t size;
>
> @@ -771,7 +776,7 @@ void RedClient::post_agent_clipboard()
> }
>
> //FIXME: currently supports text only; better name - poll_clipboard?
> -void RedClient::on_clipboard_change()
> +void RedClient::send_agent_clipboard()
> {
> //FIXME: check connected - assert on disconnect
> uint32_t clip_type = Platform::CLIPBOARD_UTF8_TEXT;
> @@ -799,11 +804,18 @@ void RedClient::on_clipboard_change()
> _agent_out_msg_size = 0;
> return;
> }
> +
> if (_agent_tokens) {
> - post_agent_clipboard();
> + do_send_agent_clipboard();
> }
> }
>
> +void RedClient::on_clipboard_change()
> +{
> + AutoRef<ClipboardEvent> event(new ClipboardEvent());
> + get_process_loop().push_event(*event);
> +}
> +
> void RedClient::set_mouse_mode(uint32_t supported_modes, uint32_t current_mode)
> {
> if (current_mode != _mouse_mode) {
> @@ -960,6 +972,8 @@ void RedClient::handle_agent_data(RedPeer::InMessage* message)
> msg_size -= n;
> msg_pos += n;
> if (_agent_msg_pos == sizeof(VDAgentMessage)) {
> + DBG(0, "agent msg start: msg_size=%d, protocol=%d, type=%d",
> + _agent_msg->size, _agent_msg->protocol, _agent_msg->type);
> if (_agent_msg->protocol != VD_AGENT_PROTOCOL) {
> THROW("Invalid protocol %u", _agent_msg->protocol);
> }
> @@ -974,6 +988,7 @@ void RedClient::handle_agent_data(RedPeer::InMessage* message)
> msg_pos += n;
> }
> if (_agent_msg_pos == sizeof(VDAgentMessage) + _agent_msg->size) {
> + DBG(0, "agent msg end");
> switch (_agent_msg->type) {
> case VD_AGENT_REPLY: {
> on_agent_reply((VDAgentReply*)_agent_msg_data);
> @@ -999,7 +1014,7 @@ void RedClient::handle_agent_tokens(RedPeer::InMessage* message)
> SpiceMsgMainAgentTokens *token = (SpiceMsgMainAgentTokens *)message->data();
> _agent_tokens += token->num_tokens;
> if (_agent_out_msg_pos < _agent_out_msg_size) {
> - post_agent_clipboard();
> + do_send_agent_clipboard();
> }
> }
>
> diff --git a/client/red_client.h b/client/red_client.h
> index fd1a9b4..6b4d4ab 100644
> --- a/client/red_client.h
> +++ b/client/red_client.h
> @@ -144,10 +144,16 @@ public:
> uint32_t _color_depth;
> };
>
> +class ClipboardEvent : public Event {
> +public:
> + virtual void response(AbstractProcessLoop& events_loop);
> +};
> +
> class RedClient: public RedChannel {
> public:
> friend class RedChannel;
> friend class Migrate;
> + friend class ClipboardEvent;
>
> RedClient(Application& application);
> ~RedClient();
> @@ -224,7 +230,8 @@ private:
>
> void on_agent_reply(VDAgentReply* reply);
> void on_agent_clipboard(VDAgentClipboard* clipboard, uint32_t size);
> - void post_agent_clipboard();
> + void send_agent_clipboard();
> + void do_send_agent_clipboard();
>
> ChannelFactory* find_factory(uint32_t type);
> void create_channel(uint32_t type, uint32_t id);
>
ACK
More information about the Spice-devel
mailing list