Commit 3b26756b by Iain Buclaw

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
parent 8c02e054
...@@ -6,29 +6,41 @@ ...@@ -6,29 +6,41 @@
module core.sys.posix.sys.msg; module core.sys.posix.sys.msg;
import core.sys.posix.config;
import core.sys.posix.sys.ipc; import core.sys.posix.sys.ipc;
public import core.sys.posix.sys.types; import core.sys.posix.sys.types;
public import core.stdc.config; import core.stdc.config;
version (CRuntime_Glibc): version (CRuntime_Glibc):
// Some of these may be from linux kernel headers. // Some of these may be from linux kernel headers.
extern (C): extern (C):
public enum MSG_STAT = 11; version (ARM) version = ARM_Any;
public enum MSG_INFO = 12; 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 version (linux)
public enum MSG_EXCEPT = 2 << 12; // octal!20000
public enum MSG_COPY = 4 << 12; // octal!40000
struct msgbuf
{ {
c_long mtype; enum MSG_STAT = 11;
char[1] mtext; enum MSG_INFO = 12;
}
struct msginfo 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 msgpool;
int msgmap; int msgmap;
int msgmax; int msgmax;
...@@ -37,201 +49,73 @@ struct msginfo ...@@ -37,201 +49,73 @@ struct msginfo
int msgssz; int msgssz;
int msgtql; int msgtql;
ushort msgseg; ushort msgseg;
} }
version (Alpha) version (Alpha) version = GENERICMSQ;
{ version (ARM_Any) version = GENERICMSQ;
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/alpha/bits/msq.h version (IA64) version = GENERICMSQ;
alias c_ulong msgqnum_t; version (IBMZ_Any) version = GENERICMSQ;
alias c_ulong msglen_t; version (RISCV_Any) version = GENERICMSQ;
struct msqid_ds version (GENERICMSQ)
{ {
ipc_perm msg_perm; // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/bits/msq-pad.h
time_t msg_stime; private enum MSQ_PAD_AFTER_TIME = (__WORDSIZE == 32);
time_t msg_rtime; private enum MSQ_PAD_BEFORE_TIME = false;
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_Any)
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; // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/hppa/bits/msq-pad.h
c_ulong __pad1; private enum MSQ_PAD_AFTER_TIME = false;
time_t msg_stime; private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
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 (MIPS_Any)
}
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; // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/mips/bits/msq-pad.h
version (BigEndian) c_ulong __glibc_reserved1; version (LittleEndian)
time_t msg_stime; {
version (LittleEndian) c_ulong __glibc_reserved1; private enum MSQ_PAD_AFTER_TIME = (__WORDSIZE == 32);
version (BigEndian) c_ulong __glibc_reserved2; private enum MSQ_PAD_BEFORE_TIME = false;
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
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; private enum MSQ_PAD_AFTER_TIME = false;
time_t msg_stime; private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
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) else version (PPC_Any)
{
// 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; // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/powerpc/bits/msq-pad.h
c_ulong __glibc_reserved1; private enum MSQ_PAD_AFTER_TIME = false;
time_t msg_stime; private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
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 (SPARC_Any)
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; // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/sparc/bits/msq-pad.h
time_t msg_stime; private enum MSQ_PAD_AFTER_TIME = false;
time_t msg_rtime; private enum MSQ_PAD_BEFORE_TIME = (__WORDSIZE == 32);
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)
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; // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq-pad.h
c_ulong __glibc_reserved1; private enum MSQ_PAD_AFTER_TIME = true;
time_t msg_stime; private enum MSQ_PAD_BEFORE_TIME = false;
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 (X86_64)
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; // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86/bits/msq-pad.h
time_t msg_stime; private enum MSQ_PAD_AFTER_TIME = false;
time_t msg_rtime; private enum MSQ_PAD_BEFORE_TIME = false;
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
else version (S390) static assert(0, "unimplemented");
{
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/s390/bits/msq.h // https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/bits/msq.h
alias c_ulong msgqnum_t; alias msgqnum_t = ulong_t;
alias c_ulong msglen_t; alias msglen_t = ulong_t;
// Assuming wordsize != 64 static if (MSQ_PAD_BEFORE_TIME)
{
struct msqid_ds struct msqid_ds
{ {
ipc_perm msg_perm; ipc_perm msg_perm;
...@@ -241,186 +125,81 @@ else version (S390) ...@@ -241,186 +125,81 @@ else version (S390)
time_t msg_rtime; time_t msg_rtime;
c_ulong __glibc_reserved3; c_ulong __glibc_reserved3;
time_t msg_ctime; time_t msg_ctime;
c_ulong __msg_cbytes; ulong_t __msg_cbytes;
msgqnum_t msg_qnum; msgqnum_t msg_qnum;
msglen_t msg_qbytes; msglen_t msg_qbytes;
pid_t msg_lspid; pid_t msg_lspid;
pid_t msg_lrpid; pid_t msg_lrpid;
c_ulong __glibc_reserved4; ulong_t __glibc_reserved4;
c_ulong __glibc_reserved5; ulong_t __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 static if (MSQ_PAD_AFTER_TIME)
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 struct msqid_ds
{ {
ipc_perm msg_perm; ipc_perm msg_perm;
c_ulong __pad1;
time_t msg_stime; 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_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_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; c_ulong __glibc_reserved2;
time_t msg_rtime;
c_ulong __glibc_reserved3;
time_t msg_ctime; time_t msg_ctime;
c_ulong __msg_cbytes; c_ulong __glibc_reserved3;
ulong_t __msg_cbytes;
msgqnum_t msg_qnum; msgqnum_t msg_qnum;
msglen_t msg_qbytes; msglen_t msg_qbytes;
pid_t msg_lspid; pid_t msg_lspid;
pid_t msg_lrpid; pid_t msg_lrpid;
c_ulong __glibc_reserved4; ulong_t __glibc_reserved4;
c_ulong __glibc_reserved5; ulong_t __glibc_reserved5;
} }
} }
else version (AArch64) else
{ {
// 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 struct msqid_ds
{ {
ipc_perm msg_perm; ipc_perm msg_perm;
time_t msg_stime; time_t msg_stime;
time_t msg_rtime; time_t msg_rtime;
time_t msg_ctime; time_t msg_ctime;
c_ulong __msg_cbytes; ulong_t __msg_cbytes;
msgqnum_t msg_qnum; msgqnum_t msg_qnum;
msglen_t msg_qbytes; msglen_t msg_qbytes;
pid_t msg_lspid; pid_t msg_lspid;
pid_t msg_lrpid; pid_t msg_lrpid;
c_ulong __glibc_reserved4; ulong_t __glibc_reserved4;
c_ulong __glibc_reserved5; ulong_t __glibc_reserved5;
}
} }
} }
else version (ARM) else
{ {
// https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/generic/bits/msq.h // https://sourceware.org/git/?p=glibc.git;a=blob;f=bits/msq.h
alias c_ulong msgqnum_t; enum MSG_NOERROR = 1 << 12; // octal!10000
alias c_ulong msglen_t;
alias msgqnum_t = ushort;
alias msglen_t = ushort;
struct msqid_ds struct msqid_ds
{ {
ipc_perm msg_perm; ipc_perm msg_perm;
c_ulong __glibc_reserved1;
time_t msg_stime; time_t msg_stime;
c_ulong __glibc_reserved2;
time_t msg_rtime; time_t msg_rtime;
c_ulong __glibc_reserved3;
time_t msg_ctime; time_t msg_ctime;
c_ulong __msg_cbytes;
msgqnum_t msg_qnum; msgqnum_t msg_qnum;
msglen_t msg_qbytes; msglen_t msg_qbytes;
pid_t msg_lspid; pid_t msg_lspid;
pid_t msg_lrpid; pid_t msg_lrpid;
c_ulong __glibc_reserved4;
c_ulong __glibc_reserved5;
} }
} else }
static assert(0, "unimplemented");
public enum MSG_MEM_SCALE = 32; struct msgbuf
public enum MSGMNI = 16; {
public enum MSGMAX = 8192; c_long mtype;
public enum MSGMNB = 16384; char[1] mtext;
}
int msgctl (int msqid, int cmd, msqid_ds *__buf); int msgctl(int msqid, int cmd, msqid_ds* __buf);
int msgget ( key_t key, int msgflg ); int msgget(key_t key, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, c_long msgtyp, 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 msgsnd(int msqid, msgbuf* msgp, int msgsz, int msgflg);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment