]> Zhao Yanbai Git Server - minix.git/commitdiff
custom message type for SHMCTL, SEMCTL, SEMGET
authorBen Gras <ben@minix3.org>
Sat, 26 Jul 2014 11:53:53 +0000 (13:53 +0200)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:06:20 +0000 (17:06 +0200)
include/minix/com.h
include/minix/ipc.h
lib/libc/sys-minix/sem.c
lib/libc/sys-minix/shmctl.c
servers/ipc/sem.c
servers/ipc/shm.c

index 67bc7a1f16fc68494e1bcca4a508a1cedcb22302..d571f2a3ca7403b0889ddd6e2229c555200619dc 100644 (file)
 #define IPC_SHMAT      (IPC_BASE+2)
 #define IPC_SHMDT      (IPC_BASE+3)
 #define IPC_SHMCTL     (IPC_BASE+4)
-#      define SHMCTL_ID        m2_i1
-#      define SHMCTL_CMD       m2_i2
-#      define SHMCTL_BUF       m2_l1
-#      define SHMCTL_RET       m2_i3
 
 /* Semaphore */
 #define IPC_SEMGET     (IPC_BASE+5)
-#      define SEMGET_KEY       m2_l1
-#      define SEMGET_NR        m2_i1
-#      define SEMGET_FLAG      m2_i2
-#      define SEMGET_RETID     m2_i3
 #define IPC_SEMCTL     (IPC_BASE+6)
-#      define SEMCTL_ID        m2_i1
-#      define SEMCTL_NUM       m2_i2
-#      define SEMCTL_CMD       m2_i3
-#      define SEMCTL_OPT       m2_l1
 #define IPC_SEMOP      (IPC_BASE+7)
 #      define SEMOP_ID         m2_i1
 #      define SEMOP_OPS        m2_l1
index 374da5358cf3aefd79b2e7a4841483d8df7f0d16..328eab4cadf1c3059386370d1fc977ef853da5fb 100644 (file)
@@ -1789,6 +1789,34 @@ typedef struct {
 } mess_lc_ipc_shmdt;
 _ASSERT_MSG_SIZE(mess_lc_ipc_shmdt);
 
+typedef struct {
+       int             id;
+       int             cmd;
+       void            *buf;
+       int             ret;
+       uint8_t         padding[40];
+} mess_lc_ipc_shmctl;
+_ASSERT_MSG_SIZE(mess_lc_ipc_shmctl);
+
+typedef struct {
+       key_t           key;
+       int             nr;
+       int             flag;
+       int             retid;
+       uint8_t         padding[40];
+} mess_lc_ipc_semget;
+_ASSERT_MSG_SIZE(mess_lc_ipc_semget);
+
+typedef struct {
+       int             id;
+       int             num;
+       int             cmd;
+       int             opt;
+       int             ret;
+       uint8_t         padding[36];
+} mess_lc_ipc_semctl;
+_ASSERT_MSG_SIZE(mess_lc_ipc_semctl);
+
 typedef struct {
        endpoint_t m_source;            /* who sent the message */
        int m_type;                     /* what kind of message is it */
@@ -2018,6 +2046,9 @@ typedef struct {
                mess_lc_ipc_shmget      m_lc_ipc_shmget;
                mess_lc_ipc_shmat       m_lc_ipc_shmat;
                mess_lc_ipc_shmdt       m_lc_ipc_shmdt;
+               mess_lc_ipc_shmctl      m_lc_ipc_shmctl;
+               mess_lc_ipc_semget      m_lc_ipc_semget;
+               mess_lc_ipc_semctl      m_lc_ipc_semctl;
 
                mess_vfs_lchardriver_cancel     m_vfs_lchardriver_cancel;
                mess_vfs_lchardriver_openclose  m_vfs_lchardriver_openclose;
index de8ba6c7faefe4e2caa6d6f0d8fb4f34df69b35f..37d3b3e664e152c9e4f5b969acf975f37122cfd2 100644 (file)
@@ -35,15 +35,15 @@ int semget(key_t key, int nsems, int semflag)
        }
 
        memset(&m, 0, sizeof(m));
-       m.SEMGET_KEY = key;
-       m.SEMGET_NR = nsems;
-       m.SEMGET_FLAG = semflag;
+       m.m_lc_ipc_semget.key = key;
+       m.m_lc_ipc_semget.nr = nsems;
+       m.m_lc_ipc_semget.flag = semflag;
 
        r = _syscall(ipc_pt, IPC_SEMGET, &m);
        if (r != OK)
                return r;
 
-       return m.SEMGET_RETID;
+       return m.m_lc_ipc_semget.retid;
 }
  
 /* Semaphore control operation.  */
@@ -60,21 +60,21 @@ int semctl(int semid, int semnum, int cmd, ...)
        }
 
        memset(&m, 0, sizeof(m));
-       m.SEMCTL_ID = semid;
-       m.SEMCTL_NUM = semnum;
-       m.SEMCTL_CMD = cmd;
+       m.m_lc_ipc_semctl.id = semid;
+       m.m_lc_ipc_semctl.num = semnum;
+       m.m_lc_ipc_semctl.cmd = cmd;
        va_start(ap, cmd);
        if (cmd == IPC_STAT || cmd == IPC_SET || cmd == IPC_INFO ||
                cmd == SEM_INFO || cmd == SEM_STAT || cmd == GETALL ||
                cmd == SETALL || cmd == SETVAL)
-               m.SEMCTL_OPT = (long) va_arg(ap, long);
+               m.m_lc_ipc_semctl.opt = (long) va_arg(ap, long);
        va_end(ap); 
 
        r = _syscall(ipc_pt, IPC_SEMCTL, &m);
        if ((r != -1) && (cmd == GETNCNT || cmd == GETZCNT || cmd == GETPID ||
                cmd == GETVAL || cmd == IPC_INFO || cmd == SEM_INFO ||
                cmd == SEM_STAT))
-               return m.SHMCTL_RET;
+               return m.m_lc_ipc_semctl.ret;
        return r;
 }
 
index e3d10e7601c675f7f0fb688e86189ded800f0da3..9612e65a57d0c9cd28fad14a7998c470a4bc2415 100644 (file)
@@ -32,14 +32,14 @@ int shmctl(int shmid, int cmd, struct shmid_ds *buf)
        }
 
        memset(&m, 0, sizeof(m));
-       m.SHMCTL_ID = shmid;
-       m.SHMCTL_CMD = cmd;
-       m.SHMCTL_BUF = (long) buf;
+       m.m_lc_ipc_shmctl.id = shmid;
+       m.m_lc_ipc_shmctl.cmd = cmd;
+       m.m_lc_ipc_shmctl.buf = buf;
 
        r = _syscall(ipc_pt, IPC_SHMCTL, &m);
        if ((cmd == IPC_INFO || cmd == SHM_INFO || cmd == SHM_STAT)
                && (r == OK))
-               return m.SHMCTL_RET;
+               return m.m_lc_ipc_shmctl.ret;
        return r;
 }
 
index 558d35888d8b2160afc2b15233c351c2c8937730..1b37894ed9eb941a630d2572f57d6d328ed624a1 100644 (file)
@@ -57,9 +57,9 @@ int do_semget(message *m)
        int nsems, flag, id;
        struct sem_struct *sem;
 
-       key = m->SEMGET_KEY;
-       nsems = m->SEMGET_NR;
-       flag = m->SEMGET_FLAG;
+       key = m->m_lc_ipc_semget.key;
+       nsems = m->m_lc_ipc_semget.nr;
+       flag = m->m_lc_ipc_semget.flag;
 
        if ((sem = sem_find_key(key))) {
                if ((flag & IPC_CREAT) && (flag & IPC_EXCL))
@@ -94,7 +94,7 @@ int do_semget(message *m)
                sem_list_nr++;
        }
 
-       m->SEMGET_RETID = id;
+       m->m_lc_ipc_semget.retid = id;
        return OK;
 }
 
@@ -287,14 +287,14 @@ int do_semctl(message *m)
        struct semid_ds *ds, tmp_ds;
        struct sem_struct *sem;
 
-       id = m->SEMCTL_ID;
-       num = m->SEMCTL_NUM;
-       cmd = m->SEMCTL_CMD;
+       id = m->m_lc_ipc_semctl.id;
+       num = m->m_lc_ipc_semctl.num;
+       cmd = m->m_lc_ipc_semctl.cmd;
 
        if (cmd == IPC_STAT || cmd == IPC_SET || cmd == IPC_INFO ||
                cmd == SEM_INFO || cmd == SEM_STAT || cmd == GETALL ||
                cmd == SETALL || cmd == SETVAL)
-               opt = m->SEMCTL_OPT;
+               opt = m->m_lc_ipc_semctl.opt;
 
        if (!(sem = sem_find_id(id))) {
                return EINVAL;
@@ -367,22 +367,22 @@ int do_semctl(message *m)
        case GETNCNT:
                if (num < 0 || num >= sem->semid_ds.sem_nsems)
                        return EINVAL;
-               m->SHMCTL_RET = sem->sems[num].semncnt;
+               m->m_lc_ipc_semctl.ret = sem->sems[num].semncnt;
                break;
        case GETPID:
                if (num < 0 || num >= sem->semid_ds.sem_nsems)
                        return EINVAL;
-               m->SHMCTL_RET = sem->sems[num].sempid;
+               m->m_lc_ipc_semctl.ret = sem->sems[num].sempid;
                break;
        case GETVAL:
                if (num < 0 || num >= sem->semid_ds.sem_nsems)
                        return EINVAL;
-               m->SHMCTL_RET = sem->sems[num].semval;
+               m->m_lc_ipc_semctl.ret = sem->sems[num].semval;
                break;
        case GETZCNT:
                if (num < 0 || num >= sem->semid_ds.sem_nsems)
                        return EINVAL;
-               m->SHMCTL_RET = sem->sems[num].semzcnt;
+               m->m_lc_ipc_semctl.ret = sem->sems[num].semzcnt;
                break;
        case SETALL:
                buf = malloc(sizeof(unsigned short) * sem->semid_ds.sem_nsems);
index da90a9cbd5aea22077bffda266d59e0177058ed4..3ce9568db3cbd7a26003a4710ed8d04b7d762ffa 100644 (file)
@@ -217,9 +217,9 @@ int do_shmdt(message *m)
  *===========================================================================*/
 int do_shmctl(message *m)
 {
-       int id = m->SHMCTL_ID;
-       int cmd = m->SHMCTL_CMD;
-       struct shmid_ds *ds = (struct shmid_ds *)m->SHMCTL_BUF;
+       int id = m->m_lc_ipc_shmctl.id;
+       int cmd = m->m_lc_ipc_shmctl.cmd;
+       struct shmid_ds *ds = (struct shmid_ds *)m->m_lc_ipc_shmctl.buf;
        struct shmid_ds tmp_ds;
        struct shm_struct *shm = NULL;
        struct shminfo sinfo;
@@ -286,9 +286,9 @@ int do_shmctl(message *m)
                        who_e, (vir_bytes)ds, sizeof(struct shminfo));
                if (r != OK)
                        return EFAULT;
-               m->SHMCTL_RET = shm_list_nr - 1;
-               if (m->SHMCTL_RET < 0)
-                       m->SHMCTL_RET = 0;
+               m->m_lc_ipc_shmctl.ret = (shm_list_nr - 1);
+               if (m->m_lc_ipc_shmctl.ret < 0)
+                       m->m_lc_ipc_shmctl.ret = 0;
                break;
        case SHM_INFO:
                if (!ds)
@@ -306,9 +306,9 @@ int do_shmctl(message *m)
                        who_e, (vir_bytes)ds, sizeof(struct shm_info));
                if (r != OK)
                        return EFAULT;
-               m->SHMCTL_RET = shm_list_nr - 1;
-               if (m->SHMCTL_RET < 0)
-                       m->SHMCTL_RET = 0;
+               m->m_lc_ipc_shmctl.ret = shm_list_nr - 1;
+               if (m->m_lc_ipc_shmctl.ret < 0)
+                       m->m_lc_ipc_shmctl.ret = 0;
                break;
        case SHM_STAT:
                if (id < 0 || id >= shm_list_nr)
@@ -318,7 +318,7 @@ int do_shmctl(message *m)
                        who_e, (vir_bytes)ds, sizeof(struct shmid_ds));
                if (r != OK)
                        return EFAULT;
-               m->SHMCTL_RET = shm->id;
+               m->m_lc_ipc_shmctl.ret = shm->id;
                break;
        default:
                return EINVAL;