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