FXint GMTaskManager::run() { ap_set_thread_name("gm_taskmanager"); do { while(next()) { if (target) mc.message(target,FXSEL(SEL_TASK_RUNNING,message),NULL,0); FXint code = active->run(); mutex.lock(); if (active->target) { if (code) mc.message(active->target,FXSEL(SEL_TASK_CANCELLED,active->message),&active,sizeof(GMTask*)); else mc.message(active->target,FXSEL(SEL_TASK_COMPLETED,active->message),&active,sizeof(GMTask*)); active=NULL; } else { delete active; active=NULL; } mutex.unlock(); } } while(wait()); return 0; }
FXint InputThread::run(){ Event * event; ap_set_thread_name("ap_input"); for (;;) { if (reader && state==StateProcessing) event = wait_for_packet(); else event = wait_for_event(); switch(event->type) { case Ctrl_Close : ctrl_flush(true); ctrl_close_input(true); break; case Ctrl_Open_Flush: ctrl_flush(); case Ctrl_Open : ctrl_open_input(((ControlEvent*)event)->text); break; case Ctrl_Quit : ctrl_close_input(true); engine->decoder->post(event,EventQueue::Flush); return 0; break; case Ctrl_Seek : ctrl_seek(((CtrlSeekEvent*)event)->pos); break; case End : if (event->stream==streamid) { ctrl_eos(); } break; case Meta : engine->decoder->post(event); continue; break; case AP_EOS : GM_DEBUG_PRINT("[input] eos\n"); if (state!=StateError) { engine->post(event); continue; } break; case Buffer : { Packet * packet = dynamic_cast<Packet*>(event); FXASSERT(reader); FXASSERT(packet); packet->stream = streamid; FXuint status = reader->process(packet); switch(status) { case ReadError : GM_DEBUG_PRINT("[input] error\n"); ctrl_close_input(); set_state(StateError,true); break; case ReadDone : GM_DEBUG_PRINT("[input] done\n"); set_state(StateIdle); break; case ReadRedirect : {GM_DEBUG_PRINT("[input] redirect\n"); FXStringList list; reader->redirect(list); ctrl_open_inputs(list); } break; default : break; } continue; /* packet already released */ break; } } Event::unref(event); } return 0; }