1/* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. 3 * Description: add ref tracker. 4 * Create: 2020/11/20 5 */ 6 7#ifndef EXT_TRACKER_H 8#define EXT_TRACKER_H 9 10#if defined(JERRY_REF_TRACKER) 11 12#include "jcontext.h" 13 14typedef struct { 15 size_t size; 16 size_t* data; 17} Storage; 18 19typedef enum { 20 kObjectRefInfo = 0, 21 kStringRefInfo = 1 22} StorageType; 23 24typedef enum { 25 kRefNative = 1 << 0, 26 kRefInit = 1 << 1, 27 kRefRef = 1 << 2, 28 kRefDeref = 1 << 3, 29 kRefMark = 1 << 4, 30 kRefUnmark = 1 << 5 31} RefInfoItemFlags; 32 33typedef struct IStorageItem_s { 34 struct IStorageItem_s* next; 35} IStorageItem; 36 37typedef struct RefInfoItem_s { 38 struct RefInfoItem_s* next; 39 char* stacktrace; 40 RefInfoItemFlags flags; 41} RefInfoItem; // Implements IStorageItem. 42 43// Deleter. 44void RefInfoResetFn(IStorageItem* item); 45 46#define ECMA_OBJECT_TO_STORAGE_KEY(x) (size_t)((uintptr_t)x - (uintptr_t)&JERRY_HEAP_CONTEXT(first)) 47#define ECMA_OBJECT_FROM_STORAGE_KEY(x) (ecma_object_t*)((uintptr_t)x + (uintptr_t)&JERRY_HEAP_CONTEXT(first)) 48 49bool GetRefTrackerEnabled(void); 50void SetRefTrackerEnabled(bool flag); 51 52void LogTrackerInit(const char* filepath); 53void LogTrackerClose(void); 54 55void InitTracker(void); 56void StorageInit(Storage* storage, size_t size); 57void StoragePut(Storage* storage, size_t key, size_t value); 58size_t StorageGet(Storage* storage, size_t key); 59void StorageReset(Storage* storage, size_t key, void(*reset_fn)(IStorageItem*)); 60char* GetStacktraceString(ecma_string_t* stack); 61RefInfoItem* CreateRefInfoItem(RefInfoItemFlags flags, char* stack_str); 62void ReportObjRefManip(ecma_object_t* obj, RefInfoItemFlags flags); 63void ReportObjDelete(ecma_object_t* obj); 64void DumpTracker(void); 65 66#endif 67#endif 68