diff --git a/common/inc/pwrdata.h b/common/inc/pwrdata.h index 88a87ab8f6a70f1235f775f621ab7334e6b09f8a..108f88f23655daaa39859bdbdc57a7a6a6309ac3 100644 --- a/common/inc/pwrdata.h +++ b/common/inc/pwrdata.h @@ -15,6 +15,29 @@ #ifndef __POWERAPI_DATA_H__ #define __POWERAPI_DATA_H__ +#define MAX_NAME_LEN 128 +#define MAX_CPU_LIST_LEN 256 +#define MAX_NUMA_NODE_NUM 16 + +typedef struct PWR_CPU_NumaInfo{ + int nodeNo; + char cpuList[MAX_CPU_LIST_LEN]; +} PWR_CPU_NumaInfo; + +typedef struct PWR_CPU_Info{ + int arch; + int byteOrder; + char modelName[MAX_NAME_LEN]; + int coreNum; + char onlineList[MAX_CPU_LIST_LEN]; + int threadsPerCore; + int coresperSocket; + double maxFreq; + double minFreq; + int numaNum; + PWR_CPU_NumaInfo numa[MAX_NUMA_NODE_NUM]; +} PWR_CPU_Info; + typedef struct CPUUsage { // todo complete CPUUsage definition diff --git a/common/inc/pwrmsg.h b/common/inc/pwrmsg.h index c2adc7bbd7adfdf50faa591082e4fa27a02f2c99..3fde0589ed9e74fb0c3a84025cebd5fa1400ad54 100644 --- a/common/inc/pwrmsg.h +++ b/common/inc/pwrmsg.h @@ -47,10 +47,10 @@ typedef struct PwrMsg { } PwrMsg; enum OperationType { - GET_CPU_USAGE = 0, - GET_CPU_CACHE_MISS, - GET_CPU_TOP, - GET_DISK_IO_RATE = 30, + CPU_GET_USAGE = 0, + CPU_GET_INFO, + CPU_GET_CACHE_MISS, + DISK_GET_IO_RATE = 30, // todo }; enum DataFormat { @@ -74,9 +74,10 @@ static inline void ReleasePwrMsg(PwrMsg **msg) *msg = NULL; } -int GenerateReqMsg(PwrMsg *msg, enum OperationType optType, uint32_t dataLen, uint32_t taskNo, char *data); PwrMsg *ClonePwrMsg(PwrMsg *msg); +PwrMsg * CreateReqMsg(enum OperationType optType, uint32_t taskNo, uint32_t dataLen, char *data); int InitMsgFactory(); +void DestroyMsgFactory(); int GenerateRspMsg(PwrMsg *req, PwrMsg *rsp, int rspCode, char *data, int dataLen); #define TRUE 1 diff --git a/common/src/pwrmsg.c b/common/src/pwrmsg.c index 1ace4c7ba01401106e18f97611bf038fcf83f2a1..b1ac1b4c92a0c97bf6dca64b10d93ef92dda6ce3 100644 --- a/common/src/pwrmsg.c +++ b/common/src/pwrmsg.c @@ -19,19 +19,26 @@ #include static pid_t g_pid = 0; +static pthread_mutex_t g_seqLock; static uint32_t GenerateSeqId() { - // todo - return 0; + static uint16_t seed = 0; + uint32_t pid = g_pid << 16; + pthread_mutex_lock((pthread_mutex_t *)&g_seqLock); + uint32_t seqId = pid + seed; + seed++; + pthread_mutex_unlock((pthread_mutex_t *)&g_seqLock); + return seqId; } + static uint32_t GenerateCrcMagic() { // todo return 0; } -static int GenerateReqMsgHead(MsgHead *head, enum OperationType optType, uint32_t dataLen, uint32_t taskNo) +static int GenerateReqMsgHead(MsgHead *head, enum OperationType optType, uint32_t taskNo, uint32_t dataLen) { if (!head) { return ERR_NULL_POINTER; @@ -51,14 +58,17 @@ static int GenerateReqMsgHead(MsgHead *head, enum OperationType optType, uint32_ return SUCCESS; } -int GenerateReqMsg(PwrMsg *msg, enum OperationType optType, uint32_t dataLen, uint32_t taskNo, char *data) +PwrMsg * CreateReqMsg(enum OperationType optType, uint32_t taskNo, uint32_t dataLen, char *data) { - if (!msg) { - return ERR_NULL_POINTER; + PwrMsg *req = (PwrMsg*) malloc(sizeof(PwrMsg)); + if(!req) { + return NULL; } - bzero(msg, sizeof(PwrMsg)); - msg->data = data; - return GenerateReqMsgHead(&msg->head, optType, dataLen, taskNo); + + bzero(req, sizeof(PwrMsg)); + req->data = data; + GenerateReqMsgHead(&req->head, optType, dataLen, taskNo); + return req; } PwrMsg *ClonePwrMsg(PwrMsg *msg) @@ -71,6 +81,7 @@ PwrMsg *ClonePwrMsg(PwrMsg *msg) return NULL; } c->head = msg->head; + c->data = NULL; if (msg->data) { char *data = (char *)malloc(sizeof(msg->head.dataLen)); if (!data) { @@ -86,8 +97,15 @@ PwrMsg *ClonePwrMsg(PwrMsg *msg) int InitMsgFactory() { g_pid = getpid(); + pthread_mutex_init((pthread_mutex_t *)&g_seqLock, NULL); } +void DestroyMsgFactory() +{ + pthread_mutex_destroy((pthread_mutex_t *)&g_seqLock); +} + + int GenerateRspMsg(PwrMsg *req, PwrMsg *rsp, int rspCode, char *data, int dataLen) { if (!req || !rsp) { diff --git a/pwrapic/inc/powerapi.h b/pwrapic/inc/powerapi.h index f6010a9ee5c5850e2de25d600e19d19b90119a11..69243297da103c0954a8cf22938aae4e42a7990b 100644 --- a/pwrapic/inc/powerapi.h +++ b/pwrapic/inc/powerapi.h @@ -32,6 +32,7 @@ PWR_API int PWR_Register(); PWR_API int PWR_UnRegister(); // CPU +PWR_API int PWR_CPU_GetInfo(PWR_CPU_Info *cpuInfo); PWR_API int PWR_CPU_GetUsage(CPUUsage *usage); #ifdef __cplusplus diff --git a/pwrapic/inc/pwrcpu.h b/pwrapic/inc/pwrcpu.h index 4e3185455159ef5dc3f78a1f801aeb71cccf2ef4..5c37c50ecd73d3a74f4abd206a5a220a34ade237 100644 --- a/pwrapic/inc/pwrcpu.h +++ b/pwrapic/inc/pwrcpu.h @@ -16,7 +16,7 @@ #define __POWERAPI_CPU_H__ #include "powerapi.h" - +int GetCpuInfo(PWR_CPU_Info *cpuInfo); int GetUsage(CPUUsage *usage); diff --git a/pwrapic/inc/pwrlog.h b/pwrapic/inc/pwrlog.h index 27e30da444a72d2bc1661a00f1c007255306dbcd..f882d0fc634d1fd0da660f669f03201e72653490 100644 --- a/pwrapic/inc/pwrlog.h +++ b/pwrapic/inc/pwrlog.h @@ -24,13 +24,13 @@ enum PwrLogLevel { ERROR }; -extern void (*PwrLogCallback)(int level, const char *fmt, va_list vl); +extern void (*g_pwrlog_callback)(int level, const char *fmt, va_list vl); static inline void PwrLog(int level, const char *fmt, ...) { - if (PwrLogCallback) { + if (g_pwrlog_callback) { va_list vl; va_start(vl, fmt); - PwrLogCallback(level, fmt, vl); + g_pwrlog_callback(level, fmt, vl); va_end(vl); } } diff --git a/pwrapic/inc/sockclient.h b/pwrapic/inc/sockclient.h index 1543a421e3fed098fb9eda29b7350146c0ca64b9..c228c9180131dac89c1cc7cf95514a176e73808b 100644 --- a/pwrapic/inc/sockclient.h +++ b/pwrapic/inc/sockclient.h @@ -20,4 +20,5 @@ int InitSockClient(); int FiniSockClient(); int SendMsgSyn(PwrMsg *msg, PwrMsg **rsp); +int SendReqAndWaitForRsp(PwrMsg *req, PwrMsg **rsp); #endif diff --git a/pwrapic/src/powerapi.c b/pwrapic/src/powerapi.c index 87811b6d90889ae8990cf399a211360631af3116..8481821ec32b5c7f15ec30ca0cf56d90583fa4df 100644 --- a/pwrapic/src/powerapi.c +++ b/pwrapic/src/powerapi.c @@ -32,12 +32,12 @@ static void DefaultLogCallback(int level, const char *fmt, va_list vl) printf(fmt); } -void (*PwrLogCallback)(int level, const char *fmt, va_list vl) = DefaultLogCallback; +void (*g_pwrlog_callback)(int level, const char *fmt, va_list vl) = DefaultLogCallback; int PWR_SetLogCallback(void(LogCallback)(int, const char *, va_list)) { if (LogCallback) { - PwrLogCallback = LogCallback; + g_pwrlog_callback = LogCallback; return 0; } return -1; @@ -55,13 +55,21 @@ int PWR_Register() int PWR_UnRegister() { - CHECK_STATUS int ret = FiniSockClient(); // todo: 增加必要的其他去初始化动作 g_registed = 0; return ret; } +int PWR_CPU_GetInfo(PWR_CPU_Info *cpuInfo) +{ + CHECK_STATUS + if (!cpuInfo) { + return ERR_NULL_POINTER; + } + return GetCpuInfo(cpuInfo); +} + int PWR_CPU_GetUsage(CPUUsage *usage) { CHECK_STATUS diff --git a/pwrapic/src/pwrcpu.c b/pwrapic/src/pwrcpu.c index 9929414f5073d7071681ab6b36c038be3a95b513..cd6314ef9471799c43985b272b007b0f221125a8 100644 --- a/pwrapic/src/pwrcpu.c +++ b/pwrapic/src/pwrcpu.c @@ -20,48 +20,54 @@ #include "pwrmsg.h" #include "sockclient.h" -int GetUsage(CPUUsage *usage) +int GetCpuInfo(PWR_CPU_Info *cpuInfo) { - if (!usage) { - return ERR_NULL_POINTER; - } - // 组装消息 - PwrMsg *msg = (PwrMsg *)malloc(sizeof(PwrMsg)); - if (!msg) { - PwrLog(ERROR, "malloc failed."); - return ERR_COMMON; - } - bzero(msg, sizeof(PwrMsg)); - if (GenerateReqMsg(msg, GET_CPU_USAGE, 0, 0, NULL) != SUCCESS) { - PwrLog(ERROR, "Generate GetUsage req msg failed."); - ReleasePwrMsg(&msg); - return ERR_COMMON; + PwrMsg *req = CreateReqMsg(CPU_GET_INFO, 0, 0, NULL); + if (!req) { + PwrLog(ERROR, "Create CPU_GET_INFO req msg failed."); + return ERR_SYS_EXCEPTION; } - // 发送消息 PwrMsg *rsp = NULL; - if (SendMsgSyn(msg, &rsp) != SUCCESS) { - PwrLog(ERROR, "send GET_CPU_USAGE msg failed."); - ReleasePwrMsg(&msg); + int ret = SendReqAndWaitForRsp(req, &rsp); + if (ret != SUCCESS || !(rsp->data) || rsp->head.dataLen != sizeof(PWR_CPU_Info)) { + PwrLog(ERROR, "CPU_GET_INFO req failed. ret:%d", ret); + ReleasePwrMsg(&req); ReleasePwrMsg(&rsp); - return ERR_COMMON; + return ret == SUCCESS ? ERR_COMMON : ret; } - if (rsp == NULL || rsp->head.rspCode != SUCCESS) { - ReleasePwrMsg(&msg); + memcpy(cpuInfo, rsp->data, sizeof(PWR_CPU_Info)); + PwrLog(DEBUG, "CPU_GET_INFO Succeed."); + ReleasePwrMsg(&req); + ReleasePwrMsg(&rsp); + return SUCCESS; +} + +int GetUsage(CPUUsage *usage) +{ + // 组装消息 + PwrMsg *req = CreateReqMsg(CPU_GET_USAGE, 0, 0, NULL); + if (!req) { + PwrLog(ERROR, "Create CPU_GET_USAGE req msg failed."); + return ERR_SYS_EXCEPTION; + } + + // 发送消息 + PwrMsg *rsp = NULL; + int ret = SendReqAndWaitForRsp(req, &rsp); + if (ret != SUCCESS || !(rsp->data) || rsp->head.dataLen != sizeof(CPUUsage)) { + PwrLog(ERROR, "CPU_GET_USAGE req failed. ret:%d", ret); + ReleasePwrMsg(&req); ReleasePwrMsg(&rsp); - return rsp == NULL ? ERR_COMMON : rsp->head.rspCode; + return ret == SUCCESS ? ERR_COMMON : ret; } // 填充结果 - if (rsp->data) { - usage->usage = ((CPUUsage *)(rsp->data))->usage; - } else { - usage->usage = 0; - } + usage->usage = ((CPUUsage *)(rsp->data))->usage; PwrLog(DEBUG, "GET_CPU_USAGE succeed."); - ReleasePwrMsg(&msg); + ReleasePwrMsg(&req); ReleasePwrMsg(&rsp); return SUCCESS; } diff --git a/pwrapic/src/sockclient.c b/pwrapic/src/sockclient.c index de9796b1068cbe2af0b4395e6cfc21bb990e63cf..85c7f868d6cd8714cdec9d9260a948e5986f3c5b 100644 --- a/pwrapic/src/sockclient.c +++ b/pwrapic/src/sockclient.c @@ -277,6 +277,7 @@ int FiniSockClient() ResetPwrMsgBuffer(&g_sendBuff); ResetPwrMsgBuffer(&g_recvBuff); ResetResultWaitingList(&g_waitList); + DestroyMsgFactory(); return SUCCESS; } @@ -314,3 +315,22 @@ int SendMsgSyn(PwrMsg *msg, PwrMsg **rsp) ReleaseResultWaitingMsgNode(node); return SUCCESS; } + +int SendReqAndWaitForRsp(PwrMsg *req, PwrMsg **rsp) +{ + if (!req || !rsp) { + return ERR_NULL_POINTER; + } + CHECK_SOCKET_STATUS(); + + if (SendMsgSyn(req, rsp) != SUCCESS) { + PwrLog(ERROR, "send msg to server failed. optType: %d, seqId:%d", req->head.optType, req->head.seqId); + return ERR_SYS_EXCEPTION; + } + + if (*rsp == NULL || (*rsp)->head.rspCode != SUCCESS) { + PwrLog(ERROR, "rsp error. optType: %d, seqId:%d", req->head.optType, req->head.seqId); + return *rsp == NULL ? ERR_COMMON : (*rsp)->head.rspCode; + } + return SUCCESS; +} diff --git a/pwrapis/src/server.c b/pwrapis/src/server.c index dc2b5d4c1886e7b614fa47d667dc4d11b3b8072e..e9d0d779358aa291be4c0e01e16a00fd964581e9 100644 --- a/pwrapis/src/server.c +++ b/pwrapis/src/server.c @@ -32,8 +32,8 @@ static int g_listenFd = -1; static pthread_mutex_t g_listenFdLock = PTHREAD_MUTEX_INITIALIZER; -ThreadInfo g_sockProcThread; -ThreadInfo g_ServiceThread; +static ThreadInfo g_sockProcThread; +static ThreadInfo g_serviceThread; static PwrClient g_pwrClients[MAX_LICENT_NUM]; // 对该结构的读和写都在一个线程完成,因而不需要加锁 static PwrMsgBuffer g_sendBuff; // 发送队列 @@ -314,16 +314,16 @@ static void WaitForMsg() static void ProcessReqMsg(PwrMsg *req) { switch (req->head.optType) { - case GET_CPU_USAGE: + case CPU_GET_USAGE: GetCpuUsage(req); break; - case GET_CPU_CACHE_MISS: + case CPU_GET_CACHE_MISS: // todo break; - case GET_CPU_TOP: + case CPU_GET_INFO: // todo break; - case GET_DISK_IO_RATE: + case DISK_GET_IO_RATE: // todo break; default: @@ -339,7 +339,7 @@ static void ProcessReqMsg(PwrMsg *req) */ static void *RunServiceProcess() { - while (g_ServiceThread.keepRunning) { + while (g_serviceThread.keepRunning) { if (IsEmptyBuffer(&g_recvBuff)) { WaitForMsg(); } @@ -357,7 +357,7 @@ int StartServer() InitMsgFactory(); InitPwrMsgBuffer(&g_sendBuff); InitPwrMsgBuffer(&g_recvBuff); - InitThreadInfo(&g_ServiceThread); + InitThreadInfo(&g_serviceThread); InitThreadInfo(&g_sockProcThread); pthread_mutex_init((pthread_mutex_t *)&g_waitMsgMutex, NULL); pthread_cond_init((pthread_cond_t *)&g_waitMsgCond, NULL); @@ -368,7 +368,7 @@ int StartServer() return ERR_SYS_EXCEPTION; } - ret = CreateThread(&g_ServiceThread, RunServiceProcess); + ret = CreateThread(&g_serviceThread, RunServiceProcess); if (ret != SUCCESS) { Logger(ERROR, MD_NM_SVR, "Create service thread failed! ret[%d]", ret); return ERR_SYS_EXCEPTION; @@ -385,10 +385,11 @@ int StartServer() void StopServer() { FiniThreadInfo(&g_sockProcThread); - FiniThreadInfo(&g_ServiceThread); + FiniThreadInfo(&g_serviceThread); StopListen(); ResetPwrMsgBuffer(&g_sendBuff); ResetPwrMsgBuffer(&g_recvBuff); + DestroyMsgFactory(); pthread_cond_destroy((pthread_cond_t *)&g_waitMsgCond); pthread_mutex_destroy((pthread_mutex_t *)&g_waitMsgMutex); }