#include "sem_util.h"
|
#include "logger_factory.h"
|
#include <sys/sem.h>
|
#include <sys/shm.h>
|
#include <sys/types.h>
|
#include <sys/ipc.h>
|
#include <sys/msg.h>
|
#include <errno.h>
|
#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);
|
}
|
}
|
}
|