gc-page-profiler.h
// This file is a part of Julia. License is MIT: https://julialang.org/license
#ifndef GC_PAGE_PROFILER_H
#define GC_PAGE_PROFILER_H
#include "gc.h"
#ifdef __cplusplus
extern "C" {
#endif
#define GC_TYPE_STR_MAXLEN (512)
typedef struct {
arraylist_t typestrs;
char *data;
int osize;
} gc_page_profiler_serializer_t;
// mutex for page profile
extern uv_mutex_t page_profile_lock;
// Serializer functions
gc_page_profiler_serializer_t gc_page_serializer_create(void) JL_NOTSAFEPOINT;
void gc_page_serializer_init(gc_page_profiler_serializer_t *serializer, jl_gc_pagemeta_t *pg) JL_NOTSAFEPOINT;
void gc_page_serializer_destroy(gc_page_profiler_serializer_t *serializer) JL_NOTSAFEPOINT;
void gc_page_serializer_write(gc_page_profiler_serializer_t *serializer, const char *str) JL_NOTSAFEPOINT;
// Page profile functions
#define GC_SERIALIZER_EMPTY ((const char *)0x1)
#define GC_SERIALIZER_GARBAGE ((const char *)0x2)
STATIC_INLINE void gc_page_profile_write_empty_page(gc_page_profiler_serializer_t *serializer,
int enabled) JL_NOTSAFEPOINT
{
if (__unlikely(enabled)) {
gc_page_serializer_write(serializer, GC_SERIALIZER_EMPTY);
}
}
STATIC_INLINE void gc_page_profile_write_garbage(gc_page_profiler_serializer_t *serializer,
int enabled) JL_NOTSAFEPOINT
{
if (__unlikely(enabled)) {
gc_page_serializer_write(serializer, GC_SERIALIZER_GARBAGE);
}
}
STATIC_INLINE void gc_page_profile_write_live_obj(gc_page_profiler_serializer_t *serializer,
jl_taggedvalue_t *v,
int enabled) JL_NOTSAFEPOINT
{
if (__unlikely(enabled)) {
const char *name = jl_typeof_str(jl_valueof(v));
gc_page_serializer_write(serializer, name);
}
}
void gc_enable_page_profile(void) JL_NOTSAFEPOINT;
void gc_disable_page_profile(void) JL_NOTSAFEPOINT;
int gc_page_profile_is_enabled(void) JL_NOTSAFEPOINT;
void gc_page_profile_write_to_file(gc_page_profiler_serializer_t *serializer) JL_NOTSAFEPOINT;
#ifdef __cplusplus
}
#endif
#endif // GC_PAGE_PROFILER_H