blob: 8fe11bbc1c58cbfca2a9366f1727e63d8d6eff68 [file] [log] [blame]
/*
* Copyright (c) 2019-2020 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef PAS_HEAP_SUMMARY_H
#define PAS_HEAP_SUMMARY_H
#include "pas_utils.h"
PAS_BEGIN_EXTERN_C;
struct pas_heap_summary;
struct pas_stream;
typedef struct pas_heap_summary pas_heap_summary;
typedef struct pas_stream pas_stream;
struct pas_heap_summary {
size_t free;
size_t allocated;
size_t meta;
size_t committed;
size_t decommitted;
size_t free_ineligible_for_decommit;
size_t free_eligible_for_decommit;
size_t free_decommitted;
size_t meta_ineligible_for_decommit;
size_t meta_eligible_for_decommit;
size_t cached;
};
static inline pas_heap_summary pas_heap_summary_create_empty(void)
{
pas_heap_summary result;
result.free = 0;
result.allocated = 0;
result.meta = 0;
result.committed = 0;
result.decommitted = 0;
result.free_ineligible_for_decommit = 0;
result.free_eligible_for_decommit = 0;
result.free_decommitted = 0;
result.meta_ineligible_for_decommit = 0;
result.meta_eligible_for_decommit = 0;
result.cached = 0;
return result;
}
static inline bool pas_heap_summary_is_empty(pas_heap_summary summary)
{
return !summary.free
&& !summary.allocated
&& !summary.meta
&& !summary.committed
&& !summary.decommitted
&& !summary.free_ineligible_for_decommit
&& !summary.free_eligible_for_decommit
&& !summary.free_decommitted
&& !summary.meta_ineligible_for_decommit
&& !summary.meta_eligible_for_decommit
&& !summary.cached;
}
static inline pas_heap_summary pas_heap_summary_add(pas_heap_summary left,
pas_heap_summary right)
{
pas_heap_summary result;
result.free = left.free + right.free;
result.allocated = left.allocated + right.allocated;
result.meta = left.meta + right.meta;
result.committed = left.committed + right.committed;
result.decommitted = left.decommitted + right.decommitted;
result.free_ineligible_for_decommit =
left.free_ineligible_for_decommit + right.free_ineligible_for_decommit;
result.free_eligible_for_decommit =
left.free_eligible_for_decommit + right.free_eligible_for_decommit;
result.free_decommitted = left.free_decommitted + right.free_decommitted;
result.meta_ineligible_for_decommit =
left.meta_ineligible_for_decommit + right.meta_ineligible_for_decommit;
result.meta_eligible_for_decommit =
left.meta_eligible_for_decommit + right.meta_eligible_for_decommit;
result.cached = left.cached + right.cached;
return result;
}
PAS_API void pas_heap_summary_validate(pas_heap_summary* summary);
static inline size_t pas_heap_summary_committed_objects(pas_heap_summary summary)
{
return summary.allocated
+ summary.free_ineligible_for_decommit
+ summary.free_eligible_for_decommit;
}
static inline size_t pas_heap_summary_total(pas_heap_summary summary)
{
return summary.committed + summary.decommitted;
}
static inline size_t pas_heap_summary_fragmentation(pas_heap_summary summary)
{
return summary.free_ineligible_for_decommit + summary.meta_ineligible_for_decommit;
}
PAS_API void pas_heap_summary_dump(pas_heap_summary summary, pas_stream* stream);
PAS_END_EXTERN_C;
#endif /* PAS_HEAP_SUMMARY_H */