[vlc-devel] [PATCH v2 2/4] macosx: wait until the View is removed from its parent in Close

Steve Lhomme robux4 at ycbcr.xyz
Tue Nov 3 11:17:30 CET 2020


On 2020-11-03 10:50, Marvin Scholz wrote:
> Hi,
> 
> On 3 Nov 2020, at 8:46, Steve Lhomme wrote:
> 
>> ---
>>   modules/video_output/macosx.m | 22 +++++++++++++++++++++-
>>   1 file changed, 21 insertions(+), 1 deletion(-)
>>
>> diff --git a/modules/video_output/macosx.m b/modules/video_output/macosx.m
>> index bcb71579d68..7143c2528fd 100644
>> --- a/modules/video_output/macosx.m
>> +++ b/modules/video_output/macosx.m
>> @@ -46,6 +46,7 @@
>>   #include <vlc_vout_display.h>
>>   #include <vlc_opengl.h>
>>   #include <vlc_dialog.h>
>> +#include <vlc_threads.h>
>>   #include "opengl/filter_draw.h"
>>   #include "opengl/renderer.h"
>>   #include "opengl/vout_helper.h"
>> @@ -98,9 +99,12 @@ vlc_module_end ()
>>       vout_display_t *vd;
>>       vout_window_t *window;
>>       BOOL _hasPendingReshape;
>> +    vlc_sem_t removed;
>>   }
>>   - (void)setVoutWindow:(vout_window_t *)aWindow;
>>   - (void)setVoutDisplay:(vout_display_t *)vd;
>> +- (void)didMoveToSuperview;
>> +- (void)waitRemoved;
>>   - (void)setVoutFlushing:(BOOL)flushing;
>>   @end
>>
>> @@ -303,9 +307,11 @@ static void Close(vout_display_t *vd)
>>               /* release on main thread as explained in Open() */
>>               [viewContainer release];
>>               [glView removeFromSuperview];
>> -            [glView release];
>>           });
>>
>> +        [glView waitRemoved];
>> +        [glView release];
>> +
>>           free (sys);
>>       }
>>   }
>> @@ -531,8 +537,22 @@ static void OpenglSwap (vlc_gl_t *gl)
>>       [self setFrame:[parentView bounds]];
>>   }
>>
>> +- (void)didMoveToSuperview:
>> +{
>> +    if (superview != nil)
>> +        vlc_sem_wait(&removed); // not removed anymore
>> +    else
>> +        vlc_sem_post(&removed); // removed again
>> +}
>> +
>> +- (void)waitRemoved:
>> +{
>> +    vlc_sem_wait(&removed);
>> +}
>> +
> 
> Won't this deadlock, just like using a dispatch sync would deadlock?
> As during close vlc blocks the main thread waiting for the Close to finish,

How would it block the main (UI) thread ? In my solution (cleaner patch 
coming as soon as I can confirm they compile, maybe in an hour or two) 
the glView is released *outside* of the UI thread. And only when the 
view is not attached anymore.
(for now it's pushed here 
https://code.videolan.org/robUx4/vlc/-/blob/bd92e048e0f60764730dcb8d96bfc4218e7ab913/modules/video_output/macosx.m#L273)

The only thing done in the UI thread is detaching the view from the rest 
of the view hierarchy. It may take some time but that should not wait 
for anything happening in the core. When calling Close the core is not 
supposed to do any other call. But it may happen, forwarding pending 
mouse events for example. All of these calls should not be blocking in 
the display module. Further patches in the patchset remove all the 
@synchronized left. So the only lock involved is the display_lock from 
the core.

And I think that's the problem you and Alexandre mention and that is not 
solved: The Close is called under display_lock and the pending mouse 
event(s) will also require the display_lock, from the UI thread. That 
will lead to a deadlock.

So for now, until the window/UI thread is detached from the mac display 
module, it's better to revert the patch I did in the core.

> but close waits for an action that needs to happen on the main thread,
> which can never happen, leading to waiting forever on the semaphore.
> 
>>   - (void)setVoutWindow:(vout_window_t *)aWindow
>>   {
>> +    vlc_sem_init(&removed, 1);
>>       window = aWindow;
>>   }
>>
>> -- 
>> 2.26.2
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 


More information about the vlc-devel mailing list