b69ed232b6b9dbb47aa4141b72412253663f0a42
[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     internal class DisposeQueue
16     {
17         private static readonly DisposeQueue _disposableQueue = new DisposeQueue();
18         private List<IDisposable> _disposables = new List<IDisposable>();
19         private System.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         private bool _isCalled = false;
37         public void Initialize()
38         {
39             if(_isCalled == false)
40             {
41             _disposeQueueProcessDisposablesDelegate = new EventThreadCallback.CallbackDelegate(ProcessDisposables);
42             _eventThreadCallback = new EventThreadCallback(_disposeQueueProcessDisposablesDelegate);
43                 _isCalled = true;
44             }
45         }
46
47         public void Add(IDisposable disposable)
48         {
49             lock (_listLock)
50             {
51                 _disposables.Add(disposable);
52             }
53
54             if (_eventThreadCallback != null)
55             {
56                 _eventThreadCallback.Trigger();
57             }
58         }
59
60         public void ProcessDisposables()
61         {
62             lock (_listLock)
63             {
64                 foreach (IDisposable disposable in _disposables)
65                 {
66                     disposable.Dispose();
67                 }
68                 _disposables.Clear();
69             }
70         }
71     }
72 }