After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 784769 - Deadlock in ges-launch between the gst_plugin_loading_mutex and class_init_rec_mutex
Deadlock in ges-launch between the gst_plugin_loading_mutex and class_init_re...
Status: RESOLVED FIXED
Product: GStreamer
Classification: Platform
Component: gst-editing-services
1.x
Other Linux
: Normal normal
: 1.12.2
Assigned To: GStreamer Maintainers
GStreamer Maintainers
Depends on:
Blocks:
 
 
Reported: 2017-07-10 22:27 UTC by Thibault Saunier
Modified: 2017-07-11 14:40 UTC
See Also:
GNOME target: ---
GNOME version: ---


Attachments
ges: Ref the GES class to avoid later deadlock (1.98 KB, patch)
2017-07-11 01:46 UTC, Nicolas Dufresne (ndufresne)
none Details | Review
[V2] ges: Ref the GES class to avoid later deadlock (1.93 KB, patch)
2017-07-11 02:10 UTC, Nicolas Dufresne (ndufresne)
committed Details | Review

Description Thibault Saunier 2017-07-10 22:27:35 UTC
This deadlock happens launching the following project:
https://www.dropbox.com/s/2y0wip2ra2nyonw/deadlock_on_load_in_ges_launch.xges_tar?dl=0

Backtrace:

Thread 5 (Thread 0x7fb3f0be5700 (LWP 20683))

  • #0 __lll_lock_wait
    from /usr/lib/libpthread.so.0
  • #1 pthread_mutex_lock
    from /usr/lib/libpthread.so.0
  • #2 g_rec_mutex_lock
    at ../subprojects/glib/glib/gthread-posix.c line 387
  • #3 g_type_add_interface_static
    at ../subprojects/glib/gobject/gtype.c line 2842
  • #4 gst_audio_encoder_get_type
    at ../subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioencoder.c line 281
  • #5 gst_ffmpegaudenc_register
    at ../subprojects/gst-libav/ext/libav/gstavaudenc.c line 840
  • #6 plugin_init
    at ../subprojects/gst-libav/ext/libav/gstav.c line 163
  • #7 gst_plugin_register_func
    at ../subprojects/gstreamer/gst/gstplugin.c line 524
  • #8 _priv_gst_plugin_load_file_for_registry
  • #9 gst_plugin_load_file
    at ../subprojects/gstreamer/gst/gstplugin.c line 681
  • #10 gst_plugin_load_by_name
    at ../subprojects/gstreamer/gst/gstplugin.c line 1324
  • #11 gst_plugin_feature_load
    at ../subprojects/gstreamer/gst/gstpluginfeature.c line 112
  • #12 gst_element_factory_create
    at ../subprojects/gstreamer/gst/gstelementfactory.c line 349
  • #13 connect_pad
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 2247
  • #14 analyze_new_pad
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 1787
  • #15 pad_added_cb
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 2928
  • #16 caps_notify_cb
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 3118
  • #17 g_cclosure_marshal_VOID__PARAM
    at ../subprojects/glib/gobject/gmarshal.c line 1832
  • #18 g_closure_invoke
    at ../subprojects/glib/gobject/gclosure.c line 804
  • #19 signal_emit_unlocked_R
    at ../subprojects/glib/gobject/gsignal.c line 3635
  • #20 g_signal_emit_valist
    at ../subprojects/glib/gobject/gsignal.c line 3391
  • #21 g_signal_emit
    at ../subprojects/glib/gobject/gsignal.c line 3447
  • #22 g_object_dispatch_properties_changed
    at ../subprojects/glib/gobject/gobject.c line 1064
  • #23 gst_object_dispatch_properties_changed
    at ../subprojects/gstreamer/gst/gstobject.c line 427
  • #24 g_object_notify_by_spec_internal
    at ../subprojects/glib/gobject/gobject.c line 1157
  • #25 g_object_notify_by_pspec
    at ../subprojects/glib/gobject/gobject.c line 1267
  • #26 store_sticky_event
    at ../subprojects/gstreamer/gst/gstpad.c line 5105
  • #27 gst_pad_push_event
    at ../subprojects/gstreamer/gst/gstpad.c line 5383
  • #28 gst_pad_set_caps
    at ../subprojects/gstreamer/gst/gstcompat.h line 59
  • #29 gst_base_transform_setcaps
    at ../subprojects/gstreamer/libs/gst/base/gstbasetransform.c line 1319
  • #30 gst_base_transform_sink_eventfunc
    at ../subprojects/gstreamer/libs/gst/base/gstbasetransform.c line 1880
  • #31 gst_capsfilter_sink_event
    at ../subprojects/gstreamer/plugins/elements/gstcapsfilter.c line 521
  • #32 gst_base_transform_sink_event
    at ../subprojects/gstreamer/libs/gst/base/gstbasetransform.c line 1839
  • #33 gst_pad_send_event_unchecked
    at ../subprojects/gstreamer/gst/gstpad.c line 5608
  • #34 gst_pad_push_event_unchecked
    at ../subprojects/gstreamer/gst/gstpad.c line 5264
  • #35 push_sticky
    at ../subprojects/gstreamer/gst/gstpad.c line 3807
  • #36 events_foreach
    at ../subprojects/gstreamer/gst/gstpad.c line 604
  • #37 check_sticky
    at ../subprojects/gstreamer/gst/gstpad.c line 3864
  • #38 gst_pad_push_event
    at ../subprojects/gstreamer/gst/gstpad.c line 5395
  • #39 gst_pad_set_caps
    at ../subprojects/gstreamer/gst/gstcompat.h line 59
  • #40 gst_h264_parse_update_src_caps
    at ../subprojects/gst-plugins-bad/gst/videoparsers/gsth264parse.c line 1962
  • #41 gst_h264_parse_set_caps
    at ../subprojects/gst-plugins-bad/gst/videoparsers/gsth264parse.c line 2697
  • #42 gst_base_parse_sink_event_default
    at ../subprojects/gstreamer/libs/gst/base/gstbaseparse.c line 1153
  • #43 gst_h264_parse_event
    at ../subprojects/gst-plugins-bad/gst/videoparsers/gsth264parse.c line 2867
  • #44 gst_base_parse_sink_event
    at ../subprojects/gstreamer/libs/gst/base/gstbaseparse.c line 1118
  • #45 gst_pad_send_event_unchecked
    at ../subprojects/gstreamer/gst/gstpad.c line 5608
  • #46 gst_pad_send_event
    at ../subprojects/gstreamer/gst/gstpad.c line 5778
  • #47 send_sticky_event
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 1958
  • #48 foreach_dispatch_function
    at ../subprojects/gstreamer/gst/gstpad.c line 5877
  • #49 events_foreach
    at ../subprojects/gstreamer/gst/gstpad.c line 604
  • #50 gst_pad_sticky_events_foreach
    at ../subprojects/gstreamer/gst/gstpad.c line 5908
  • #51 send_sticky_events
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 1973
  • #52 connect_pad
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 2495
  • #53 analyze_new_pad
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 1787
  • #54 pad_added_cb
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 2928
  • #55 ffi_call_unix64
    from /usr/lib/libffi.so.6
  • #56 ffi_call
    from /usr/lib/libffi.so.6
  • #57 g_cclosure_marshal_generic
    at ../subprojects/glib/gobject/gclosure.c line 1490
  • #58 g_closure_invoke
    at ../subprojects/glib/gobject/gclosure.c line 804
  • #59 signal_emit_unlocked_R
    at ../subprojects/glib/gobject/gsignal.c line 3635
  • #60 g_signal_emit_valist
    at ../subprojects/glib/gobject/gsignal.c line 3391
  • #61 g_signal_emit
    at ../subprojects/glib/gobject/gsignal.c line 3447
  • #62 gst_element_add_pad
    at ../subprojects/gstreamer/gst/gstelement.c line 715
  • #63 gst_qtdemux_add_stream
    at ../subprojects/gst-plugins-good/gst/isomp4/qtdemux.c line 8084
  • #64 qtdemux_expose_streams
    at ../subprojects/gst-plugins-good/gst/isomp4/qtdemux.c line 11865
  • #65 gst_qtdemux_loop_state_header
    at ../subprojects/gst-plugins-good/gst/isomp4/qtdemux.c line 4451
  • #66 gst_qtdemux_loop
    at ../subprojects/gst-plugins-good/gst/isomp4/qtdemux.c line 5932
  • #67 gst_task_func
    at ../subprojects/gstreamer/gst/gsttask.c line 332
  • #68 default_func
    at ../subprojects/gstreamer/gst/gsttaskpool.c line 69
  • #69 g_thread_pool_thread_proxy
    at ../subprojects/glib/glib/gthreadpool.c line 307
  • #70 g_thread_proxy
    at ../subprojects/glib/glib/gthread.c line 784
  • #71 start_thread
    from /usr/lib/libpthread.so.0
  • #72 clone
    from /usr/lib/libc.so.6

Thread 1 (Thread 0x7fb3fb3d40c0 (LWP 20679))

  • #0 __lll_lock_wait
    from /usr/lib/libpthread.so.0
  • #1 pthread_mutex_lock
    from /usr/lib/libpthread.so.0
  • #2 g_mutex_lock
    at ../subprojects/glib/glib/gthread-posix.c line 214
  • #3 _priv_gst_plugin_load_file_for_registry
    at ../subprojects/gstreamer/gst/gstplugin.c line 745
  • #4 gst_plugin_load_file
    at ../subprojects/gstreamer/gst/gstplugin.c line 681
  • #5 gst_plugin_load_by_name
    at ../subprojects/gstreamer/gst/gstplugin.c line 1324
  • #6 gst_plugin_feature_load
    at ../subprojects/gstreamer/gst/gstpluginfeature.c line 112
  • #7 gst_element_factory_create
    at ../subprojects/gstreamer/gst/gstelementfactory.c line 349
  • #8 ges_effect_class_register_rate_property
    at ../subprojects/gst-editing-services/ges/ges-effect.c line 325
  • #9 ges_effect_class_init
    at ../subprojects/gst-editing-services/ges/ges-effect.c line 164
  • #10 ges_effect_class_intern_init
    at ../subprojects/gst-editing-services/ges/ges-effect.c line 36
  • #11 type_class_init_Wm
    at ../subprojects/glib/gobject/gtype.c line 2232
  • #12 g_type_class_ref
    at ../subprojects/glib/gobject/gtype.c line 2947
  • #13 ges_timeline_element_get_media_duration_factor
    at ../subprojects/gst-editing-services/ges/ges-timeline-element.c line 1827
  • #14 ges_track_element_constructed
    at ../subprojects/gst-editing-services/ges/ges-track-element.c line 233
  • #15 g_object_new_internal
    at ../subprojects/glib/gobject/gobject.c line 1821
  • #16 g_object_new_valist
    at ../subprojects/glib/gobject/gobject.c line 2104
  • #17 g_object_new
    at ../subprojects/glib/gobject/gobject.c line 1624
  • #18 ges_audio_transition_new
    at ../subprojects/gst-editing-services/ges/ges-audio-transition.c line 296
  • #19 _create_track_element
    at ../subprojects/gst-editing-services/ges/ges-transition-clip.c line 324
  • #20 ges_clip_create_track_element
    at ../subprojects/gst-editing-services/ges/ges-clip.c line 879
  • #21 ges_clip_create_track_elements_func
    at ../subprojects/gst-editing-services/ges/ges-clip.c line 961
  • #22 ges_clip_create_track_elements
    at ../subprojects/gst-editing-services/ges/ges-clip.c line 928
  • #23 add_object_to_tracks
    at ../subprojects/gst-editing-services/ges/ges-timeline.c line 2257
  • #24 layer_object_added_cb
    at ../subprojects/gst-editing-services/ges/ges-timeline.c line 2482
  • #25 ffi_call_unix64
    from /usr/lib/libffi.so.6
  • #26 ffi_call
    from /usr/lib/libffi.so.6
  • #27 g_cclosure_marshal_generic
    at ../subprojects/glib/gobject/gclosure.c line 1490
  • #28 g_closure_invoke
    at ../subprojects/glib/gobject/gclosure.c line 804
  • #29 signal_emit_unlocked_R
    at ../subprojects/glib/gobject/gsignal.c line 3705
  • #30 g_signal_emit_valist
    at ../subprojects/glib/gobject/gsignal.c line 3391
  • #31 g_signal_emit
    at ../subprojects/glib/gobject/gsignal.c line 3447
  • #32 ges_layer_add_clip
    at ../subprojects/gst-editing-services/ges/ges-layer.c line 631
  • #33 ges_layer_add_asset
    at ../subprojects/gst-editing-services/ges/ges-layer.c line 689
  • #34 _add_object_to_layer
    at ../subprojects/gst-editing-services/ges/ges-base-xml-formatter.c line 535
  • #35 ges_base_xml_formatter_add_clip
    at ../subprojects/gst-editing-services/ges/ges-base-xml-formatter.c line 939
  • #36 _parse_clip
    at ../subprojects/gst-editing-services/ges/ges-xml-formatter.c line 502
  • #37 _parse_element_start
    at ../subprojects/gst-editing-services/ges/ges-xml-formatter.c line 762
  • #38 emit_start_element
    at ../subprojects/glib/glib/gmarkup.c line 1041
  • #39 g_markup_parse_context_parse
  • #40 create_parser_context
    at ../subprojects/gst-editing-services/ges/ges-base-xml-formatter.c line 195
  • #41 _load_from_uri
    at ../subprojects/gst-editing-services/ges/ges-base-xml-formatter.c line 255
  • #42 ges_formatter_load_from_uri
    at ../subprojects/gst-editing-services/ges/ges-formatter.c line 362
  • #43 _load_project
    at ../subprojects/gst-editing-services/ges/ges-project.c line 210
  • #44 ges_project_extract
    at ../subprojects/gst-editing-services/ges/ges-project.c line 251
  • #45 ges_asset_extract
    at ../subprojects/gst-editing-services/ges/ges-asset.c line 1230
  • #46 _create_timeline
    at ../subprojects/gst-editing-services/tools/ges-launcher.c line 230
  • #47 _create_pipeline
    at ../subprojects/gst-editing-services/tools/ges-launcher.c line 486
  • #48 _startup
    at ../subprojects/gst-editing-services/tools/ges-launcher.c line 770
  • #49 g_cclosure_marshal_VOID__VOID
    at ../subprojects/glib/gobject/gmarshal.c line 875
  • #50 g_type_class_meta_marshal
    at ../subprojects/glib/gobject/gclosure.c line 997
  • #51 g_closure_invoke
    at ../subprojects/glib/gobject/gclosure.c line 804
  • #52 signal_emit_unlocked_R
    at ../subprojects/glib/gobject/gsignal.c line 3565
  • #53 g_signal_emit_valist
    at ../subprojects/glib/gobject/gsignal.c line 3391
  • #54 g_signal_emit
    at ../subprojects/glib/gobject/gsignal.c line 3447
  • #55 g_application_register
    at ../subprojects/glib/gio/gapplication.c line 2049
  • #56 _local_command_line
    at ../subprojects/gst-editing-services/tools/ges-launcher.c line 739
  • #57 g_application_run
    at ../subprojects/glib/gio/gapplication.c line 2350
  • #58 main
    at ../subprojects/gst-editing-services/tools/ges-launch.c line 88
  • #2 g_mutex_lock
    at ../subprojects/glib/glib/gthread-posix.c line 214
  • #0 __lll_lock_wait
    from /usr/lib/libpthread.so.0
  • #0 __lll_lock_wait
    from /usr/lib/libpthread.so.0
  • #1 pthread_mutex_lock
    from /usr/lib/libpthread.so.0
  • #2 g_rec_mutex_lock
    at ../subprojects/glib/glib/gthread-posix.c line 387
  • #3 g_type_add_interface_static
    at ../subprojects/glib/gobject/gtype.c line 2842
  • #4 gst_audio_encoder_get_type
    at ../subprojects/gst-plugins-base/gst-libs/gst/audio/gstaudioencoder.c line 281
  • #5 gst_ffmpegaudenc_register
    at ../subprojects/gst-libav/ext/libav/gstavaudenc.c line 840
  • #6 plugin_init
    at ../subprojects/gst-libav/ext/libav/gstav.c line 163
  • #7 gst_plugin_register_func
    at ../subprojects/gstreamer/gst/gstplugin.c line 524
  • #8 _priv_gst_plugin_load_file_for_registry
    at ../subprojects/gstreamer/gst/gstplugin.c line 885
  • #9 gst_plugin_load_file
    at ../subprojects/gstreamer/gst/gstplugin.c line 681
  • #10 gst_plugin_load_by_name
    at ../subprojects/gstreamer/gst/gstplugin.c line 1324
  • #11 gst_plugin_feature_load
    at ../subprojects/gstreamer/gst/gstpluginfeature.c line 112
  • #12 gst_element_factory_create
    at ../subprojects/gstreamer/gst/gstelementfactory.c line 349
  • #13 connect_pad
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 2247
  • #14 analyze_new_pad
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 1787
  • #15 pad_added_cb
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 2928
  • #16 caps_notify_cb
    at ../subprojects/gst-plugins-base/gst/playback/gstdecodebin2.c line 3118
  • #17 g_cclosure_marshal_VOID__PARAM
    at ../subprojects/glib/gobject/gmarshal.c line 1832
  • #18 g_closure_invoke
    at ../subprojects/glib/gobject/gclosure.c line 804
  • #19 signal_emit_unlocked_R
    at ../subprojects/glib/gobject/gsignal.c line 3635
  • #20 g_signal_emit_valist
    at ../subprojects/glib/gobject/gsignal.c line 3391
  • #21 g_signal_emit
    at ../subprojects/glib/gobject/gsignal.c line 3447
  • #22 g_object_dispatch_properties_changed
    at ../subprojects/glib/gobject/gobject.c line 1064
  • #23 gst_object_dispatch_properties_changed
    at ../subprojects/gstreamer/gst/gstobject.c line 427
  • #24 g_object_notify_by_spec_internal
    at ../subprojects/glib/gobject/gobject.c line 1157
  • #25 g_object_notify_by_pspec
    at ../subprojects/glib/gobject/gobject.c line 1267
  • #26 store_sticky_event
    at ../subprojects/gstreamer/gst/gstpad.c line 5105
  • #27 gst_pad_push_event
    at ../subprojects/gstreamer/gst/gstpad.c line 5383
  • #28 gst_pad_set_caps
    at ../subprojects/gstreamer/gst/gstcompat.h line 59
  • #29 gst_base_transform_setcaps
    at ../subprojects/gstreamer/libs/gst/base/gstbasetransform.c line 1319
  • #30 gst_base_transform_sink_eventfunc
    at ../subprojects/gstreamer/libs/gst/base/gstbasetransform.c line 1880
  • #31 gst_capsfilter_sink_event
    at ../subprojects/gstreamer/plugins/elements/gstcapsfilter.c line 521
  • #32 gst_base_transform_sink_event
    at ../subprojects/gstreamer/libs/gst/base/gstbasetransform.c line 1839
  • #33 gst_pad_send_event_unchecked
    at ../subprojects/gstreamer/gst/gstpad.c line 5608
  • #34 gst_pad_push_event_unchecked
    at ../subprojects/gstreamer/gst/gstpad.c line 5264
  • #35 push_sticky
    at ../subprojects/gstreamer/gst/gstpad.c line 3807
  • #36 events_foreach
    at ../subprojects/gstreamer/gst/gstpad.c line 604
  • #37 check_sticky
    at ../subprojects/gstreamer/gst/gstpad.c line 3864
  • #38 gst_pad_push_event
    at ../subprojects/gstreamer/gst/gstpad.c line 5395
  • #39 gst_pad_set_caps
    at ../subprojects/gstreamer/gst/gstcompat.h line 59
  • #40 gst_h264_parse_update_src_caps
    at ../subprojects/gst-plugins-bad/gst/videoparsers/gsth264parse.c line 1962
  • #41 gst_h264_parse_set_caps
    at ../subprojects/gst-plugins-bad/gst/videoparsers/gsth264parse.c line 2697
  • #42 gst_base_parse_sink_event_default
    at ../subprojects/gstreamer/libs/gst/base/gstbaseparse.c line 1153
  • #43 gst_h264_parse_event
    at ../subprojects/gst-plugins-bad/gst/videoparsers/gsth264parse.c line 2867
  • #44 gst_base_parse_sink_event
    at ../subprojects/gstreamer/libs/gst/base/gstbaseparse.c line 1118
  • #45 gst_pad_send_event_unchecked
    at ../subprojects/gstreamer/gst/gstpad.c line 5608
  • #46 gst_pad_send_event
    at ../subprojects/gstreamer/gst/gstpad.c line 5778
  • #2 g_rec_mutex_lock
    at ../subprojects/glib/glib/gthread-posix.c line 387
$6 = 20679


Basically we are discovering a file which in turn leads to ffmpeg plugin loading (trying to get the class_init_rec_mutex while holding the in the Gst gst_plugin_loading_mutex) and at the same time we create a GES effect which in turns lead to trying to get the class_init_rec_mutex while holding gst_plugin_loading_mutex) -> Deadlock
Comment 1 Nicolas Dufresne (ndufresne) 2017-07-11 00:50:31 UTC
So it's a locking order problem. Is there a way you could avoid gst_element_factory_make() from a _class_init function ? Or maybe we could drop the registry lock while loading an element, and retake it later (with obviously risking loading the same element twice, but when we take back the log, we could lookup the registry again maybe, we are already in the slow path anyway.
Comment 2 Nicolas Dufresne (ndufresne) 2017-07-11 01:21:28 UTC
Second option is just not an option, since dropping that lock may lead to gst_plugin_register_func() being called twice for the same plugin in parallel. Some register function like gst_ffmpegaudenc_register() are just not thread safe from quick code inspection (would need a g_once or something to block, we just do g_type_from_name(), if (!type) ..., which may lead to two calls to g_type_register_static() (an undefined behaviour in glib according to the comment in the code).
Comment 3 Nicolas Dufresne (ndufresne) 2017-07-11 01:46:19 UTC
Created attachment 355305 [details] [review]
ges: Ref the GES class to avoid later deadlock

This ensure that that all class are initialized from the main thread,
avoid class initialization in random thread, which may cause deadlocks.
This will effectively leak the class instance, as done in GStreamer,
which mean the if GES is pulled from a shared object, it cannot be
unloaded and reloaded anymore. This was probably already the case due to
the dependency on GStreamer.

This should fix this bug, as the GesEffect class init should have been run
now at this point.
Comment 4 Nicolas Dufresne (ndufresne) 2017-07-11 01:59:13 UTC
Review of attachment 355305 [details] [review]:

I just tested, fixes the bug, though GESMetaContainer seems special:

  GLib-GObject-WARNING **: cannot retrieve class for invalid (unclassed) type 'GESMetaContainer'
Comment 5 Nicolas Dufresne (ndufresne) 2017-07-11 02:01:31 UTC
(Side note, the provided project need manual path edit due to absolute path, am I using it wrong ?)
Comment 6 Nicolas Dufresne (ndufresne) 2017-07-11 02:10:11 UTC
Created attachment 355307 [details] [review]
[V2] ges: Ref the GES class to avoid later deadlock

V2: MetaContainer is an interface, pulled by Asset already

This ensure that that all class are initialized from the main thread,
avoid class initialization in random thread, which may cause deadlocks.
This will effectively leak the class instance, as done in GStreamer,
which mean the if GES is pulled from a shared object, it cannot be
unloaded and reloaded anymore. This was probably already the case due to
the dependency on GStreamer.
Comment 7 Thibault Saunier 2017-07-11 14:40:03 UTC
Added unrefed and pushed as:

commit c5eae31cf7cd30d2a42533bd9b60f89149261d2e (HEAD -> master, origin/master, origin/HEAD)
Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Date:   Mon Jul 10 21:42:21 2017 -0400

    ges: Ref the GES class to avoid later deadlock
    
    This ensure that that all class are initialized from the main thread,
    avoid class initialization in random thread, which may cause deadlocks.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=784769


Also backported to 1.12,(In reply to Nicolas Dufresne (stormer) from comment #5)

> (Side note, the provided project need manual path edit due to absolute path,
> am I using it wrong ?)

You could have used `--ges-sample-path-recurse=file://path/to/extracted_files/` and GES would have handled it all for you.