//----恢复保存的异步信号状态---------------------------------------------------- //功能:本函数是int_save_asyn_signal()的姊妹函数,调用本函数使禁止次数减少,调用 // 一次int_save_asyn_signal()是禁止次数增加。 // 当次数减至0时激活异步信号,否则简单减1 //参数:无 //返回:无 //------------------------------------------------------------------------------ void Int_RestoreAsynSignal(void) { if(tg_int_global.nest_asyn_signal != 0) return; if(tg_int_global.en_asyn_signal_counter != 0) tg_int_global.en_asyn_signal_counter--; if(tg_int_global.en_asyn_signal_counter==0) { // tg_int_global.en_asyn_signal = true; //异步信号设为使能 // if(tg_int_global.en_trunk_counter == 0) // { g_bScheduleEnable = true; if(g_ptEventRunning!= g_ptEventReady) { __Djy_Schedule(); // Int_ContactAsynSignal(); //汇编中已经打开,无须再调用 }else Int_ContactAsynSignal(); // }else // Int_ContactAsynSignal(); }else { Int_CutAsynSignal(); //防止counter>0期间意外(bug)打开 g_bScheduleEnable = false; } return; }
u32 switch_context(ufast_t line) { SuspendThread(old_id); ResumeThread(new_id); Int_ContactAsynSignal(); return 0; }
//----复位老线程,切换到新线程------------------------------------------------- //功能: 把old_vm的上下文重新初始化到新创建的状态,然后切换到新线程的 // 上下文中继续执行。 //当一个在常驻内存的虚拟机中处理的事件完成后,不能删除该虚拟机,必须复位 // 该虚拟机,然后切换到其他就绪线程,这时候就需要调用本函数。因此本函数在 // 被复位的线程上下文里面执行。 //参数: thread_routine,被重置的线程函数 // new_vm,目标线程 // old_vm,被复位线程 //返回: 无 //函数原型:void __asm_reset_switch(void (*thread_routine)(void), // struct tagThreadVm *new_vm,struct tagThreadVm *old_vm); //----------------------------------------------------------------------------- void __asm_reset_switch(ptu32_t (*thread_routine)(void), struct tagThreadVm *new_vm,struct tagThreadVm *old_vm) { Int_HalfEnableAsynSignal(); old_vm->stack_top = CreateThread( NULL, 0, win_engine, thread_routine, CREATE_SUSPENDED, NULL ); old_vm->stack = 0; old_vm->next = NULL; old_vm->stack_size = 0; //保存栈深度 old_vm->host_vm = NULL; ResumeThread((HANDLE )new_vm->stack_top); Int_ContactAsynSignal(); _endthreadex(0); }
//----切入上下文--------------------------------------------------------------- //功能: 不保存原上下文,直接切入新的上下文执行 //参数: new_sp,新上下文的栈指针 //返回: 无 //函数原型: void __asm_turnto_context(struct tagThreadVm *new_vm); //说明: 当事件完成,就没有必要保存旧事件的上下文,直接切换到新事件即可. //----------------------------------------------------------------------------- void __asm_turnto_context(struct tagThreadVm *new_vm) { Int_HalfEnableAsynSignal(); ResumeThread((HANDLE )new_vm->stack_top); Int_ContactAsynSignal(); }