2 * Copyright (c) 2016 - 2017 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Collections.Generic;
21 using System.Runtime.InteropServices;
23 namespace Tizen.System
26 /// The class for memory information per process.
28 public class ProcessMemoryUsage
31 private Interop.RuntimeInfo.ProcessMemoryInfo[] Usages;
34 /// The constructor of ProcessMemoryInformation class.
36 /// <since_tizen> 4 </since_tizen>
37 /// <param name="pid">List of unique process ids.</param>
38 /// <privilege>http://tizen.org/privilege/systemmonitor</privilege>
39 /// <exception cref="ArgumentException">Thrown when the <paramref name="pid"/> is empty.</exception>
40 /// <exception cref="IOException">Thrown when an I/O error occurs while reading from the system or requesting to the resource management daemon.</exception>
41 /// <exception cref="OutOfMemoryException">Thrown when the memory is not enough to allocate.</exception>
42 /// <exception cref="UnauthorizedAccessException">Thrown when the caller does not have privilege to use this method.</exception>
43 public ProcessMemoryUsage(IEnumerable<int> pid)
49 /// The number of usage entries.
51 /// <since_tizen> 4 </since_tizen>
52 public int Count { get; internal set; }
55 /// Gets the virtual memory size of a process.
57 /// <since_tizen> 4 </since_tizen>
58 /// <param name="pid">The process id.</param>
59 /// <returns>The virtual memory size <paramref name="pid"/> is using (KiB).</returns>
60 /// <exception cref="ArgumentException">Thrown when the <paramref name="pid"/> is invalid.</exception>
61 public int GetVsz(int pid)
63 for (int i = 0; i < Count; i++)
67 Log.Error(InformationErrorFactory.LogTag, "Invalid pid");
68 InformationErrorFactory.ThrowException(InformationError.InvalidParameter);
73 /// Gets the resident set size of a process.
75 /// <since_tizen> 4 </since_tizen>
76 /// <param name="pid">The process id.</param>
77 /// <returns>The resident set size <paramref name="pid"/> is using (KiB).</returns>
78 /// <exception cref="ArgumentException">Thrown when the <paramref name="pid"/> is invalid.</exception>
79 public int GetRss(int pid)
81 for (int i = 0; i < Count; i++)
85 Log.Error(InformationErrorFactory.LogTag, "Invalid pid");
86 InformationErrorFactory.ThrowException(InformationError.InvalidParameter);
91 /// Gets the proportional set size of a process.
93 /// <since_tizen> 4 </since_tizen>
94 /// <param name="pid">The process id.</param>
95 /// <returns>The proportional set size <paramref name="pid"/> is using (KiB).</returns>
96 /// <exception cref="ArgumentException">Thrown when the <paramref name="pid"/> is invalid.</exception>
97 public int GetPss(int pid)
99 for (int i = 0; i < Count; i++)
101 return Usages[i].Pss;
103 Log.Error(InformationErrorFactory.LogTag, "Invalid pid");
104 InformationErrorFactory.ThrowException(InformationError.InvalidParameter);
109 /// Gets the size not modified and mapped by other processes of a process.
111 /// <since_tizen> 4 </since_tizen>
112 /// <param name="pid">The process id.</param>
113 /// <returns>The shared clean memory size <paramref name="pid"/> is using (KiB).</returns>
114 /// <exception cref="ArgumentException">Thrown when the <paramref name="pid"/> is invalid.</exception>
115 public int GetSharedClean(int pid)
117 for (int i = 0; i < Count; i++)
119 return Usages[i].SharedClean;
121 Log.Error(InformationErrorFactory.LogTag, "Invalid pid");
122 InformationErrorFactory.ThrowException(InformationError.InvalidParameter);
127 /// Gets the size modified and mapped by other processes of a process.
129 /// <since_tizen> 4 </since_tizen>
130 /// <param name="pid">The process id.</param>
131 /// <returns>The shared dirty memory size <paramref name="pid"/> is using (KiB).</returns>
132 /// <exception cref="ArgumentException">Thrown when the <paramref name="pid"/> is invalid.</exception>
133 public int GetSharedDirty(int pid)
135 for (int i = 0; i < Count; i++)
137 return Usages[i].SharedDirty;
139 Log.Error(InformationErrorFactory.LogTag, "Invalid pid");
140 InformationErrorFactory.ThrowException(InformationError.InvalidParameter);
145 /// Gets the size not modified and available only to that process of a process.
147 /// <since_tizen> 4 </since_tizen>
148 /// <param name="pid">The process id.</param>
149 /// <returns>The private clean memory size <paramref name="pid"/> is using (KiB).</returns>
150 /// <exception cref="ArgumentException">Thrown when the <paramref name="pid"/> is invalid.</exception>
151 public int GetPrivateClean(int pid)
153 for (int i = 0; i < Count; i++)
155 return Usages[i].PrivateClean;
157 Log.Error(InformationErrorFactory.LogTag, "Invalid pid");
158 InformationErrorFactory.ThrowException(InformationError.InvalidParameter);
163 /// Gets the size modified and available only to that process of a process.
165 /// <since_tizen> 4 </since_tizen>
166 /// <param name="pid">The process id.</param>
167 /// <returns>The private dirty memory size <paramref name="pid"/> is using (KiB).</returns>
168 /// <exception cref="ArgumentException">Thrown when the <paramref name="pid"/> is invalid.</exception>
169 public int GetPrivateDirty(int pid)
171 for (int i = 0; i < Count; i++)
173 return Usages[i].PrivateDirty;
175 Log.Error(InformationErrorFactory.LogTag, "Invalid pid");
176 InformationErrorFactory.ThrowException(InformationError.InvalidParameter);
181 /// Update the process memory information to the latest.
183 /// <since_tizen> 4 </since_tizen>
184 /// <param name="pid">List of unique process ids.</param>
185 /// <privilege>http://tizen.org/privilege/systemmonitor</privilege>
186 /// <exception cref="ArgumentException">Thrown when the <paramref name="pid"/> is empty.</exception>
187 /// <exception cref="IOException">Thrown when an I/O error occurs while reading from the system or requesting to the resource management daemon.</exception>
188 /// <exception cref="OutOfMemoryException">Thrown when the memory is not enough to allocate.</exception>
189 /// <exception cref="UnauthorizedAccessException">Thrown when the caller does not have privilege to use this method.</exception>
190 public void Update(IEnumerable<int> pid)
192 InformationError ret;
194 Pids = pid.ToArray<int>();
195 IntPtr ptr = new IntPtr();
196 Count = Pids.Count<int>();
198 ret = Interop.RuntimeInfo.GetProcessMemoryInfo(Pids, Count, ref ptr);
199 if (ret != InformationError.None)
201 Log.Error(InformationErrorFactory.LogTag, "Interop failed to get Process cpu usage");
202 InformationErrorFactory.ThrowException(ret);
205 Usages = new Interop.RuntimeInfo.ProcessMemoryInfo[Count];
206 for (int i = 0; i < Count; i++)
208 Usages[i] = Marshal.PtrToStructure<Interop.RuntimeInfo.ProcessMemoryInfo>(ptr);
209 ptr += Marshal.SizeOf<Interop.RuntimeInfo.ProcessCpuUsage>();