<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="margin: 0;">Hi,</div><div style="margin: 0;"><br></div><div style="margin: 0;">After debugging, I  think my problem is probably not accociated with cooperative multitasking.</div><div style="margin: 0;">Here is where spice-gtk read data:</div><div style="margin: 0;"><br></div><div style="margin: 0;"><div style="color: rgb(212, 212, 212); background-color: rgb(30, 30, 30); font-family: Consolas, "Courier New", monospace; line-height: 19px; white-space: pre;"><div>    <span style="color: #6a9955;">/* treat all incoming data (block on message completion) */</span></div><div>    <span style="color: #c586c0;">while</span> (!<span style="color: #9cdcfe;">c</span>-><span style="color: #9cdcfe;">has_error</span> &&</div><div>           <span style="color: #9cdcfe;">c</span>-><span style="color: #9cdcfe;">state</span> != SPICE_CHANNEL_STATE_MIGRATING &&</div><div>           <span style="color: #dcdcaa;">g_pollable_input_stream_is_readable</span>(<span style="color: #dcdcaa;">G_POLLABLE_INPUT_STREAM</span>(<span style="color: #9cdcfe;">c</span>-><span style="color: #9cdcfe;">in</span>))</div><div>    ) { <span style="color: #c586c0;">do</span></div><div>            <span style="color: #dcdcaa;">spice_channel_recv_msg</span>(channel,</div><div>                                   (handler_msg_in)<span style="color: #dcdcaa;">SPICE_CHANNEL_GET_CLASS</span>(channel)-><span style="color: #9cdcfe;">handle_msg</span>, <span style="color: #569cd6;">NULL</span>);</div><div><span style="color: #c586c0;">#ifdef</span><span style="color: #569cd6;"> HAVE_SASL</span></div><div>            <span style="color: #6a9955;">/* flush the sasl buffer too */</span></div><div>        <span style="color: #c586c0;">while</span> (<span style="color: #9cdcfe;">c</span>-><span style="color: #9cdcfe;">sasl_decoded</span> != <span style="color: #569cd6;">NULL</span>);</div><div><span style="color: #c586c0;">#else</span></div><div>        <span style="color: #c586c0;">while</span> (<span style="color: #569cd6;">FALSE</span>);</div><div><span style="color: #c586c0;">#endif</span></div><div>    }</div></div></div><p style="margin: 0;"><br></p><div style="margin: 0;">If vdagent sends lots of data, <span style="color: rgb(220, 220, 170); background-color: rgb(30, 30, 30); font-family: Consolas, "Courier New", monospace; white-space: pre;">spice_channel_recv_msg</span> 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.</div><div style="margin: 0;"><br></div><div style="margin: 0;">BR</div><div style="margin: 0;">Don</div><p style="margin: 0;"><br></p><p style="margin: 0;"><br></p><div style="position:relative;zoom:1"></div><div id="divNeteaseMailCard"></div><p style="margin: 0;"><br></p><p>At 2020-06-13 14:40:02, "Frediano Ziglio" <fziglio@redhat.com> wrote:</p><blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><div style="font-family: courier new,courier,monaco,monospace,sans-serif; font-size: 12pt; color: #000000"><div>Hi,</div><div>  the pattern used in spice-gtk is called cooperative multitasking (see <a href="https://en.wikipedia.org/wiki/Cooperative_multitasking">https://en.wikipedia.org/wiki/Cooperative_multitasking</a>), 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.<br></div><div><br></div><div>Frediano<br></div><div><br></div><hr id="zwchr"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;" data-mce-style="border-left: 2px solid #1010FF; margin-left: 5px; padding-left: 5px; color: #000; font-weight: normal; font-style: normal; text-decoration: none; font-family: Helvetica,Arial,sans-serif; font-size: 12pt;"><br><div><br></div>Hi <div><br></div><div>Here is my experiment:</div><div>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. </div><div>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.</div><div><br></div><div>So I think send event will be affected by receive event, then I guess using different thread would help. </div><div>Could you please correct me if I¡¯m wrong?</div><div><br></div><div>BR</div><div>Don<br><div><br></div><br><div><br></div><br><div _app=""><br></div><br><div><br></div><br>ÔÚ 2020-06-12 20:03:30£¬"Marc-Andr¨¦ Lureau" <marcandre.lureau@gmail.com> Ð´µÀ£º<br><blockquote id="isReplyContent" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid" data-mce-style="padding-left: 1ex; margin: 0px 0px 0px 0.8ex; border-left: #ccc 1px solid;"><div dir="ltr"><div dir="ltr">Hi<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jun 12, 2020 at 12:57 PM ³ÂžÝ <<a href="mailto:qishiyexu2@126.com" target="_blank" data-mce-href="mailto:qishiyexu2@126.com">qishiyexu2@126.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" data-mce-style="margin: 0px 0px 0px 0.8ex; border-left: 1px solid #cccccc; padding-left: 1ex;"><div style="line-height:1.7;color:rgb(0,0,0);font-size:14px;font-family:Arial" data-mce-style="line-height: 1.7; color: #000000; font-size: 14px; font-family: Arial;"><div style="margin:0px" data-mce-style="margin: 0px;">Hi,</div><div style="margin:0px" data-mce-style="margin: 0px;"><br></div><div style="margin:0px" data-mce-style="margin: 0px;">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:</div><div style="margin:0px" data-mce-style="margin: 0px;"> 1. If some less important channels (like usb channels) are transfering big data, important channels (main-channel, display-channel,input-channel) will be affected.  </div><div style="margin:0px" data-mce-style="margin: 0px;"> 2. When receiving big data like file transfering(G_IO_IN), send event (G_IO_OUT) will not be triggered.</div><div style="margin:0px" data-mce-style="margin: 0px;"> 3. Flow control between different channels will be hard to do. </div><div style="margin:0px" data-mce-style="margin: 0px;"><br></div><div style="margin:0px" data-mce-style="margin: 0px;">Is is possible(and make sense) to put channels into different threads so they can synchronously receive & send msg, without affect each other?</div><div style="margin:0px" data-mce-style="margin: 0px;"><br></div></div></blockquote><div><br></div><div>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.</div><div><br></div><div>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.</div><div><br></div><div>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.<br></div><div><br></div></div><br>-- <br><div dir="ltr" class="gmail_signature">Marc-Andr¨¦ Lureau<br></div></div></blockquote></div><br><div><br></div><p> </p><br>_______________________________________________<br>Spice-devel mailing list<br>Spice-devel@lists.freedesktop.org<br>https://lists.freedesktop.org/mailman/listinfo/spice-devel<br></blockquote><div><br></div></div></blockquote></div>