[NUI] Reduce code duplication - refactor dispose codes (#1010)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / Disposable.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace Tizen.NUI
6 {
7     /// <summary>
8     /// Disposable class.
9     /// </summary>
10     /// <since_tizen> 6 </since_tizen>
11     public class Disposable : global::System.IDisposable
12     {
13         /// <summary>
14         /// A Flat to check if it is already disposed.
15         /// </summary>
16         /// <since_tizen> 6 </since_tizen>
17         protected bool disposed = false;
18         private bool isDisposeQueued = false;
19
20         /// <summary>
21         /// Create an instance of BaseHandle.
22         /// </summary>
23         /// <since_tizen> 6 </since_tizen>
24         public Disposable()
25         {
26         }
27
28         /// <summary>
29         /// Dispose.
30         /// </summary>
31         /// <since_tizen> 6 </since_tizen>
32         ~Disposable()
33         {
34             if (!isDisposeQueued)
35             {
36                 isDisposeQueued = true;
37                 DisposeQueue.Instance.Add(this);
38             }
39         }
40
41         /// <summary>
42         /// Dispose.
43         /// </summary>
44         /// <since_tizen> 6 </since_tizen>
45         public void Dispose()
46         {
47             //Throw excpetion if Dispose() is called in separate thread.
48             if (!Window.IsInstalled())
49             {
50                 throw new System.InvalidOperationException("This API called from separate thread. This API must be called from MainThread.");
51             }
52
53             if (isDisposeQueued)
54             {
55                 Dispose(DisposeTypes.Implicit);
56             }
57             else
58             {
59                 Dispose(DisposeTypes.Explicit);
60                 System.GC.SuppressFinalize(this);
61             }
62         }
63
64         /// <summary>
65         /// Dispose.
66         /// </summary>
67         /// <since_tizen> 6 </since_tizen>
68         protected virtual void Dispose(DisposeTypes type)
69         {
70             if (disposed)
71             {
72                 return;
73             }
74
75             if (type == DisposeTypes.Explicit)
76             {
77                 //Called by User
78                 //Release your own managed resources here.
79                 //You should release all of your own disposable objects here.
80             }
81
82             //Release your own unmanaged resources here.
83             //You should not access any managed member here except static instance.
84             //because the execution order of Finalizes is non-deterministic.
85
86             disposed = true;
87         }
88     }
89 }