00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "JackSystemDeps.h"
00022 #include "JackWaitThreadedDriver.h"
00023 #include "JackGlobals.h"
00024 #include "JackClient.h"
00025 #include "JackEngineControl.h"
00026 #include "JackException.h"
00027 #include "JackError.h"
00028 #include "JackTools.h"
00029
00030 namespace Jack
00031 {
00032
00033 bool JackWaitThreadedDriver::Init()
00034 {
00035 return (fStarter.Start() == 0);
00036 }
00037
00038 bool JackWaitThreadedDriver::Execute()
00039 {
00040 try {
00041
00042 SetRealTime();
00043
00044
00045 while (!fStarter.fRunning && fThread.GetStatus() == JackThread::kRunning) {
00046
00047 assert(static_cast<JackWaiterDriver*>(fDriver));
00048 static_cast<JackWaiterDriver*>(fDriver)->ProcessNull();
00049 }
00050
00051
00052 while (fThread.GetStatus() == JackThread::kRunning) {
00053 fDriver->Process();
00054 }
00055
00056 return false;
00057
00058 } catch (JackNetException& e) {
00059
00060 e.PrintMessage();
00061 jack_info("Driver is restarted");
00062 fThread.DropSelfRealTime();
00063
00064
00065 if (fThread.GetStatus() == JackThread::kIdle) {
00066 return false;
00067 }
00068
00069
00070 fThread.SetStatus(JackThread::kIniting);
00071 if (Init()) {
00072
00073 fThread.SetStatus(JackThread::kRunning);
00074 return true;
00075 }
00076
00077 return false;
00078 }
00079 }
00080
00081 }