Ejemplo n.º 1
0
static void
expect_frame(const char **bt, unsigned int bt_len, CSSymbolRef symbol,
    unsigned long addr, unsigned int bt_idx, unsigned int max_frames)
{
    const char *name;
    unsigned int frame_idx = max_frames - bt_idx - 1;

    if (bt[frame_idx] == NULL) {
        T_LOG("frame %2u: skipping system frame", frame_idx);
        return;
    }

    if (CSIsNull(symbol)) {
        T_FAIL("invalid symbol for address %#lx at frame %d", addr, frame_idx);
        return;
    }

    if (frame_idx >= bt_len) {
        T_FAIL("unexpected frame '%s' (%#lx) at index %u",
            CSSymbolGetName(symbol), addr, frame_idx);
        return;
    }

    name = CSSymbolGetName(symbol);
    T_QUIET; T_ASSERT_NOTNULL(name, NULL);
    T_EXPECT_EQ_STR(name, bt[frame_idx],
        "frame %2u: saw '%s', expected '%s'",
        frame_idx, name, bt[frame_idx]);
}
Ejemplo n.º 2
0
expect_stack(void)
{
    uint64_t bt[USER_FRAMES] = { 0 };
    unsigned int bt_len = USER_FRAMES;
    int err;
    size_t bt_filled;

    static dispatch_once_t expect_stacks_once;
    static bool k64;
    static CSSymbolicatorRef user_symb;

    dispatch_once(&expect_stacks_once, ^(void) {
        int errb;
        int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, 0 /* kernproc */ };

        struct kinfo_proc kp;
        size_t len;

        len = sizeof(kp);
        errb = sysctl(mib, sizeof(mib) / sizeof(mib[0]), &kp, &len, NULL, 0);
        T_QUIET; T_ASSERT_POSIX_SUCCESS(errb,
            "sysctl({ CTL_KERN, KERN_PROC, KERN_PROC_PID, 0})");

        k64 = kp.kp_proc.p_flag & P_LP64;
        T_LOG("executing with a %s-bit kernel", k64 ? "64" : "32");

        user_symb = CSSymbolicatorCreateWithTask(mach_task_self());
        T_QUIET; T_ASSERT_FALSE(CSIsNull(user_symb), NULL);
        T_QUIET; T_ASSERT_TRUE(CSSymbolicatorIsTaskValid(user_symb), NULL);
    });
Ejemplo n.º 3
0
void TexturePreLoad::timeoutCallback(float t)
{
	// 不处理,不检测超时
	return;

	if (mNeedLoadTaskNum <= 0)
	{
		TextAssert(false,"运行错误");
		return;
	}
	int index = tasks.size() - mNeedLoadTaskNum;
	T_LOG("TexturePreLoad time out when load texture '%s'",tasks[index].c_str());

	if (callback)
	{
		callback->textureTimeout(index,tasks[index]);
	}

	// 直接放弃,进入下一个纹理
	mNeedLoadTaskNum -- ;
	if (mNeedLoadTaskNum > 0)
	{
		loadTexture(tasks[index+1].c_str(),true);
	}
	else
	{
		loadOver();
	}
}
Ejemplo n.º 4
0
void TexturePreLoad::toClearSomeBuffer(float t)
{
	// 取消回调
	CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(
		schedule_selector(TexturePreLoad::toClearSomeBuffer),this);
	
	T_LOG("TexturePreLoad release some not use data ......");
	// 正是IOS内存吃紧的解救办法
	CCDirector::sharedDirector()->purgeCachedData();
}
Ejemplo n.º 5
0
void TexturePreLoad::timeToIgnoreTheRestImage(float t)
{
	// 取消回调
	CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(
		schedule_selector(TexturePreLoad::timeToIgnoreTheRestImage),this);

	T_LOG("TexturePreLoad timeToIgnoreTheRestImage called ,the rest need load image num is %d",mNeedLoadTaskNum);

	loadOver();	
}
Ejemplo n.º 6
0
void TexturePreLoad::textureLoadedCallback(CCObject* tex)
{
	mNeedLoadTaskNum --;
	if (mNeedLoadTaskNum < 0)
	{
		mNeedLoadTaskNum = 0;
		// bug 修复 2013-4-17
		// BUG : 修复了,纹理在home之后,又回来时,再次回调的bug。
		// 应该是当时失败的纹理,在下次
		// 这个完全是可以忽略的
		TextAssert(false,"运行时出现问题了,多半是超时引起的");
	}
	int index = tasks.size() - mNeedLoadTaskNum -1;

	T_LOG("texture loaded success --> [total = %d,left = %d]",tasks.size(),mNeedLoadTaskNum);
	
	if (callback)
	{
		callback->textureLoaded(mNeedLoadTaskNum,"NULL-Str");
	}

	if (mNeedLoadTaskNum <= 0)
	{
		loadOver();
	}
	// 看是否可以忽略剩下的图片
	else if (mNeedLoadTaskNum <= IgnoreImageNum)
	{
		float delay = IgnorePerImageDelay*mNeedLoadTaskNum;

		T_LOG("TexturePreLoad will ignore the rest %d image(s) after %f seconds",mNeedLoadTaskNum,delay);
		// 取消回调
		CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(
			schedule_selector(TexturePreLoad::timeToIgnoreTheRestImage),this);
		// 回调
		CCDirector::sharedDirector()->getScheduler()->scheduleSelector(
			schedule_selector(TexturePreLoad::timeToIgnoreTheRestImage),this,delay,false);
	}
}
Ejemplo n.º 7
0
void TexturePreLoad::loadTexture(string file,bool async)
{
#ifdef DEBUG_ENABLE_TEXTURE_LOAD_LOG
	T_LOG("TexturePreLoad::loadTexture ----> to load texture : [%s]",file.c_str());
#endif

	if (async)
	{
		cache->addImageAsync(file.c_str(), this, callfuncO_selector(TexturePreLoad::textureLoadedCallback));
	}else
	{
		cache->addImage(file.c_str());
	}
}
Ejemplo n.º 8
0
void TexturePreLoad::loadOver()
{
	// 如果不是忙碌过程,那么代表之前已经loadOver 过了,不再重复loadOver
	// 主要是预防:timeToIgnoreTheRestImage回调之后,真正的LoadImage之后又完成了的bug
	if (!mBusy)
		return;

	// 取消回调
	CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(
		schedule_selector(TexturePreLoad::timeToIgnoreTheRestImage),this);

	if (callback)
		callback->loadOver();
	tasks.clear();
	mNeedLoadTaskNum = 0;
	mLoadTextureCalledNum = 0;

	T_LOG("TexturePreLoad loadOver !");

#ifdef DEBUG_ENABLE_TEXTURE_LOAD_LOG
	T_LOG("TexturePreLoad texture load over !");
#endif
	
	if (mAutoClear)
	{
		// 取消回调
		CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(
			schedule_selector(TexturePreLoad::toClearSomeBuffer),this);
		// 回调
		CCDirector::sharedDirector()->getScheduler()->scheduleSelector(
			schedule_selector(TexturePreLoad::toClearSomeBuffer),this,0.5f,false);

		mAutoClear = false;
	}
	mBusy = false;
}
Ejemplo n.º 9
0
// waits up to 30 seconds for system to sleep
// returns number of seconds it took for sleep to be entered
// or -1 if sleep wasn't accomplished
static int wait_for_sleep() {
	if(!run_sleep_tests) return 0;

	uint64_t before_diff = time_delta_ms();
	
	for(int i = 0; i < 30; i++) {
		uint64_t after_diff = time_delta_ms();

		// on OSX, there's enough latency between calls to MCT and MAT
		// when the system is going down for sleep for values to diverge a few ms
		if(llabs((int64_t)before_diff - (int64_t)after_diff) > 2) {
			return i + 1;
		}
		
		sleep(1);
		T_LOG("waited %d seconds for sleep...", i+1);
	}
	return -1;
}
Ejemplo n.º 10
0
static int trigger_sleep(int for_secs) {
	if(!run_sleep_tests) return 0;

	// sleep for 1 seconds each iteration
	char buf[10];
	snprintf(buf, 10, "%d", for_secs);

	T_LOG("Sleepeing for %s seconds...", buf);

	int spawn_ret, pid;
	char *const pmset1_args[] = {"/usr/bin/pmset", "relative", "wake", buf, NULL};
	T_ASSERT_POSIX_ZERO((spawn_ret = posix_spawn(&pid, pmset1_args[0], NULL, NULL, pmset1_args, environ)), NULL);
	
	T_ASSERT_EQ(waitpid(pid, &spawn_ret, 0), pid, NULL);
	T_ASSERT_EQ(spawn_ret, 0, NULL);

	char *const pmset2_args[] = {"/usr/bin/pmset", "sleepnow", NULL};
	T_ASSERT_POSIX_ZERO((spawn_ret = posix_spawn(&pid, pmset2_args[0], NULL, NULL, pmset2_args, environ)), NULL);
	
	T_ASSERT_EQ(waitpid(pid, &spawn_ret, 0), pid, NULL);
	T_ASSERT_EQ(spawn_ret, 0, NULL);

	return 0;
}
Ejemplo n.º 11
0
void TexturePreLoad::triggerFirstTextureLoad(CCObject* tex)
{
	T_LOG("TexturePreLoad -----> triggerFirstTextureLoad load Sucess!");
}