[NUI] Fix Svace issue (#949)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / DisposeQueue.cs
1 // Copyright (c) 2016 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 Tizen.NUI
14 {
15
16     internal class DisposeQueue
17     {
18         private static readonly DisposeQueue _disposableQueue = new DisposeQueue();
19         private List<IDisposable> _disposables = new List<IDisposable>();
20         private System.Object _listLock = new object();
21         private EventThreadCallback _eventThreadCallback;
22         private EventThreadCallback.CallbackDelegate _disposeQueueProcessDisposablesDelegate;
23
24         private DisposeQueue()
25         {
26         }
27
28         ~DisposeQueue()
29         {
30         }
31
32         public static DisposeQueue Instance
33         {
34             get { return _disposableQueue; }
35         }
36
37         private bool _isCalled = false;
38         public void Initialize()
39         {
40             if(_isCalled == false)
41             {
42             _disposeQueueProcessDisposablesDelegate = new EventThreadCallback.CallbackDelegate(ProcessDisposables);
43             _eventThreadCallback = new EventThreadCallback(_disposeQueueProcessDisposablesDelegate);
44                 _isCalled = true;
45             }
46         }
47
48         public void Add(IDisposable disposable)
49         {
50             lock (_listLock)
51             {
52                 _disposables.Add(disposable);
53             }
54
55             if (_eventThreadCallback != null)
56             {
57                 _eventThreadCallback.Trigger();
58             }
59         }
60
61         public void ProcessDisposables()
62         {
63             lock (_listLock)
64             {
65                 foreach (IDisposable disposable in _disposables)
66                 {
67                     disposable.Dispose();
68                 }
69                 _disposables.Clear();
70             }
71         }
72     }
73 }