static SQInteger base_newthread(HSQUIRRELVM v) { SQObjectPtr &func = stack_get(v,2); SQInteger stksize = (_funcproto(_closure(func)->_function)->_stacksize << 1) +2; HSQUIRRELVM newv = sq_newthread(v, (stksize < MIN_STACK_OVERHEAD + 2)? MIN_STACK_OVERHEAD + 2 : stksize); sq_move(newv,v,-2); return 1; }
/** * 情報破棄 */ void Thread::_init() { HSQUIRRELVM gv = getGlobalVM(); sq_newthread(gv, 1024); _thread.getStack(gv, -1); sq_pop(gv, 1); }
HSQOBJECT create_thread(HSQUIRRELVM vm) { HSQUIRRELVM new_vm = sq_newthread(vm, 64); if(new_vm == NULL) throw SquirrelError(vm, "Couldn't create new VM"); HSQOBJECT vm_object; sq_resetobject(&vm_object); if(SQ_FAILED(sq_getstackobj(vm, -1, &vm_object))) throw SquirrelError(vm, "Couldn't get squirrel thread from stack"); sq_addref(vm, &vm_object); sq_pop(vm, 1); return vm_object; }
void SquirrelThread::createThread() { //assert(!m_thread); m_thread = sq_newthread(m_parentVm, 1024); // create m_thread and store it on the stack if (0 == m_thread) { ASSERT_NOT_REACHED(); return; } // Create a HSQOBJECT to hold a reference to the m_thread sq_resetobject(&m_threadObj); // init the object // store m_thread created by sq_newthread into thread_obj if (sq_getstackobj(m_parentVm, -1, &m_threadObj) < 0) { ASSERT_NOT_REACHED(); return; } sq_addref(m_parentVm, &m_threadObj); // add reference sq_pop(m_parentVm, 1); // remove the m_thread from the stack }