00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "JackMessageBuffer.h"
00031 #include "JackGlobals.h"
00032 #include "JackError.h"
00033
00034 namespace Jack
00035 {
00036
00037 JackMessageBuffer* JackMessageBuffer::fInstance = NULL;
00038
00039 JackMessageBuffer::JackMessageBuffer()
00040 :fThread(this),fInBuffer(0),fOutBuffer(0),fOverruns(0)
00041 {
00042 fThread.StartSync();
00043 }
00044
00045 JackMessageBuffer::~JackMessageBuffer()
00046 {
00047 if (fOverruns > 0) {
00048 jack_error("WARNING: %d message buffer overruns!", fOverruns);
00049 } else {
00050 jack_info("no message buffer overruns");
00051 }
00052 fThread.SetStatus(JackThread::kIdle);
00053 fSignal.Signal();
00054 fThread.Stop();
00055 Flush();
00056 }
00057
00058 void JackMessageBuffer::Flush()
00059 {
00060 while (fOutBuffer != fInBuffer) {
00061 jack_log_function(fBuffers[fOutBuffer].level, fBuffers[fOutBuffer].message);
00062 fOutBuffer = MB_NEXT(fOutBuffer);
00063 }
00064 }
00065
00066 void JackMessageBuffer::AddMessage(int level, const char *message)
00067 {
00068 if (fMutex.Trylock()) {
00069 fBuffers[fInBuffer].level = level;
00070 strncpy(fBuffers[fInBuffer].message, message, MB_BUFFERSIZE);
00071 fInBuffer = MB_NEXT(fInBuffer);
00072 fSignal.SignalAll();
00073 fMutex.Unlock();
00074 } else {
00075 INC_ATOMIC(&fOverruns);
00076 }
00077 }
00078
00079 bool JackMessageBuffer::Execute()
00080 {
00081 fSignal.Wait();
00082 fMutex.Lock();
00083 Flush();
00084 fMutex.Unlock();
00085 return true;
00086 }
00087
00088 void JackMessageBuffer::Create()
00089 {
00090 if (fInstance == NULL) {
00091 fInstance = new JackMessageBuffer();
00092 }
00093 }
00094
00095 void JackMessageBuffer::Destroy()
00096 {
00097 if (fInstance != NULL) {
00098 delete fInstance;
00099 fInstance = NULL;
00100 }
00101 }
00102
00103 void JackMessageBufferAdd(int level, const char *message)
00104 {
00105 if (Jack::JackMessageBuffer::fInstance == NULL) {
00106
00107
00108 jack_log_function(LOG_LEVEL_ERROR, "messagebuffer not initialized, skip message");
00109 } else {
00110 Jack::JackMessageBuffer::fInstance->AddMessage(level, message);
00111 }
00112 }
00113
00114 };
00115