// コールスタックを指定された数だけ下降する CALLSTACK_DATA *WalkDownCallStack(CALLSTACK_DATA *s, UINT num) { CALLSTACK_DATA *cs, *tmp; UINT i; // 引数チェック if (s == NULL) { return NULL; } cs = s; i = 0; while (true) { if (i >= num) { return cs; } i++; tmp = cs; cs = tmp->next; OSMemoryFree(tmp->name); OSMemoryFree(tmp); if (cs == NULL) { return NULL; } } }
// オブジェクトをトラッキングリストから削除 void DeleteTrackingList(TRACKING_OBJECT *o, bool free_object_memory) { UINT i; // 引数チェック if (o == NULL) { return; } i = TRACKING_HASH(o->Address); if (hashlist[i] != NULL) { TRACKING_LIST *ft = NULL; if (hashlist[i]->Object == o) { ft = hashlist[i]; hashlist[i] = hashlist[i]->Next; } else { TRACKING_LIST *tt = hashlist[i]; TRACKING_LIST *prev = NULL; while (true) { if (tt->Object == o) { prev->Next = tt->Next; ft = tt; break; } if (tt->Next == NULL) { break; } prev = tt; tt = tt->Next; } } if (ft != NULL) { OSMemoryFree(ft); if (free_object_memory) { FreeCallStack(o->CallStack); OSMemoryFree(o); } } } }
// コールスタックの解放 void FreeCallStack(CALLSTACK_DATA *s) { // 引数チェック if (s == NULL) { return; } while (true) { CALLSTACK_DATA *next = s->next; OSMemoryFree(s->name); OSMemoryFree(s); if (next == NULL) { break; } s = next; } }
// トラッキングの解放 void FreeTracking() { UINT i; // ロック削除 OSDeleteLock(obj_lock); OSDeleteLock(obj_id_lock); OSDeleteLock(cs_lock); cs_lock = NULL; obj_id_lock = NULL; obj_lock = NULL; // すべての要素を解放 for (i = 0; i < TRACKING_NUM_ARRAY; i++) { if (hashlist[i] != NULL) { TRACKING_LIST *t = hashlist[i]; while (true) { TRACKING_LIST *t2 = t; TRACKING_OBJECT *o = t->Object; FreeCallStack(o->CallStack); OSMemoryFree(o); t = t->Next; OSMemoryFree(t2); if (t == NULL) { break; } } } } // リスト解放 OSMemoryFree(hashlist); }
// Release the tracking void FreeTracking() { UINT i; // Delete the lock OSDeleteLock(obj_lock); OSDeleteLock(obj_id_lock); OSDeleteLock(cs_lock); cs_lock = NULL; obj_id_lock = NULL; obj_lock = NULL; // Release all of the elements for (i = 0;i < TRACKING_NUM_ARRAY;i++) { if (hashlist[i] != NULL) { TRACKING_LIST *t = hashlist[i]; while (true) { TRACKING_LIST *t2 = t; TRACKING_OBJECT *o = t->Object; FreeCallStack(o->CallStack); OSMemoryFree(o); t = t->Next; OSMemoryFree(t2); if (t == NULL) { break; } } } } // Release the list OSMemoryFree(hashlist); }