root/branches/libfreebob-2.0/src/debugmodule/debugmodule.h

Revision 336, 8.7 kB (checked in by pieterpalmers, 16 years ago)

- Merged the developments on trunk since branch-off:

branch occurred at rev 194
svn merge -r 194:HEAD https://svn.sourceforge.net/svnroot/freebob/trunk/libfreebob

- Modified libfreebobavc to use the messagebuffer for debug info.
- This should compile and run

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 /* debugmodule.h
2  * Copyright (C) 2005 by Daniel Wagner
3  *
4  * This file is part of FreeBoB.
5  *
6  * FreeBoB is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * FreeBoB is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with FreeBoB; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
18  * MA 02111-1307 USA.
19  */
20
21 #ifndef DEBUGMODULE_H
22 #define DEBUGMODULE_H
23
24 #include "../fbtypes.h"
25
26
27 #include <vector>
28 #include <iostream>
29
30 typedef short debug_level_t;
31
32 /* MB_NEXT() relies on the fact that MB_BUFFERS is a power of two */
33 #define MB_BUFFERS      4096
34 #define MB_NEXT(index) ((index+1) & (MB_BUFFERS-1))
35 #define MB_BUFFERSIZE   256             /* message length limit */
36
37 #define debugFatal( format, args... )                               \
38                 m_debugModule.print( DebugModule::eDL_Fatal,        \
39                                      __FILE__,                      \
40                                      __FUNCTION__,                  \
41                                      __LINE__,                      \
42                                      format,                        \
43                                      ##args )
44 #define debugError( format, args... )                               \
45                 m_debugModule.print( DebugModule::eDL_Error,        \
46                                      __FILE__,                      \
47                                      __FUNCTION__,                  \
48                                      __LINE__,                      \
49                                      format,                        \
50                                      ##args )
51 #define debugWarning( format, args... )                             \
52                 m_debugModule.print( DebugModule::eDL_Warning,      \
53                                      __FILE__,                      \
54                                      __FUNCTION__,                  \
55                                      __LINE__,                      \
56                                     format,                         \
57                                     ##args )
58
59 #define debugFatalShort( format, args... )                          \
60                 m_debugModule.printShort( DebugModule::eDL_Fatal,   \
61                                      format,                        \
62                                      ##args )
63 #define debugErrorShort( format, args... )                          \
64                 m_debugModule.printShort( DebugModule::eDL_Error,   \
65                                      format,                        \
66                                      ##args )
67 #define debugWarningShort( format, args... )                        \
68                 m_debugModule.printShort( DebugModule::eDL_Warning, \
69                                      format,                        \
70                                      ##args )
71
72 #define DECLARE_DEBUG_MODULE static DebugModule m_debugModule
73 #define IMPL_DEBUG_MODULE( ClassName, RegisterName, Level )        \
74                 DebugModule ClassName::m_debugModule =             \
75                     DebugModule( #RegisterName, Level )
76
77 #define DECLARE_GLOBAL_DEBUG_MODULE extern DebugModule m_debugModule
78 #define IMPL_GLOBAL_DEBUG_MODULE( RegisterName, Level )            \
79                 DebugModule m_debugModule =                        \
80                     DebugModule( #RegisterName, Level )
81
82 #define setDebugLevel( Level ) {                                    \
83                 m_debugModule.setLevel( Level ); \
84                                 }
85
86 /*                m_debugModule.print( eDL_Normal,                        \
87                                      __FILE__,                     \
88                                      __FUNCTION__,                 \
89                                      __LINE__,                     \
90                                      "Setting debug level to %d\n",  \
91                                      Level ); \
92                                 }*/
93
94 #define getDebugLevel(  )                                     \
95                 m_debugModule.getLevel( )
96
97
98 #ifdef DEBUG
99    
100     #define debugOutput( level, format, args... )                  \
101                 m_debugModule.print( level,                        \
102                                      __FILE__,                     \
103                                      __FUNCTION__,                 \
104                                      __LINE__,                     \
105                                      format,                       \
106                                      ##args )
107
108     #define debugOutputShort( level, format, args... )             \
109                 m_debugModule.printShort( level,                   \
110                                      format,                       \
111                                      ##args )
112
113 #else
114
115     #define debugOutput( level, format, args... )
116     #define debugOutputShort( level, format, args... )
117
118 #endif
119
120 /* Enable preemption checking for Linux Realtime Preemption kernels.
121  *
122  * This checks if any RT-safe code section does anything to cause CPU
123  * preemption.  Examples are sleep() or other system calls that block.
124  * If a problem is detected, the kernel writes a syslog entry, and
125  * sends SIGUSR2 to the client.
126  */
127
128 #define DO_PREEMPTION_CHECKING
129
130 #include <sys/time.h>
131  
132 #ifdef DO_PREEMPTION_CHECKING
133 #define CHECK_PREEMPTION(onoff) \
134         gettimeofday (1, (onoff))
135 #else
136 #define CHECK_PREEMPTION(engine, onoff)
137 #endif
138
139 // Intel recommends that a serializing instruction
140 // should be called before and after rdtsc.
141 // CPUID is a serializing instruction.
142 #define read_rdtsc(time) \
143         __asm__ __volatile__( \
144         "pushl %%ebx\n\t" \
145         "cpuid\n\t" \
146         "rdtsc\n\t" \
147         "mov %%eax,(%0)\n\t" \
148         "cpuid\n\t" \
149         "popl %%ebx\n\t" \
150         : /* no output */ \
151         : "S"(&time) \
152         : "eax", "ecx", "edx", "memory")
153
154 static inline unsigned long debugGetCurrentTSC() {
155     unsigned retval;
156     read_rdtsc(retval);
157     return retval;
158 }
159
160 unsigned char toAscii( unsigned char c );
161 void quadlet2char( fb_quadlet_t quadlet, unsigned char* buff );
162 void hexDump( unsigned char *data_start, unsigned int length );
163 void hexDumpQuadlets( quadlet_t *data_start, unsigned int length );
164
165 class DebugModule {
166 public:
167     enum {
168         eDL_Fatal       = 0,
169         eDL_Error       = 1,
170         eDL_Warning     = 2,
171         eDL_Normal      = 3,
172         eDL_Info        = 4,
173         eDL_Verbose     = 5,
174         eDL_VeryVerbose = 6,
175     } EDebugLevel;
176
177     DebugModule( std::string name, debug_level_t level );
178     virtual ~DebugModule();
179
180     void printShort( debug_level_t level,
181                      const char* format,
182                      ... ) const;
183
184     void print( debug_level_t level,
185                 const char*   file,
186                 const char*   function,
187                 unsigned int  line,
188                 const char*   format,
189                 ... ) const;
190
191     bool setLevel( debug_level_t level )
192         { m_level = level; return true; }
193     debug_level_t getLevel()
194         { return m_level; }
195     std::string getName()
196         { return m_name; }
197
198 protected:
199     const char* getPreSequence( debug_level_t level ) const;
200     const char* getPostSequence( debug_level_t level ) const;
201
202 private:
203     std::string   m_name;
204     debug_level_t m_level;
205 };
206
207 #define DEBUG_LEVEL_NORMAL          DebugModule::eDL_Normal
208 #define DEBUG_LEVEL_INFO            DebugModule::eDL_Info
209 #define DEBUG_LEVEL_VERBOSE         DebugModule::eDL_Verbose
210 #define DEBUG_LEVEL_VERY_VERBOSE    DebugModule::eDL_VeryVerbose
211
212
213 class DebugModuleManager {
214 public:
215     friend class DebugModule;
216
217     static DebugModuleManager* instance();
218     ~DebugModuleManager();
219    
220     bool setMgrDebugLevel( std::string name, debug_level_t level );
221
222 protected:
223     bool registerModule( DebugModule& debugModule );
224     bool unregisterModule( DebugModule& debugModule );
225
226     bool init();
227    
228     void print(const char *fmt, ...);
229     void va_print(const char *fmt, va_list);
230    
231 private:
232     DebugModuleManager();
233
234     typedef std::vector< DebugModule* > DebugModuleVector;
235     typedef std::vector< DebugModule* >::iterator DebugModuleVectorIterator;
236
237     char mb_buffers[MB_BUFFERS][MB_BUFFERSIZE];
238     unsigned int mb_initialized;
239     unsigned int mb_inbuffer;
240     unsigned int mb_outbuffer;
241     unsigned int mb_overruns;
242     pthread_t mb_writer_thread;
243     pthread_mutex_t mb_write_lock;
244     pthread_cond_t mb_ready_cond;
245
246     static void *mb_thread_func(void *arg);
247     void mb_flush();
248    
249     static DebugModuleManager* m_instance;
250     DebugModuleVector          m_debugModules;
251 };
252
253 #endif
Note: See TracBrowser for help on using the browser.