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
00029 namespace Jack
00030 {
00031
00032 bool JackWaitThreadedDriver::Init()
00033 {
00034 return (fStarter.Start() == 0);
00035 }
00036
00037 bool JackWaitThreadedDriver::Execute()
00038 {
00039 try {
00040
00041 while (!fStarter.fRunning && fThread.GetStatus() == JackThread::kRunning) {
00042 fDriver->ProcessNull();
00043 }
00044
00045
00046 if (fDriver->IsRealTime()) {
00047 jack_log("JackWaitThreadedDriver::Init IsRealTime");
00048
00049 fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint);
00050 if (fThread.AcquireRealTime(GetEngineControl()->fServerPriority) < 0) {
00051 jack_error("AcquireRealTime error");
00052 } else {
00053 set_threaded_log_function();
00054 }
00055 }
00056
00057
00058 while (fThread.GetStatus() == JackThread::kRunning) {
00059 fDriver->Process();
00060 }
00061 return false;
00062 } catch (JackNetException& e) {
00063 e.PrintMessage();
00064 jack_log("Driver is restarted");
00065 fThread.DropRealTime();
00066
00067 fThread.SetStatus(JackThread::kIniting);
00068 if (Init()) {
00069
00070 fThread.SetStatus(JackThread::kRunning);
00071 return true;
00072 } else {
00073 return false;
00074 }
00075 }
00076 }
00077
00078 }