Merge "Resource ready signal for Controls (for ImageLoading)" into devel/master
[platform/core/uifw/dali-toolkit.git] / plugins / dali-sharp / sharp / internal / DisposeQueue.cs
1 // Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved
2 // PROPRIETARY/CONFIDENTIAL
3 // This software is the confidential and proprietary
4 // information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
5 // not disclose such Confidential Information and shall use it only in
6 // accordance with the terms of the license agreement you entered into with
7 // SAMSUNG ELECTRONICS.
8 //
9
10 using System;
11 using System.Collections.Generic;
12
13 namespace Dali
14 {
15     public class DisposeQueue
16     {
17         private static readonly DisposeQueue _disposableQueue = new DisposeQueue();
18         private List<IDisposable> _disposables = new List<IDisposable>();
19         private Object _listLock = new object();
20         private EventThreadCallback _eventThreadCallback;
21         private EventThreadCallback.CallbackDelegate _disposeQueueProcessDisposablesDelegate;
22
23         private DisposeQueue()
24         {
25         }
26
27         ~DisposeQueue()
28         {
29         }
30
31         public static DisposeQueue Instance
32         {
33             get { return _disposableQueue; }
34         }
35
36         public void Initialize()
37         {
38             _disposeQueueProcessDisposablesDelegate = new EventThreadCallback.CallbackDelegate(ProcessDisposables);
39             _eventThreadCallback = new EventThreadCallback(_disposeQueueProcessDisposablesDelegate);
40         }
41
42         public void Add(IDisposable disposable)
43         {
44             lock (_listLock)
45             {
46                 _disposables.Add(disposable);
47             }
48
49             _eventThreadCallback.Trigger();
50         }
51
52         private void ProcessDisposables()
53         {
54             lock (_listLock)
55             {
56                 foreach (IDisposable disposable in _disposables)
57                 {
58                     disposable.Dispose();
59                 }
60                 _disposables.Clear();
61             }
62         }
63     }
64 }