fujuntang
2021-11-10 c479ef57baaaa28964fc3ec8d80ff99dffa7d49f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#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);
    }
  }
}