@@ -155,6 +155,61 @@ TEST(semaphore_state)
155
155
EXPECT_EQ (1 , sem_args .count );
156
156
EXPECT_EQ (2 , sem_args .max );
157
157
158
+ /* Test PULSE. */
159
+
160
+ sem_args .count = 2 ;
161
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
162
+ EXPECT_EQ (-1 , ret );
163
+ EXPECT_EQ (EOVERFLOW , errno );
164
+
165
+ sem_args .count = 0xdeadbeef ;
166
+ sem_args .max = 0xdeadbeef ;
167
+ ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
168
+ EXPECT_EQ (0 , ret );
169
+ EXPECT_EQ (0 , sem_args .count );
170
+ EXPECT_EQ (2 , sem_args .max );
171
+
172
+ sem_args .count = 1 ;
173
+ ret = ioctl (fd , WINESYNC_IOC_PUT_SEM , & sem_args );
174
+ EXPECT_EQ (0 , ret );
175
+ EXPECT_EQ (0 , sem_args .count );
176
+
177
+ sem_args .count = 1 ;
178
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
179
+ EXPECT_EQ (0 , ret );
180
+ EXPECT_EQ (1 , sem_args .count );
181
+
182
+ sem_args .count = 0xdeadbeef ;
183
+ sem_args .max = 0xdeadbeef ;
184
+ ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
185
+ EXPECT_EQ (0 , ret );
186
+ EXPECT_EQ (0 , sem_args .count );
187
+ EXPECT_EQ (2 , sem_args .max );
188
+
189
+ sem_args .count = 1 ;
190
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
191
+ EXPECT_EQ (0 , ret );
192
+ EXPECT_EQ (0 , sem_args .count );
193
+
194
+ sem_args .count = 0xdeadbeef ;
195
+ sem_args .max = 0xdeadbeef ;
196
+ ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
197
+ EXPECT_EQ (0 , ret );
198
+ EXPECT_EQ (0 , sem_args .count );
199
+ EXPECT_EQ (2 , sem_args .max );
200
+
201
+ sem_args .count = 2 ;
202
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
203
+ EXPECT_EQ (0 , ret );
204
+ EXPECT_EQ (0 , sem_args .count );
205
+
206
+ sem_args .count = 0xdeadbeef ;
207
+ sem_args .max = 0xdeadbeef ;
208
+ ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
209
+ EXPECT_EQ (0 , ret );
210
+ EXPECT_EQ (0 , sem_args .count );
211
+ EXPECT_EQ (2 , sem_args .max );
212
+
158
213
ret = ioctl (fd , WINESYNC_IOC_DELETE , & sem_args .sem );
159
214
EXPECT_EQ (0 , ret );
160
215
@@ -330,6 +385,61 @@ TEST(semaphore_state_getonwait)
330
385
EXPECT_EQ (1 , sem_args .count );
331
386
EXPECT_EQ (2 , sem_args .max );
332
387
388
+ /* Test PULSE. */
389
+
390
+ sem_args .count = 2 ;
391
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
392
+ EXPECT_EQ (-1 , ret );
393
+ EXPECT_EQ (EOVERFLOW , errno );
394
+
395
+ sem_args .count = 0xdeadbeef ;
396
+ sem_args .max = 0xdeadbeef ;
397
+ ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
398
+ EXPECT_EQ (0 , ret );
399
+ EXPECT_EQ (0 , sem_args .count );
400
+ EXPECT_EQ (2 , sem_args .max );
401
+
402
+ sem_args .count = 1 ;
403
+ ret = ioctl (fd , WINESYNC_IOC_PUT_SEM , & sem_args );
404
+ EXPECT_EQ (0 , ret );
405
+ EXPECT_EQ (0 , sem_args .count );
406
+
407
+ sem_args .count = 1 ;
408
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
409
+ EXPECT_EQ (0 , ret );
410
+ EXPECT_EQ (1 , sem_args .count );
411
+
412
+ sem_args .count = 0xdeadbeef ;
413
+ sem_args .max = 0xdeadbeef ;
414
+ ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
415
+ EXPECT_EQ (0 , ret );
416
+ EXPECT_EQ (0 , sem_args .count );
417
+ EXPECT_EQ (2 , sem_args .max );
418
+
419
+ sem_args .count = 1 ;
420
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
421
+ EXPECT_EQ (0 , ret );
422
+ EXPECT_EQ (0 , sem_args .count );
423
+
424
+ sem_args .count = 0xdeadbeef ;
425
+ sem_args .max = 0xdeadbeef ;
426
+ ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
427
+ EXPECT_EQ (0 , ret );
428
+ EXPECT_EQ (0 , sem_args .count );
429
+ EXPECT_EQ (2 , sem_args .max );
430
+
431
+ sem_args .count = 2 ;
432
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
433
+ EXPECT_EQ (0 , ret );
434
+ EXPECT_EQ (0 , sem_args .count );
435
+
436
+ sem_args .count = 0xdeadbeef ;
437
+ sem_args .max = 0xdeadbeef ;
438
+ ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
439
+ EXPECT_EQ (0 , ret );
440
+ EXPECT_EQ (0 , sem_args .count );
441
+ EXPECT_EQ (2 , sem_args .max );
442
+
333
443
ret = ioctl (fd , WINESYNC_IOC_DELETE , & sem_args .sem );
334
444
EXPECT_EQ (0 , ret );
335
445
@@ -951,6 +1061,10 @@ TEST(invalid_objects)
951
1061
EXPECT_EQ (-1 , ret );
952
1062
EXPECT_EQ (EINVAL , errno );
953
1063
1064
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
1065
+ EXPECT_EQ (-1 , ret );
1066
+ EXPECT_EQ (EINVAL , errno );
1067
+
954
1068
ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
955
1069
EXPECT_EQ (-1 , ret );
956
1070
EXPECT_EQ (EINVAL , errno );
@@ -1136,6 +1250,30 @@ TEST(wake_any)
1136
1250
EXPECT_EQ (0 , thread_args .ret );
1137
1251
EXPECT_EQ (0 , wait_args .index );
1138
1252
1253
+ /* test waking the semaphore via pulse */
1254
+
1255
+ get_abs_timeout (& timeout , CLOCK_MONOTONIC , 1000 );
1256
+ wait_args .owner = 456 ;
1257
+ ret = pthread_create (& thread , NULL , wait_thread , & thread_args );
1258
+ EXPECT_EQ (0 , ret );
1259
+
1260
+ ret = wait_for_thread (thread , 100 );
1261
+ EXPECT_EQ (ETIMEDOUT , ret );
1262
+
1263
+ sem_args .count = 2 ;
1264
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
1265
+ EXPECT_EQ (0 , ret );
1266
+ EXPECT_EQ (0 , sem_args .count );
1267
+
1268
+ ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
1269
+ EXPECT_EQ (0 , ret );
1270
+ EXPECT_EQ (0 , sem_args .count );
1271
+
1272
+ ret = wait_for_thread (thread , 100 );
1273
+ EXPECT_EQ (0 , ret );
1274
+ EXPECT_EQ (0 , thread_args .ret );
1275
+ EXPECT_EQ (0 , wait_args .index );
1276
+
1139
1277
/* test waking the mutex */
1140
1278
1141
1279
/* first grab it again for owner 123 */
@@ -1281,14 +1419,14 @@ TEST(wake_all)
1281
1419
EXPECT_EQ (0 , mutex_args .count );
1282
1420
EXPECT_EQ (0 , mutex_args .owner );
1283
1421
1284
- sem_args .count = 2 ;
1422
+ sem_args .count = 1 ;
1285
1423
ret = ioctl (fd , WINESYNC_IOC_PUT_SEM , & sem_args );
1286
1424
EXPECT_EQ (0 , ret );
1287
1425
EXPECT_EQ (0 , sem_args .count );
1288
1426
1289
1427
ret = ioctl (fd , WINESYNC_IOC_READ_SEM , & sem_args );
1290
1428
EXPECT_EQ (0 , ret );
1291
- EXPECT_EQ (1 , sem_args .count );
1429
+ EXPECT_EQ (0 , sem_args .count );
1292
1430
1293
1431
ret = ioctl (fd , WINESYNC_IOC_READ_MUTEX , & mutex_args );
1294
1432
EXPECT_EQ (0 , ret );
@@ -1299,6 +1437,25 @@ TEST(wake_all)
1299
1437
EXPECT_EQ (0 , ret );
1300
1438
EXPECT_EQ (0 , thread_args .ret );
1301
1439
1440
+ /* test waking the semaphore via pulse */
1441
+
1442
+ get_abs_timeout (& timeout , CLOCK_MONOTONIC , 1000 );
1443
+ wait_args .owner = 456 ;
1444
+ ret = pthread_create (& thread , NULL , wait_thread , & thread_args );
1445
+ EXPECT_EQ (0 , ret );
1446
+
1447
+ ret = wait_for_thread (thread , 100 );
1448
+ EXPECT_EQ (ETIMEDOUT , ret );
1449
+
1450
+ sem_args .count = 1 ;
1451
+ ret = ioctl (fd , WINESYNC_IOC_PULSE_SEM , & sem_args );
1452
+ EXPECT_EQ (0 , ret );
1453
+ EXPECT_EQ (0 , sem_args .count );
1454
+
1455
+ ret = wait_for_thread (thread , 100 );
1456
+ EXPECT_EQ (0 , ret );
1457
+ EXPECT_EQ (0 , thread_args .ret );
1458
+
1302
1459
/* delete an object while it's being waited on */
1303
1460
1304
1461
get_abs_timeout (& timeout , CLOCK_MONOTONIC , 200 );
0 commit comments