void fm::initMainThread() { // daemon thread를 만든다. java_lang_ThreadGroup_C$* pThreadGroupClass = java_lang_ThreadGroup_C$::importClass$(); kernelData.g_pMainThread = FASTIVA_NEW(java_lang_Thread)(pThreadGroupClass->g_mMain, fastiva.createAsciiStringA("main", 4), java_lang_Thread__NORM_PRIORITY, true); #if JPP_JDK_VERSION > JPP_JDK_CDC kernelData.g_pMainThread->set__contextClassLoader(java_lang_ClassLoader_C$::importClass$()->getSystemClassLoader()); #if FASTIVA_NULL_ADDR != 0 // v3 그룹이 null이어도 문제가 없는가? pThread->set__inheritedAccessControlContext((java_security_AccessControlContext_p)FASTIVA_NULL); pThread->set__target((java_lang_Runnable_p)FASTIVA_NULL); #endif #if !JPP_JDK_IS_ANDROID() pThread->set__lock(FASTIVA_NEW(java_lang_Object)()); #endif #if 0 // Z-TEMP 2007.09 #ifndef FASTIVA_J142 //* pThread->set__threadLocals(java_util_Collections_C$::importClass$()->g_EMPTY_MAP); pThread->set__inheritableThreadLocals(java_util_Collections_C$::importClass$()->g_EMPTY_MAP); /*/ pThread->set__threadLocals((java_lang_ThreadLocal$ThreadLocalMap*)FASTIVA_NULL); pThread->set__inheritableThreadLocals((java_lang_ThreadLocal$ThreadLocalMap*)FASTIVA_NULL); //*/ #endif #endif // running 중인 Java-Thread 만이 GlockLocking 되어야 한다. // 현 Thread가 속한 ThreadGroup도 항상 Reachable 상태가 된다. //pThreadGroup->add(pThread); fm::attachThread(kernelData.g_pMainThread, fastiva_getCurrentTask()); // system이란 이름을 가진 thread-group이 생성된다. //java_lang_ThreadGroup_C$* pThreadGroupClass = java_lang_ThreadGroup_C$::importClass$(); kernelData.g_pMainThread->m_group = pThreadGroupClass->g_mMain; //fastiva_lockGlobalRef(pThreadGroup); }
void fox_GC_doLocalGC(); //_impl(fastiva_Task* pCurrTask, bool isLocal); void FOX_FASTCALL(fox_task_notifyCurrentTaskBlocked)(fox_Task* pTask0) { } void fastiva_Runtime::enterNativeSection_$$( ) { #if 0 _asm { mov [ecx+0], ebx mov [ecx+4], ebp; mov [ecx+8], esi; mov [ecx+12], edi; } #endif fastiva_Task* pCurrTask = fastiva_getCurrentTask(); if (pCurrTask == ADDR_ZERO) { return; } fastiva_StackContext* pStackContext = pCurrTask->m_pStackContext; KASSERT(pStackContext != ADDR_ZERO); fox_jmp_buf buf; if (!_setjmp(buf)) { // <- 단지 register 저장용으로 setjmp 를 호출. pStackContext->m_pStack = &buf; } else { // 혹시 몰라 일부러 넣은 stub code; fox_printf("somthing wrong with _setjmp%x", pCurrTask); } }