// 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 "ipcpriv.h" #include "gfaipc.h" #include "procmem.h" #include "sysinfo.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; sysevt_t nSysEvtPending; }APP_CTRL_INFO, *LPAPP_CTRL_INFO; typedef const APP_CTRL_INFO *LPCAPP_CTRL_INFO; ///////////////////////////////////////////////////////////////////////////// typedef struct _APP_CTRL_SYSTEM { pid_t nPidInCharge; bool bBootFromEmmc; time_t nTsSystemStart; clock64_t nClkLastUpdate; int nUpdateError; GFA_APPCTRL_SYSMEM mem; uint32_t nDiskMask; uint32_t nPartMask; uint32_t nMountMask; GFA_SYSINFO_STORAGE_DEVICE_MAP sdm; GFA_SYSINFO_SPI spi; }APP_CTRL_SYSTEM, *LPAPP_CTRL_SYSTEM; typedef const APP_CTRL_SYSTEM *LPCAPP_CTRL_SYSTEM; ///////////////////////////////////////////////////////////////////////////// typedef struct _APP_CTRL_PROCESS : public APP_CTRL_INFO { GFA_APPCTRL_APPTIMES at; GFA_APPCTRL_APPMEM am; clock64_t nHeartbeatCurUs; clock64_t nHeartbeatLastUs; appid_t nAppID; appid_t nStateEvtSources; appid_t nHangingApps; sysevt_t nSysEvtRegistered; uint32_t nDiskMask; uint32_t nDiskAdded; uint32_t nDiskRemoved; uint32_t nPartMask; uint32_t nPartAdded; uint32_t nPartRemoved; uint32_t nMountMask; uint32_t nMountAdded; uint32_t nMountRemoved; char szDisplayName[_APP_CTRL_MAX_DISPLAY_NAME_LENGTH]; char szAppPath[_APP_CTRL_MAX_APP_PATH_LENGTH]; GfaIpcAppStates state; pid_t pid; uint32_t nAppFileSize; }APP_CTRL_PROCESS, *LPAPP_CTRL_PROCESS; typedef const APP_CTRL_PROCESS *LPCAPP_CTRL_PROCESS; ///////////////////////////////////////////////////////////////////////////// typedef struct _APP_CTRL { APP_CTRL_SYSTEM sys; GFA_SYSINFO_DATABASE sdb; 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 size_t GetAppSize(const char *pszAppPath); 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); void TriggertHeartBeat(void); 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); size_t GetAppSize(appid_t nAppID); 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); bool GetAppMem(appid_t nAppID, LPGFA_APPCTRL_APPMEM pam); bool CreateSysInfo(void); bool ReleaseSysInfo(void); bool UpdateSysInfo(void); bool UpdateStorageDeviceMap(const GFA_SYSINFO_STORAGE_DEVICE_MAP &sdm); bool UpdateDbInfo(const GFA_SYSINFO_DATABASE &sdb); bool GetSysMem(LPGFA_APPCTRL_SYSMEM psm); bool GetSysSPI(LPGFA_SYSINFO_SPI pspi); bool SubscribeSysEvents(sysevt_t nEvtMask); bool UnsubscribeSysEvents(sysevt_t nEvtMask); sysevt_t GetPendingSysEvents(void); int GetNextDiskAdded(LPGFA_SYSINFO_DISK pDisk); int GetNextDiskRemoved(LPGFA_SYSINFO_DISK pDisk); int GetNextPartitionAdded(LPGFA_SYSINFO_PARTITION pPart); int GetNextPartitionRemoved(LPGFA_SYSINFO_PARTITION pPart); int GetNextMountAdded(LPGFA_SYSINFO_PARTITION pPart); int GetNextMountRemoved(LPGFA_SYSINFO_PARTITION pPart); bool GetBootFromEmmc(bool *pbBootFromEmmc); bool GetDbInfo(LPGFA_SYSINFO_DATABASE psdb); bool KillApp(appid_t nAppID); 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; CProcMem m_procMem; CSysInfo m_sysInfo; }; ///////////////////////////////////////////////////////////////////////////// #endif // __cplusplus #endif // !defined(AGD_APPCTRL_H__33022269_A897_4553_AC60_4ED76DA5D077__INCLUDED_)