[Spice-devel] [PATCH 2/3] server: really wait for a surface to be destroyed, when calling destroy_surface_wait

Yonit Halperin yhalperi at redhat.com
Thu Aug 26 07:28:21 PDT 2010


On 08/26/2010 05:25 PM, Alexander Larsson wrote:
> On Thu, 2010-08-26 at 12:41 +0300, Yonit Halperin wrote:
>> Waiting till all the pipe items that are dependent on the surface will be sent.
>> This was probably the cause for freedesktop bug #29750.
>> ---
>>   server/red_worker.c |   84 +++++++++++++++++++++++++++++++++++++++++++++-----
>>   1 files changed, 75 insertions(+), 9 deletions(-)
>>
>> diff --git a/server/red_worker.c b/server/red_worker.c
>> index 1a3f755..e688971 100644
>> --- a/server/red_worker.c
>> +++ b/server/red_worker.c
>
>> +    red_printf("");
>
> Leftover?
>
>> +    red_ref_channel(channel);
>> +    channel->hold_item(item);
>> +
>> +    end_time = red_now() + CHANNEL_PUSH_TIMEOUT;
>> +
>> +    if (channel->send_data.blocked) {
>> +        red_receive(channel);
>> +        red_send_data(channel, NULL);
>> +    }
>> +    // todo: different push for each channel
>> +    red_push(channel->worker);
>
> Why do this outside the loop, and why the check on send_data.blocked. Is
> it not better to start with red_push (which will do nothing if
> send_data.blocked), then receive+send, always in the loop. Then you can
> something loop like: push, receive, send, if blocked and item_in_pipe
> usleep.
>
>> +
>> +    while((item_in_pipe = ring_item_is_linked(&item->link))&&  (red_now()<  end_time)) {
>> +        usleep(CHANNEL_PUSH_SLEEP_DURATION);
>
> Why are you sleeping between each item sent? We should only need to
> sleep when channel->send_data.blocked is true.
>
red_push doesn't send one item at a time, but rather pushes till it 
blocks (due to socket block or missing acks). So if the item is still in 
the pipe, it means that channel->send_data.blocked
>> +        red_receive(channel);
>> +        red_send_data(channel, NULL);
>> +        red_push(channel->worker);
>> +    }
>
> Also, I'm generally worried a bit about the red_receive calls. While
> waiting for sending the stuff in the pipe, handling the
> destroy_surface_wait we may handle an incoming message from the client
> which sort of reenters the existing call stack. Isn't there a risk that
> such reentrancy causes problems? like deadlocks or weird crashes?
>
>
First, we must call red_receive, since if we are missing acks, we won't 
get out of the blocking mode. Second, I don't think that any message 
from the client can cause re-entering to this call stack.





More information about the Spice-devel mailing list