示例#1
0
// コールスタックを指定された数だけ下降する
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;
        }
    }
}
示例#2
0
// オブジェクトをトラッキングリストから削除
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);
            }
        }
    }
}
示例#3
0
// コールスタックの解放
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;
    }
}
示例#4
0
// トラッキングの解放
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);
}
示例#5
0
// 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);
}