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