libphobos: Merge common version blocks for core.sys.posix.sys.msg.

This is a continuation of simplifying C bindings so there aren't dozens
of duplicated code for each architecture.  For this particular module,
it now more closely resembles how glibc arranges msq.h, fixing a couple
of targets in the process, notably X32.

Backport from upstream druntime 2.084.

Reviewed-on: https://github.com/dlang/druntime/pull/2362

From-SVN: r267192
This commit is contained in:
Iain Buclaw 2018-12-16 23:18:25 +00:00
parent 8c02e05435
commit 3b26756ba2
1 changed files with 183 additions and 404 deletions

View File

@ -6,20 +6,192 @@
module core.sys.posix.sys.msg;
import core.sys.posix.config;
import core.sys.posix.sys.ipc;
public import core.sys.posix.sys.types;
public import core.stdc.config;
import core.sys.posix.sys.types;
import core.stdc.config;
version (CRuntime_Glibc):
// Some of these may be from linux kernel headers.
extern (C):
public enum MSG_STAT = 11;
public enum MSG_INFO = 12;
version (ARM) version = ARM_Any;
version (AArch64) version = ARM_Any;
version (HPPA) version = HPPA_Any;
version (HPPA64) version = HPPA_Any;
version (MIPS32) version = MIPS_Any;
version (MIPS64) version = MIPS_Any;
version (PPC) version = PPC_Any;
version (PPC64) version = PPC_Any;
version (RISCV32) version = RISCV_Any;
version (RISCV64) version = RISCV_Any;
version (S390) version = IBMZ_Any;
version (SPARC) version = SPARC_Any;
version (SPARC64) version = SPARC_Any;
version (SystemZ) version = IBMZ_Any;
public enum MSG_NOERROR = 1 << 12; // octal!10000
public enum MSG_EXCEPT = 2 << 12; // octal!20000
public enum MSG_COPY = 4 << 12; // octal!40000
version (linux)
{
enum MSG_STAT = 11;
enum MSG_INFO = 12;
enum MSG_NOERROR = 1 << 12; // octal!10000
enum MSG_EXCEPT = 2 << 12; // octal!20000
enum MSG_COPY = 4 << 12; // octal!40000
struct msginfo
{
int msgpool;
int msgmap;
int msgmax;
int msgmnb;
int msgmni;
int msgssz;
int msgtql;
ushort msgseg;
}
version (Alpha) version = GENERICMSQ;
version (ARM_Any) version = GENERICMSQ;
version (IA64) version = GENERICMSQ;
version (IBMZ_Any) version = GENERICMSQ;
version (RISCV_Any) version = GENERICMSQ;
version (GENERICMSQ)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/bits/msq-pad.h
private enum MSQ_PAD_AFTER_TIME = (__WORDSIZE == 32);
private enum MSQ_PAD_BEFORE_TIME = false;
}
else version (HPPA_Any)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/hppa/bits/msq-pad.h
private enum MSQ_PAD_AFTER_TIME = false;
private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
}
else version (MIPS_Any)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/mips/bits/msq-pad.h
version (LittleEndian)
{
private enum MSQ_PAD_AFTER_TIME = (__WORDSIZE == 32);
private enum MSQ_PAD_BEFORE_TIME = false;
}
else
{
private enum MSQ_PAD_AFTER_TIME = false;
private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
}
}
else version (PPC_Any)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/powerpc/bits/msq-pad.h
private enum MSQ_PAD_AFTER_TIME = false;
private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
}
else version (SPARC_Any)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/msq-pad.h
private enum MSQ_PAD_AFTER_TIME = false;
private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
}
else version (X86)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq-pad.h
private enum MSQ_PAD_AFTER_TIME = true;
private enum MSQ_PAD_BEFORE_TIME = false;
}
else version (X86_64)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq-pad.h
private enum MSQ_PAD_AFTER_TIME = false;
private enum MSQ_PAD_BEFORE_TIME = false;
}
else
static assert(0, "unimplemented");
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/bits/msq.h
alias msgqnum_t = ulong_t;
alias msglen_t = ulong_t;
static if (MSQ_PAD_BEFORE_TIME)
{
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __glibc_reserved1;
time_t msg_stime;
c_ulong __glibc_reserved2;
time_t msg_rtime;
c_ulong __glibc_reserved3;
time_t msg_ctime;
ulong_t __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
ulong_t __glibc_reserved4;
ulong_t __glibc_reserved5;
}
}
else static if (MSQ_PAD_AFTER_TIME)
{
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
c_ulong __glibc_reserved1;
time_t msg_rtime;
c_ulong __glibc_reserved2;
time_t msg_ctime;
c_ulong __glibc_reserved3;
ulong_t __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
ulong_t __glibc_reserved4;
ulong_t __glibc_reserved5;
}
}
else
{
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
ulong_t __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
ulong_t __glibc_reserved4;
ulong_t __glibc_reserved5;
}
}
}
else
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=bits/msq.h
enum MSG_NOERROR = 1 << 12; // octal!10000
alias msgqnum_t = ushort;
alias msglen_t = ushort;
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
}
}
struct msgbuf
{
@ -27,400 +199,7 @@ struct msgbuf
char[1] mtext;
}
struct msginfo
{
int msgpool;
int msgmap;
int msgmax;
int msgmnb;
int msgmni;
int msgssz;
int msgtql;
ushort msgseg;
}
version (Alpha)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/alpha/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved1;
c_ulong __glibc_reserved2;
}
}
else version (HPPA)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/hppa/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
// Assuming word size is 32
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __pad1;
time_t msg_stime;
c_ulong __pad2;
time_t msg_rtime;
c_ulong __pad3;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved1;
c_ulong __glibc_reserved2;
}
}
else version (MIPS32)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/mips/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
version (BigEndian) c_ulong __glibc_reserved1;
time_t msg_stime;
version (LittleEndian) c_ulong __glibc_reserved1;
version (BigEndian) c_ulong __glibc_reserved2;
time_t msg_rtime;
version (LittleEndian) c_ulong __glibc_reserved2;
version (BigEndian) c_ulong __glibc_reserved3;
time_t msg_ctime;
version (LittleEndian) c_ulong __glibc_reserved3;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (MIPS64)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/mips/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (PPC)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/powerpc/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __glibc_reserved1;
time_t msg_stime;
c_ulong __glibc_reserved2;
time_t msg_rtime;
c_ulong __glibc_reserved3;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (PPC64)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/powerpc/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (RISCV32)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/generic/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __glibc_reserved1;
time_t msg_stime;
c_ulong __glibc_reserved2;
time_t msg_rtime;
c_ulong __glibc_reserved3;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (RISCV64)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/generic/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (S390)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
// Assuming wordsize != 64
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __glibc_reserved1;
time_t msg_stime;
c_ulong __glibc_reserved2;
time_t msg_rtime;
c_ulong __glibc_reserved3;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (SystemZ)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
// Assuming wordsize == 64
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (SPARC)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
// Assuming word size is 32
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __pad1;
time_t msg_stime;
c_ulong __pad2;
time_t msg_rtime;
c_ulong __pad3;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved1;
c_ulong __glibc_reserved2;
}
}
else version (SPARC64)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
// Assuming word size is 32
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __pad1;
time_t msg_stime;
c_ulong __pad2;
time_t msg_rtime;
c_ulong __pad3;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved1;
c_ulong __glibc_reserved2;
}
}
else version (X86)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (X86_64)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __glibc_reserved1;
time_t msg_stime;
c_ulong __glibc_reserved2;
time_t msg_rtime;
c_ulong __glibc_reserved3;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (AArch64)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/generic/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
}
else version (ARM)
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/generic/bits/msq.h
alias c_ulong msgqnum_t;
alias c_ulong msglen_t;
struct msqid_ds
{
ipc_perm msg_perm;
c_ulong __glibc_reserved1;
time_t msg_stime;
c_ulong __glibc_reserved2;
time_t msg_rtime;
c_ulong __glibc_reserved3;
time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum;
msglen_t msg_qbytes;
pid_t msg_lspid;
pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
}
} else
static assert(0, "unimplemented");
public enum MSG_MEM_SCALE = 32;
public enum MSGMNI = 16;
public enum MSGMAX = 8192;
public enum MSGMNB = 16384;
int msgctl (int msqid, int cmd, msqid_ds *__buf);
int msgget ( key_t key, int msgflg );
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, c_long msgtyp, int msgflg);
int msgsnd ( int msqid, msgbuf *msgp, int msgsz, int msgflg );
int msgctl(int msqid, int cmd, msqid_ds* __buf);
int msgget(key_t key, int msgflg);
ssize_t msgrcv(int msqid, void* msgp, size_t msgsz, c_long msgtyp, int msgflg);
int msgsnd(int msqid, msgbuf* msgp, int msgsz, int msgflg);