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]); }
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); });
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(); } }
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(); }
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(); }
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); } }
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()); } }
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; }
// 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; }
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; }
void TexturePreLoad::triggerFirstTextureLoad(CCObject* tex) { T_LOG("TexturePreLoad -----> triggerFirstTextureLoad load Sucess!"); }