Hi,

For now I simply used a counter to work around this issue.


while (... g_pollable_input_stream_is_readable ) {
  if (loop > 10)
    break;
}


Ugly but seems useful.


BR
Don

















At 2020-06-15 20:59:00, "Jakub Janku" <jja...@redhat.com> wrote:
>Hi,
>
>yes, I think this is a real issue. I feel like I've stumbled across
>something similar in the past when working on webdav.
>
>So yeah, it seems like the channel might get blocked in one direction
>-- meaning data isn't sent until you read all available data.
>
>However, that doesn't mean that other channels won't work imho. In a
>more realistic scenario, you wold read the data from vdagent in chunks
>and actually do something with it. Webdav uses the code in vmcstream.c
>to read the data in coroutine and the buffer is delivered to the
>WebdavChannel using an idle callback. This gives other events the
>opportunity to fire and be processed and the code can yield to another
>coroutine. So important channels, like Display, should continue
>working just fine.
>
>PS, it's been quite some time, so I might not remember it correctly.
>But anyway, if you look at channel-webdav.c and vmcstream.c, you
>should hopefully get a better idea.
>
>Cheers,
>Jakub
>
>On Mon, Jun 15, 2020 at 12:52 PM 陈炤 <qishiye...@126.com> wrote:
>>
>> Hi,
>>
>> After debugging, I  think my problem is probably not accociated with 
>> cooperative multitasking.
>> Here is where spice-gtk read data:
>>
>>     /* treat all incoming data (block on message completion) */
>>     while (!c->has_error &&
>>            c->state != SPICE_CHANNEL_STATE_MIGRATING &&
>>            
>> g_pollable_input_stream_is_readable(G_POLLABLE_INPUT_STREAM(c->in))
>>     ) { do
>>             spice_channel_recv_msg(channel,
>>                                    
>> (handler_msg_in)SPICE_CHANNEL_GET_CLASS(channel)->handle_msg, NULL);
>> #ifdef HAVE_SASL
>>             /* flush the sasl buffer too */
>>         while (c->sasl_decoded != NULL);
>> #else
>>         while (FALSE);
>> #endif
>>     }
>>
>>
>> If vdagent sends lots of data, spice_channel_recv_msg will be called the 
>> whole time, so iterate_write will not be called, and data will not be sent 
>> out unless vdagent stops sending data.
>>
>> BR
>> Don
>>
>>
>>
>>
>> At 2020-06-13 14:40:02, "Frediano Ziglio" <fzig...@redhat.com> wrote:
>>
>> Hi,
>>   the pattern used in spice-gtk is called cooperative multitasking (see 
>> https://en.wikipedia.org/wiki/Cooperative_multitasking), if you add code 
>> that is not cooperative you get what you described. Use coroutine functions 
>> to read remote data so the read won't stop other code. If you need to run 
>> expensive or blocking code it's a good idea to run it in another thread 
>> removing the blockage.
>>
>> Frediano
>>
>> ________________________________
>>
>>
>>
>> Hi
>>
>> Here is my experiment:
>> I created a new port-channel to transfer data between vdagent and spice-gtk. 
>> I used a while loop to send 2kb data to gtk, gtk received and drop the data. 
>> In the mean time I used a timer(1ms) to send 2kb data to vdagent.
>> Strange thing is that gtk will continually receive data for a while(10secs - 
>> 70secs) then send a whole bunch of data to vdagent. When receiving data, 
>> send data will be added to tcp buffer but will not be sent out.
>>
>> So I think send event will be affected by receive event, then I guess using 
>> different thread would help.
>> Could you please correct me if I’m wrong?
>>
>> BR
>> Don
>>
>>
>>
>>
>>
>>
>>
>>
>> 在 2020-06-12 20:03:30,"Marc-André Lureau" <marcandre.lur...@gmail.com> 写道:
>>
>> Hi
>>
>> On Fri, Jun 12, 2020 at 12:57 PM 陈炤 <qishiye...@126.com> wrote:
>>>
>>> Hi,
>>>
>>> Spice-gtk is now using co-routine to handle different channel connections. 
>>> When a channel is handling data, other channels would have to wait, rather 
>>> than handling synchronously.  That would bring us following issues:
>>>  1. If some less important channels (like usb channels) are transfering big 
>>> data, important channels (main-channel, display-channel,input-channel) will 
>>> be affected.
>>>  2. When receiving big data like file transfering(G_IO_IN), send event 
>>> (G_IO_OUT) will not be triggered.
>>>  3. Flow control between different channels will be hard to do.
>>>
>>> Is is possible(and make sense) to put channels into different threads so 
>>> they can synchronously receive & send msg, without affect each other?
>>>
>>
>> Switching to threads would be possible, but that wouldn't help in the 
>> situation you describe, as you are very likely bound on IO. Using several 
>> threads would actually create more problems to synchronize and schedule the 
>> different channels.
>>
>> Io operations in coroutines are non-blocking, so they shouldn't affect other 
>> spice-gtk task. If you however observe a blocking CPU-task in some channel, 
>> this may affect the performance of other channels. But in general, except 
>> for video/image decoding which may be done in a separate thread, the client 
>> side doesn't do much work.
>>
>> USB, clipboard and file sharing may use large amounts of data, and we rely 
>> on the glib source and kernel to prioritize channels: this isn't great in 
>> some cases and may receive improvements.
>>
>>
>> --
>> Marc-André Lureau
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Spice-devel mailing list
>> Spice-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/spice-devel
>>
>>
>> _______________________________________________
>> Spice-devel mailing list
>> Spice-devel@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/spice-devel
_______________________________________________
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/spice-devel

Reply via email to