@@ -4,6 +4,7 @@ use std::str;
44use nix:: errno:: Errno ;
55use nix:: mqueue:: {
66 mq_attr_member_t, mq_close, mq_open, mq_receive, mq_send, mq_timedreceive,
7+ mq_timedsend, mq_unlink,
78} ;
89use nix:: mqueue:: { MQ_OFlag , MqAttr } ;
910use nix:: sys:: stat:: Mode ;
@@ -89,6 +90,68 @@ fn test_mq_timedreceive() {
8990 assert_eq ! ( msg_to_send, str :: from_utf8( & buf[ 0 ..len] ) . unwrap( ) ) ;
9091}
9192
93+ #[ test]
94+ fn test_mq_timedsend ( ) {
95+ const MSG_SIZE : mq_attr_member_t = 32 ;
96+ let attr = MqAttr :: new ( 0 , 10 , MSG_SIZE , 0 ) ;
97+ let mq_name = "/a_nix_test_queue_timedsend" ;
98+
99+ let oflag0 = MQ_OFlag :: O_CREAT | MQ_OFlag :: O_WRONLY ;
100+ let mode = Mode :: S_IWUSR | Mode :: S_IRUSR | Mode :: S_IRGRP | Mode :: S_IROTH ;
101+ let r0 = mq_open ( mq_name, oflag0, mode, Some ( & attr) ) ;
102+ if let Err ( Errno :: ENOSYS ) = r0 {
103+ println ! ( "message queues not supported or module not loaded?" ) ;
104+ return ;
105+ } ;
106+ let mqd0 = r0. unwrap ( ) ;
107+ let msg_to_send = "msg_1" ;
108+ let abstime =
109+ clock_gettime ( ClockId :: CLOCK_REALTIME ) . unwrap ( ) + TimeSpec :: seconds ( 1 ) ;
110+ mq_timedsend ( & mqd0, msg_to_send. as_bytes ( ) , 1 , & abstime) . unwrap ( ) ;
111+
112+ let oflag1 = MQ_OFlag :: O_CREAT | MQ_OFlag :: O_RDONLY ;
113+ let mqd1 = mq_open ( mq_name, oflag1, mode, Some ( & attr) ) . unwrap ( ) ;
114+ let mut buf = [ 0u8 ; 32 ] ;
115+ let mut prio = 0u32 ;
116+ let len = mq_receive ( & mqd1, & mut buf, & mut prio) . unwrap ( ) ;
117+ assert_eq ! ( prio, 1 ) ;
118+
119+ mq_close ( mqd1) . unwrap ( ) ;
120+ mq_close ( mqd0) . unwrap ( ) ;
121+ assert_eq ! ( msg_to_send, str :: from_utf8( & buf[ 0 ..len] ) . unwrap( ) ) ;
122+ mq_unlink ( mq_name) . unwrap ( ) ;
123+ }
124+
125+ #[ test]
126+ fn test_mq_timedsend_full ( ) {
127+ const MSG_SIZE : mq_attr_member_t = 32 ;
128+ let attr = MqAttr :: new ( 0 , 10 , MSG_SIZE , 0 ) ;
129+ let mq_name = "/a_nix_test_queue_fill" ;
130+
131+ let oflag0 = MQ_OFlag :: O_CREAT | MQ_OFlag :: O_WRONLY | MQ_OFlag :: O_CLOEXEC ;
132+ let mode = Mode :: S_IWUSR | Mode :: S_IRUSR | Mode :: S_IRGRP | Mode :: S_IROTH ;
133+ let r0 = mq_open ( mq_name, oflag0, mode, Some ( & attr) ) ;
134+ if let Err ( Errno :: ENOSYS ) = r0 {
135+ println ! ( "message queues not supported or module not loaded?" ) ;
136+ return ;
137+ } ;
138+ let mqd0 = r0. unwrap ( ) ;
139+ let msg_to_send = "msg_1" ;
140+ for _i in 0 ..10 {
141+ mq_send ( & mqd0, msg_to_send. as_bytes ( ) , 1 ) . unwrap ( ) ;
142+ }
143+
144+ let abstime =
145+ clock_gettime ( ClockId :: CLOCK_REALTIME ) . unwrap ( ) + TimeSpec :: seconds ( 1 ) ;
146+ assert_eq ! (
147+ mq_timedsend( & mqd0, msg_to_send. as_bytes( ) , 1 , & abstime) ,
148+ Err ( Errno :: ETIMEDOUT )
149+ ) ;
150+
151+ mq_close ( mqd0) . unwrap ( ) ;
152+ mq_unlink ( mq_name) . unwrap ( ) ;
153+ }
154+
92155#[ test]
93156fn test_mq_getattr ( ) {
94157 use nix:: mqueue:: mq_getattr;
0 commit comments