00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 #ifndef dIpmiDiscover_h
00017 #define dIpmiDiscover_h
00018 
00019 
00020 class cIpmiDomain;
00021 class cIpmiMcThread;
00022 class cIpmiMcTask;
00023 
00024 
00025 
00026 #define dIpmiMcThreadInitialDiscover 1 // discover at startup
00027 #define dIpmiMcThreadPollAliveMc     2 // poll mc if found
00028 #define dIpmiMcThreadPollDeadMc      4 // poll mc if not found
00029 #define dIpmiMcThreadCreateM0        8 // create hotswap state M0
00030 
00031 
00032 typedef void (cIpmiMcThread::*tIpmiMcTask)( void *userdata );
00033 
00034 class cIpmiMcThread : public cThread
00035 {
00036 private:
00037   cIpmiDomain  *m_domain;
00038 
00039   void WriteLock();
00040   void WriteUnlock();
00041 
00042   unsigned char m_addr;
00043   cIpmiMc      *m_mc;
00044 
00045   
00046   unsigned int m_properties; 
00047 
00048 public:
00049   cIpmiMc     *Mc()   { return m_mc; }
00050 
00051 protected:
00052   virtual void *Run();
00053 
00054 public:
00055   
00056   bool m_exit;
00057 
00058   cIpmiMcThread( cIpmiDomain  *domain,
00059                  unsigned char addr,
00060                  unsigned int  properties );
00061 
00062   ~cIpmiMcThread();
00063 
00064 protected:
00065   cIpmiMcTask *m_tasks;
00066 
00067 public:
00068   
00069   void AddMcTask( tIpmiMcTask task, const cTime &timeout,
00070                   void *userdata );
00071 
00072   
00073   void AddMcTask( tIpmiMcTask task, unsigned int diff_ms,
00074                   void *userdata );
00075 
00076   
00077   bool RemMcTask( void *userdata );
00078 
00079   
00080   void ClearMcTaskList();
00081 
00082 protected:
00083   
00084   void Discover( cIpmiMsg *get_device_id_rsp = 0 );
00085 
00086   
00087   void PollAddr( void *userdata );
00088 
00089   cIpmiSel *m_sel;
00090 
00091   
00092   void ReadSel( void *userdata );
00093 
00094   GList *m_events;
00095   cThreadLock m_events_lock;
00096 
00097   void HandleEvents();
00098 
00099   void HandleEvent( cIpmiEvent *event );
00100   void HandleHotswapEvent( cIpmiSensorHotswap *sensor, cIpmiEvent *event );
00101 
00102 public:
00103   void AddEvent( cIpmiEvent *event );
00104 };
00105 
00106 
00107 #endif