PR_ScanStackPointers(PRScanStackFun scanFun, void* scanClosure) { PRScanStackData data; data.scanFun = scanFun; data.scanClosure = scanClosure; return PR_EnumerateThreads(pr_ScanStack, &data); }
static void Level_0_Thread(PRThreadScope scope1, PRThreadScope scope2) { PRThread *thr; PRThread *me = PR_GetCurrentThread(); int n; PRInt32 words; PRWord *registers; alive = 0; mon = PR_NewMonitor(); alive = count; for (n=0; n<count; n++) { thr = PR_CreateThreadGCAble(PR_USER_THREAD, Level_1_Thread, (void *)scope2, PR_PRIORITY_NORMAL, scope1, PR_UNJOINABLE_THREAD, 0); if (!thr) { printf("Could not create thread!\n"); alive--; } printf("Level_0_Thread[0x%lx] created %15s thread 0x%lx\n", PR_GetCurrentThread(), (scope1 == PR_GLOBAL_THREAD) ? "PR_GLOBAL_THREAD" : "PR_LOCAL_THREAD", thr); PR_Sleep(0); } PR_SuspendAll(); PR_EnumerateThreads(print_thread, NULL); registers = PR_GetGCRegisters(me, 1, (int *)&words); if (registers) printf("My Registers: R0 = 0x%x R1 = 0x%x R2 = 0x%x R3 = 0x%x\n", registers[0],registers[1],registers[2],registers[3]); printf("My Stack Pointer = 0x%lx\n", PR_GetSP(me)); PR_ResumeAll(); /* Wait for all threads to exit */ PR_EnterMonitor(mon); while (alive) { PR_Wait(mon, PR_INTERVAL_NO_TIMEOUT); } PR_ExitMonitor(mon); PR_DestroyMonitor(mon); }