@@ -4,6 +4,7 @@ use std::str;
4
4
use nix:: errno:: Errno ;
5
5
use nix:: mqueue:: {
6
6
mq_attr_member_t, mq_close, mq_open, mq_receive, mq_send, mq_timedreceive,
7
+ mq_timedsend, mq_unlink,
7
8
} ;
8
9
use nix:: mqueue:: { MQ_OFlag , MqAttr } ;
9
10
use nix:: sys:: stat:: Mode ;
@@ -89,6 +90,68 @@ fn test_mq_timedreceive() {
89
90
assert_eq ! ( msg_to_send, str :: from_utf8( & buf[ 0 ..len] ) . unwrap( ) ) ;
90
91
}
91
92
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
+
92
155
#[ test]
93
156
fn test_mq_getattr ( ) {
94
157
use nix:: mqueue:: mq_getattr;
0 commit comments