/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef _LIBMEMTRACK_MEMTRACK_H_
#define _LIBMEMTRACK_MEMTRACK_H_

#include <sys/types.h>
#include <stddef.h>
#include <cutils/compiler.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * struct memtrack_proc
 *
 * an opaque handle to the memory stats on a process.
 * Created with memtrack_proc_new, destroyed by
 * memtrack_proc_destroy.  Can be reused multiple times with
 * memtrack_proc_get.
 */
struct memtrack_proc;

/**
 * memtrack_init
 *
 * Must be called once before calling any other functions.  After this function
 * is called, everything else is thread-safe.
 *
 * Returns 0 on success, -errno on error.
 */
int memtrack_init(void);

/**
 * memtrack_proc_new
 *
 * Return a new handle to hold process memory stats.
 *
 * Returns NULL on error.
 */
struct memtrack_proc *memtrack_proc_new(void);

/**
 * memtrack_proc_destroy
 *
 * Free all memory associated with a process memory stats handle.
 */
void memtrack_proc_destroy(struct memtrack_proc *p);

/**
 * memtrack_proc_get
 *
 * Fill a process memory stats handle with data about the given pid.  Can be
 * called on a handle that was just allocated with memtrack_proc_new,
 * or on a handle that has been previously passed to memtrack_proc_get
 * to replace the data with new data on the same or another process.  It is
 * expected that the second call on the same handle should not require
 * allocating any new memory.
 *
 * Returns 0 on success, -errno on error.
 */
int memtrack_proc_get(struct memtrack_proc *p, pid_t pid);

/**
 * memtrack_proc_graphics_total
 *
 * Return total amount of memory that has been allocated for use as window
 * buffers.  Does not differentiate between memory that has already been
 * accounted for by reading /proc/pid/smaps and memory that has not been
 * accounted for.
 *
 * Returns non-negative size in bytes on success, -errno on error.
 */
ssize_t memtrack_proc_graphics_total(struct memtrack_proc *p);

/**
 * memtrack_proc_graphics_pss
 *
 * Return total amount of memory that has been allocated for use as window
 * buffers, but has not already been accounted for by reading /proc/pid/smaps.
 * Memory that is shared across processes may already be divided by the
 * number of processes that share it (preferred), or may be charged in full to
 * every process that shares it, depending on the capabilities of the driver.
 *
 * Returns non-negative size in bytes on success, -errno on error.
 */
ssize_t memtrack_proc_graphics_pss(struct memtrack_proc *p);

/**
 * memtrack_proc_gl_total
 *
 * Same as memtrack_proc_graphics_total, but counts GL memory (which
 * should not overlap with graphics memory) instead of graphics memory.
 *
 * Returns non-negative size in bytes on success, -errno on error.
 */
ssize_t memtrack_proc_gl_total(struct memtrack_proc *p);

/**
 * memtrack_proc_gl_pss
 *
 * Same as memtrack_proc_graphics_total, but counts GL memory (which
 * should not overlap with graphics memory) instead of graphics memory.
 *
 * Returns non-negative size in bytes on success, -errno on error.
 */
ssize_t memtrack_proc_gl_pss(struct memtrack_proc *p);

/**
 * memtrack_proc_gl_total
 *
 * Same as memtrack_proc_graphics_total, but counts miscellaneous memory
 * not tracked by gl or graphics calls above.
 *
 * Returns non-negative size in bytes on success, -errno on error.
 */
ssize_t memtrack_proc_other_total(struct memtrack_proc *p);

/**
 * memtrack_proc_gl_pss
 *
 * Same as memtrack_proc_graphics_total, but counts miscellaneous memory
 * not tracked by gl or graphics calls above.
 *
 * Returns non-negative size in bytes on success, -errno on error.
 */
ssize_t memtrack_proc_other_pss(struct memtrack_proc *p);

#ifdef __cplusplus
}
#endif

#endif
