#include "sem_util.h" #include "logger_factory.h" #include #include #include #include #include #include #include "msg_mgr.h" static Logger *logger = LoggerFactory::getLogger(); static int sem_msg_id; static Msg_info gMsg_buf[MAX_LOCK]; static int rsv_msg_id; int msg_init(void) { key_t key = ftok(MSG_PATH, 0x01); memset(gMsg_buf, 0x00, sizeof(gMsg_buf)); sem_msg_id = msgget((key_t)key, 0666 | IPC_CREAT); if(sem_msg_id < 0) { logger->error("msgget failed with error: %d\n", sem_msg_id); return -1; } key_t key_rsv = ftok(MSG_RSV_PATH, 0x02); rsv_msg_id = msgget((key_t)key_rsv, 0666 | IPC_CREAT); if(rsv_msg_id == -1) { logger->error("msgget failed with error: %d\n", rsv_msg_id); return -1; } return 0; } void msg_distrib(int msg_id, Msg_info *message) { int ret; Msg_info* msg_obj = message; switch(msg_id) { case SEM_TYPE_ID: msg_obj->mtype = MSG_TYPE_SEM; ret = msgsnd(sem_msg_id, msg_obj, sizeof(Msg_info) - sizeof(long), IPC_NOWAIT); if(ret < 0) { logger->error("msg send fail: %d\n", ret); return; } break; case RSV_TYPE_ID: msg_obj->mtype = MSG_TYPE_RSV; ret = msgsnd(rsv_msg_id, msg_obj, sizeof(Msg_info), 0); if(ret < 0) { logger->error("msg send fail: %d\n", ret); return; } break; default: logger->error("unknown msg type!\n"); } } int get_msg_info(int Msgid, Msg_info *message) { int ret = 0; Msg_info msg_obj; int msg_id; if (Msgid == SEM_TYPE_ID) { msg_id = sem_msg_id; } else if (Msgid == RSV_TYPE_ID) { msg_id = rsv_msg_id; } ret = msgrcv(msg_id, (void*)&msg_obj, sizeof(Msg_info) - sizeof(long), MSG_TYPE_SEM, 0); if(ret < 0) { logger->error("msg recv fail: %d\n", ret); return -1; } switch(Msgid) { case SEM_TYPE_ID: msg_info_set(SEM_TYPE_ID, msg_obj); break; case RSV_TYPE_ID: msg_info_set(SEM_TYPE_ID, msg_obj); break; default: logger->error("unknown msg type!\n"); } return 0; } void msg_info_set(int index, Msg_info msg_obj) { gMsg_buf[index].key = msg_obj.key; gMsg_buf[index].id = msg_obj.id; if (msg_obj.act == SEM_POST) { gMsg_buf[index].count++; } else if (msg_obj.act == SEM_GET) { gMsg_buf[index].count--; } else if (msg_obj.act == SEM_RESET) { gMsg_buf[index].count = 0; } } void *sem_msg_handler(void *skptr) { int ret; Msg_info msg_obj; msg_init(); while(true) { ret = get_msg_info(SEM_TYPE_ID, &msg_obj); if (ret == 0) { //process_msg(msg_obj); } } }