00001 #ifndef MERCURYCALLBACK_H
00002 #define MERCURYCALLBACK_H
00003
00004 #include <map>
00005 #include "global.h"
00006 #include "PStack.h"
00007
00008 static const MString BLANKSTR;
00009
00011
00014 typedef void (*MercuryCallbackFunction)( const MString &, void *, PStack & );
00015
00017 struct MercuryCallback
00018 {
00019 MercuryCallback( ): funct( NULL ), luser(NULL) {}
00020 MercuryCallback( MercuryCallbackFunction f, void * userdata ) :
00021 funct( f ), luser( userdata ) { }
00022
00023 MercuryCallbackFunction funct;
00024 void * luser;
00025
00026 inline bool operator ==( const MercuryCallback & c )
00027 { return ( ( c.funct == funct ) && (c.luser == luser )); }
00028
00029 inline bool operator !=( void * c )
00030 { return ( ( funct != c ) || ( luser != c )); }
00031
00032 };
00033
00034
00035 class ClbkManager
00036 {
00037 public:
00038 void Register(const void* addr)
00039 {
00040 MLockPtr< std::map< MVPtr, bool> > clbkMap(m_clbkMap, m_mutex);
00041 (*clbkMap)[(MVPtr)addr] = true;
00042 };
00043
00044 bool IsValid(const void* addr) const
00045 {
00046 MLockPtr< std::map< MVPtr, bool> > clbkMap(m_clbkMap, m_mutex);
00047 std::map< MVPtr, bool>::const_iterator i = clbkMap->find((MVPtr)addr);
00048 if (i != clbkMap->end())
00049 return true;
00050 return false;
00051 };
00052
00053 void Remove(const void* addr)
00054 {
00055 MLockPtr< std::map< MVPtr, bool> > clbkMap(m_clbkMap, m_mutex);
00056 std::map< MVPtr, bool>::iterator i = clbkMap->find((MVPtr)addr);
00057 if (i != clbkMap->end())
00058 clbkMap->erase(i);
00059 }
00060 private:
00061 volatile std::map< MVPtr, bool > m_clbkMap;
00062 MercuryMutex m_mutex;
00063 };
00064
00065
00066
00067 #endif
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095