// トラッキングの初期化 void InitTracking() { UINT i; CALLSTACK_DATA *s; // ハッシュリスト初期化 hashlist = (TRACKING_LIST **)OSMemoryAlloc(sizeof(TRACKING_LIST *) * TRACKING_NUM_ARRAY); for (i = 0; i < TRACKING_NUM_ARRAY; i++) { hashlist[i] = NULL; } obj_id = 0; // ロック作成 obj_lock = OSNewLock(); obj_id_lock = OSNewLock(); cs_lock = OSNewLock(); s = GetCallStack(); if (s == NULL) { do_not_get_callstack = true; } else { do_not_get_callstack = false; FreeCallStack(s); } }
// オブジェクトをトラッキングリストに挿入 void InsertTrackingList(TRACKING_OBJECT *o) { UINT i; TRACKING_LIST *t; // 引数チェック if (o == NULL) { return; } t = OSMemoryAlloc(sizeof(TRACKING_LIST)); t->Object = o; t->Next = NULL; i = TRACKING_HASH(o->Address); if (hashlist[i] == NULL) { hashlist[i] = t; } else { TRACKING_LIST *tt = hashlist[i]; while (true) { if (tt->Next == NULL) { tt->Next = t; break; } tt = tt->Next; } } }
// 新しいオブジェクトを追跡リストに入れる void TrackNewObj(UINT64 addr, char *name, UINT size) { TRACKING_OBJECT *o; UINT new_id; // 引数チェック if (addr == 0 || name == NULL) { return; } if (IsMemCheck() == false) { // リリースモードでは追跡しない return; } if (disable_tracking) { return; } // 新しい ID の生成 OSLock(obj_id_lock); { new_id = ++obj_id; } OSUnlock(obj_id_lock); o = OSMemoryAlloc(sizeof(TRACKING_OBJECT)); o->Id = new_id; o->Address = addr; o->Name = name; o->Size = size; o->CreatedDate = LocalTime64(); o->CallStack = WalkDownCallStack(GetCallStack(), 2); o->FileName[0] = 0; o->LineNumber = 0; LockTrackingList(); { InsertTrackingList(o); } UnlockTrackingList(); }
// Put a new object into the tracking list void TrackNewObj(UINT64 addr, char *name, UINT size) { TRACKING_OBJECT *o; UINT new_id; // Validate arguments if (addr == 0 || name == NULL) { return; } if (IsMemCheck() == false) { // Don't track in the release mode return; } if (disable_tracking) { return; } // Generate a new ID OSLock(obj_id_lock); { new_id = ++obj_id; } OSUnlock(obj_id_lock); o = OSMemoryAlloc(sizeof(TRACKING_OBJECT)); o->Id = new_id; o->Address = addr; o->Name = name; o->Size = size; o->CreatedDate = LocalTime64(); o->CallStack = WalkDownCallStack(GetCallStack(), 2); o->FileName[0] = 0; o->LineNumber = 0; LockTrackingList(); { InsertTrackingList(o); } UnlockTrackingList(); }