// appctrl.h : // #if !defined(AGD_APPCTRL_H__33022269_A897_4553_AC60_4ED76DA5D077__INCLUDED_) #define AGD_APPCTRL_H__33022269_A897_4553_AC60_4ED76DA5D077__INCLUDED_ #include #include #include #include "gfaipc.h" ///////////////////////////////////////////////////////////////////////////// #ifdef __cplusplus ///////////////////////////////////////////////////////////////////////////// // svcipc.h - Declarations: #define _APP_CTRL_MAX_APP_PATH_LENGTH 256 #define _APP_CTRL_MAX_DISPLAY_NAME_LENGTH 128 #define _APP_CTRL_MAX_SLOTS ((int)(sizeof(appid_t) * 8)) #define _UUID_SHM_APP_CTRL_V1 "c3316f45-bcd6-424f-83bd-7d37ef9c3c6f" #define _NAME_SHM_APP_CTRL_V1 "GfA IPC Application Control SHM v1" #define _UUID_SHM_APP_CTRL _UUID_SHM_APP_CTRL_V1 #define _NAME_SHM_APP_CTRL _NAME_SHM_APP_CTRL_V1 ///////////////////////////////////////////////////////////////////////////// typedef struct _APP_CTRL_INFO { appid_t nStateEvtPending; ctrlmsg_t nCtrlMsgPending; GFA_APPCTRL_APPTIMES at; }APP_CTRL_INFO, *LPAPP_CTRL_INFO; typedef const APP_CTRL_INFO *LPCAPP_CTRL_INFO; ///////////////////////////////////////////////////////////////////////////// typedef struct _APP_CTRL_SYSTEM { time_t nTsStart; }APP_CTRL_SYSTEM, *LPAPP_CTRL_SYSTEM; typedef const APP_CTRL_SYSTEM *LPCAPP_CTRL_SYSTEM; ///////////////////////////////////////////////////////////////////////////// typedef struct _APP_CTRL_PROCESS : public APP_CTRL_INFO { clock64_t nHeartbeatCurUs; clock64_t nHeartbeatLastUs; appid_t nAppID; appid_t nStateEvtSources; appid_t nHangingApps; char szDisplayName[_APP_CTRL_MAX_DISPLAY_NAME_LENGTH]; char szAppPath[_APP_CTRL_MAX_APP_PATH_LENGTH]; GfaIpcAppStates state; pid_t pid; }APP_CTRL_PROCESS, *LPAPP_CTRL_PROCESS; typedef const APP_CTRL_PROCESS *LPCAPP_CTRL_PROCESS; ///////////////////////////////////////////////////////////////////////////// typedef struct _APP_CTRL { APP_CTRL_SYSTEM sys; APP_CTRL_PROCESS proc[_APP_CTRL_MAX_SLOTS]; }APP_CTRL, *LPAPP_CTRL; typedef const APP_CTRL *LPCAPP_CTRL; ///////////////////////////////////////////////////////////////////////////// class CAppCtrl { private: class CAppCtrlShmLocker { public: CAppCtrlShmLocker(CAppCtrl &rac); ~CAppCtrlShmLocker(void); void Unlock(void); private: CAppCtrl &m_rac; bool m_bLocked; }; public: CAppCtrl(void); ~CAppCtrl(void); static const char* GetAppPath(char *pszPath, size_t nCChPath, pid_t pid = 0); static const char* GetStateText(GfaIpcAppStates state); bool Create(appid_t nAppID, const char *pszDisplayName, clock64_t nCycleIntvUs, clock64_t nMaxHeartbeatDelay); void Release(bool bResetSlot = true); appid_t GetRunningAppsMask(void); LPAPP_CTRL_INFO AppInfoUpdate(clock64_t nCurWorkingTime); GfaIpcAppStates GetAppState(appid_t nAppID); GfaIpcAppStates SetAppState(GfaIpcAppStates state); static const char* GetAppStateText(GfaIpcAppStates state); const char* GetDisplayName(appid_t nAppID, char *pszName, size_t nCChName); bool PresetDisplayName(appid_t nAppID, const char *pszName); bool SubscribeStateEvents(appid_t nAppMask); bool UnsubscribeStateEvents(appid_t nAppMask); appid_t GetPendingStateEvents(void); bool SendCtrlMsg(appid_t nAppID, ctrlmsg_t msg); ctrlmsg_t GetPendingCtrlMsg(void); clock64_t GetAppTimes(appid_t nAppID, LPGFA_APPCTRL_APPTIMES pat); private: int SlotIndexFromAppID(appid_t nAppID); void AppStateChanged(appid_t nAppID, GfaIpcAppStates oldState, GfaIpcAppStates newState); const char* GetKnownAppDisplayName(appid_t nAppID, char *pszName, size_t nCChName); void Lock(void); void Unlock(void); private: static HSHM m_hShm; pid_t m_pid; LPAPP_CTRL m_pAppCtrl; int m_nSlotIdx; appid_t m_nAppID; long m_nLockCount; APP_CTRL_INFO m_ai; clock64_t m_nClkTicksPerSec; clock64_t m_nClockStartUs; clock64_t m_nLastTimesCallUs; }; ///////////////////////////////////////////////////////////////////////////// #endif // __cplusplus #endif // !defined(AGD_APPCTRL_H__33022269_A897_4553_AC60_4ED76DA5D077__INCLUDED_)