1fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/*
2fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Copyright (C) 2013 The Android Open Source Project
3fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
4fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Licensed under the Apache License, Version 2.0 (the "License");
5fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * you may not use this file except in compliance with the License.
6fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * You may obtain a copy of the License at
7fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
8fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *      http://www.apache.org/licenses/LICENSE-2.0
9fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
10fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Unless required by applicable law or agreed to in writing, software
11fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * distributed under the License is distributed on an "AS IS" BASIS,
12fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * See the License for the specific language governing permissions and
14fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * limitations under the License.
15fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
16fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
17fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross#ifndef _LIBMEMTRACK_MEMTRACK_H_
18fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross#define _LIBMEMTRACK_MEMTRACK_H_
19fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
20fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross#include <sys/types.h>
21fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross#include <stddef.h>
22481b947d687a752174f2030511f5338e0ea674b0Adam Lesinski#include <cutils/compiler.h>
23481b947d687a752174f2030511f5338e0ea674b0Adam Lesinski
24481b947d687a752174f2030511f5338e0ea674b0Adam Lesinski#ifdef __cplusplus
25481b947d687a752174f2030511f5338e0ea674b0Adam Lesinskiextern "C" {
26481b947d687a752174f2030511f5338e0ea674b0Adam Lesinski#endif
27fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
28fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
29fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * struct memtrack_proc
30fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
31fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * an opaque handle to the memory stats on a process.
32fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Created with memtrack_proc_new, destroyed by
33fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_proc_destroy.  Can be reused multiple times with
34fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_proc_get.
35fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
36fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossstruct memtrack_proc;
37fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
38fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
39fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_init
40fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
41fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Must be called once before calling any other functions.  After this function
42fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * is called, everything else is thread-safe.
43fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
44fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Returns 0 on success, -errno on error.
45fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
46fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossint memtrack_init(void);
47fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
48fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
49fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_proc_new
50fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
51fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Return a new handle to hold process memory stats.
52fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
53fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Returns NULL on error.
54fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
55fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossstruct memtrack_proc *memtrack_proc_new(void);
56fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
57fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
58fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_proc_destroy
59fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
60fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Free all memory associated with a process memory stats handle.
61fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
62fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossvoid memtrack_proc_destroy(struct memtrack_proc *p);
63fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
64fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
65fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_proc_get
66fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
67fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Fill a process memory stats handle with data about the given pid.  Can be
68fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * called on a handle that was just allocated with memtrack_proc_new,
69fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * or on a handle that has been previously passed to memtrack_proc_get
70fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * to replace the data with new data on the same or another process.  It is
71fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * expected that the second call on the same handle should not require
72fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * allocating any new memory.
73fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
74fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Returns 0 on success, -errno on error.
75fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
76fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossint memtrack_proc_get(struct memtrack_proc *p, pid_t pid);
77fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
78fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
79fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_proc_graphics_total
80fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
81fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Return total amount of memory that has been allocated for use as window
82fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * buffers.  Does not differentiate between memory that has already been
83fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * accounted for by reading /proc/pid/smaps and memory that has not been
84fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * accounted for.
85fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
86fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Returns non-negative size in bytes on success, -errno on error.
87fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
88fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossssize_t memtrack_proc_graphics_total(struct memtrack_proc *p);
89fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
90fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
91fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_proc_graphics_pss
92fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
93fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Return total amount of memory that has been allocated for use as window
94fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * buffers, but has not already been accounted for by reading /proc/pid/smaps.
95fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Memory that is shared across processes may already be divided by the
96fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * number of processes that share it (preferred), or may be charged in full to
97fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * every process that shares it, depending on the capabilities of the driver.
98fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
99fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Returns non-negative size in bytes on success, -errno on error.
100fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
101fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossssize_t memtrack_proc_graphics_pss(struct memtrack_proc *p);
102fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
103fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
104fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_proc_gl_total
105fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
106fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Same as memtrack_proc_graphics_total, but counts GL memory (which
107fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * should not overlap with graphics memory) instead of graphics memory.
108fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
109fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Returns non-negative size in bytes on success, -errno on error.
110fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
111fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossssize_t memtrack_proc_gl_total(struct memtrack_proc *p);
112fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
113fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
114fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * memtrack_proc_gl_pss
115fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
116fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Same as memtrack_proc_graphics_total, but counts GL memory (which
117fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * should not overlap with graphics memory) instead of graphics memory.
118fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
119fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Returns non-negative size in bytes on success, -errno on error.
120fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
121fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossssize_t memtrack_proc_gl_pss(struct memtrack_proc *p);
122fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
123fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
124587fb6a09183cd12b3e6faca9b106d4c5fac5c52Richard Uhler * memtrack_proc_other_total
125fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
126fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Same as memtrack_proc_graphics_total, but counts miscellaneous memory
127fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * not tracked by gl or graphics calls above.
128fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
129fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Returns non-negative size in bytes on success, -errno on error.
130fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
131fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossssize_t memtrack_proc_other_total(struct memtrack_proc *p);
132fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
133fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross/**
134587fb6a09183cd12b3e6faca9b106d4c5fac5c52Richard Uhler * memtrack_proc_other_pss
135fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
136fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Same as memtrack_proc_graphics_total, but counts miscellaneous memory
137fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * not tracked by gl or graphics calls above.
138fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross *
139fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross * Returns non-negative size in bytes on success, -errno on error.
140fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross */
141fc600e49bf9e0977b8e91642480e065bd95f2670Colin Crossssize_t memtrack_proc_other_pss(struct memtrack_proc *p);
142fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross
143481b947d687a752174f2030511f5338e0ea674b0Adam Lesinski#ifdef __cplusplus
144481b947d687a752174f2030511f5338e0ea674b0Adam Lesinski}
145481b947d687a752174f2030511f5338e0ea674b0Adam Lesinski#endif
146481b947d687a752174f2030511f5338e0ea674b0Adam Lesinski
147fc600e49bf9e0977b8e91642480e065bd95f2670Colin Cross#endif
148