fix posix.mq_receive compilation with cpp backend (#20710)
* fix posix.mq_receive compilation with cpp backend * only enable runnableExample on posix * linux, not posix * simplify example * add test * mqueue.h does not exist on MacOS * place test case in own block * drop runnableExamples
This commit is contained in:
parent
4491da4c4d
commit
51bef9b4a8
3 changed files with 88 additions and 28 deletions
|
|
@ -249,26 +249,52 @@ proc setlocale*(a1: cint, a2: cstring): cstring {.
|
|||
proc strfmon*(a1: cstring, a2: int, a3: cstring): int {.varargs,
|
||||
importc, header: "<monetary.h>".}
|
||||
|
||||
when not defined(nintendoswitch):
|
||||
proc mq_close*(a1: Mqd): cint {.importc, header: "<mqueue.h>".}
|
||||
proc mq_getattr*(a1: Mqd, a2: ptr MqAttr): cint {.
|
||||
importc, header: "<mqueue.h>".}
|
||||
proc mq_notify*(a1: Mqd, a2: ptr SigEvent): cint {.
|
||||
importc, header: "<mqueue.h>".}
|
||||
proc mq_open*(a1: cstring, a2: cint): Mqd {.
|
||||
varargs, importc, header: "<mqueue.h>".}
|
||||
proc mq_receive*(a1: Mqd, a2: cstring, a3: int, a4: var int): int {.
|
||||
importc, header: "<mqueue.h>".}
|
||||
proc mq_send*(a1: Mqd, a2: cstring, a3: int, a4: int): cint {.
|
||||
importc, header: "<mqueue.h>".}
|
||||
proc mq_setattr*(a1: Mqd, a2, a3: ptr MqAttr): cint {.
|
||||
when not (defined(nintendoswitch) or defined(macos) or defined(macosx)):
|
||||
proc mq_notify*(mqdes: Mqd, event: ptr SigEvent): cint {.
|
||||
importc, header: "<mqueue.h>".}
|
||||
|
||||
proc mq_timedreceive*(a1: Mqd, a2: cstring, a3: int, a4: int,
|
||||
a5: ptr Timespec): int {.importc, header: "<mqueue.h>".}
|
||||
proc mq_timedsend*(a1: Mqd, a2: cstring, a3: int, a4: int,
|
||||
a5: ptr Timespec): cint {.importc, header: "<mqueue.h>".}
|
||||
proc mq_unlink*(a1: cstring): cint {.importc, header: "<mqueue.h>".}
|
||||
proc mq_open*(name: cstring, flags: cint): Mqd {.
|
||||
varargs, importc, header: "<mqueue.h>".}
|
||||
|
||||
proc mq_close*(mqdes: Mqd): cint {.importc, header: "<mqueue.h>".}
|
||||
|
||||
proc mq_receive*(
|
||||
mqdes: Mqd,
|
||||
buffer: cstring,
|
||||
length: csize_t,
|
||||
priority: var cuint
|
||||
): int {.importc, header: "<mqueue.h>".}
|
||||
|
||||
proc mq_timedreceive*(
|
||||
mqdes: Mqd,
|
||||
buffer: cstring,
|
||||
length: csize_t,
|
||||
priority: cuint,
|
||||
timeout: ptr Timespec
|
||||
): int {.importc, header: "<mqueue.h>".}
|
||||
|
||||
proc mq_send*(
|
||||
mqdes: Mqd,
|
||||
buffer: cstring,
|
||||
length: csize_t,
|
||||
priority: cuint
|
||||
): cint {.importc, header: "<mqueue.h>".}
|
||||
|
||||
proc mq_timedsend*(
|
||||
mqdes: Mqd,
|
||||
buffer: cstring,
|
||||
length: csize_t,
|
||||
priority: cuint,
|
||||
timeout: ptr Timespec
|
||||
): cint {.importc, header: "<mqueue.h>".}
|
||||
|
||||
proc mq_getattr*(mqdes: Mqd, attribute: ptr MqAttr): cint {.
|
||||
importc, header: "<mqueue.h>".}
|
||||
|
||||
proc mq_setattr*(mqdes: Mqd, newAttribute, oldAttribute: ptr MqAttr): cint {.
|
||||
importc, header: "<mqueue.h>".}
|
||||
|
||||
proc mq_unlink*(mqdes: cstring): cint {.importc, header: "<mqueue.h>".}
|
||||
|
||||
|
||||
proc getpwnam*(a1: cstring): ptr Passwd {.importc, header: "<pwd.h>".}
|
||||
|
|
|
|||
|
|
@ -108,15 +108,6 @@ type
|
|||
p_sign_posn*: char
|
||||
thousands_sep*: cstring
|
||||
|
||||
Mqd* {.importc: "mqd_t", header: "<mqueue.h>", final, pure.} = object
|
||||
MqAttr* {.importc: "struct mq_attr",
|
||||
header: "<mqueue.h>",
|
||||
final, pure.} = object ## message queue attribute
|
||||
mq_flags*: int ## Message queue flags.
|
||||
mq_maxmsg*: int ## Maximum number of messages.
|
||||
mq_msgsize*: int ## Maximum message size.
|
||||
mq_curmsgs*: int ## Number of messages currently queued.
|
||||
|
||||
Passwd* {.importc: "struct passwd", header: "<pwd.h>",
|
||||
final, pure.} = object ## struct passwd
|
||||
pw_name*: cstring ## User's login name.
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ outputsub: ""
|
|||
when not defined(windows):
|
||||
|
||||
import posix
|
||||
import std/syncio
|
||||
import std/[assertions, syncio]
|
||||
|
||||
var
|
||||
u: Utsname
|
||||
|
|
@ -18,3 +18,46 @@ when not defined(windows):
|
|||
writeLine(stdout, u.nodename)
|
||||
writeLine(stdout, u.release)
|
||||
writeLine(stdout, u.machine)
|
||||
|
||||
when not (defined(nintendoswitch) or defined(macos) or defined(macosx)):
|
||||
block:
|
||||
type Message = object
|
||||
value: int
|
||||
|
||||
const MQ_PATH: cstring = "/top_level_file"
|
||||
const MQ_PRIORITY: cuint = 170
|
||||
const MQ_MESSAGE_SIZE: csize_t = csize_t(sizeof(Message))
|
||||
|
||||
let mqd_a: posix.MqAttr = MqAttr(mq_maxmsg: 10, mq_msgsize: clong(MQ_MESSAGE_SIZE))
|
||||
let writable: posix.Mqd = posix.mq_open(
|
||||
MQ_PATH,
|
||||
posix.O_CREAT or posix.O_WRONLY or posix.O_NONBLOCK,
|
||||
posix.S_IRWXU,
|
||||
addr(mqd_a)
|
||||
)
|
||||
let readable: posix.Mqd = posix.mq_open(
|
||||
MQ_PATH,
|
||||
posix.O_RDONLY or posix.O_NONBLOCK,
|
||||
posix.S_IRWXU,
|
||||
addr(mqd_a)
|
||||
)
|
||||
|
||||
let sent: Message = Message(value: 88)
|
||||
block:
|
||||
let success: int = writable.mq_send(
|
||||
cast[cstring](sent.addr),
|
||||
MQ_MESSAGE_SIZE,
|
||||
MQ_PRIORITY
|
||||
)
|
||||
doAssert success == 0, $success
|
||||
|
||||
block:
|
||||
var buffer: Message
|
||||
var priority: cuint
|
||||
let bytesRead: int = readable.mq_receive(
|
||||
cast[cstring](buffer.addr),
|
||||
MQ_MESSAGE_SIZE,
|
||||
priority
|
||||
)
|
||||
doAssert buffer == sent
|
||||
doAssert bytesRead == int(MQ_MESSAGE_SIZE)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue