Skip to content

Commit d344c33

Browse files
zfigurakakra
authored andcommitted
selftests: winesync: Add tests for WINESYNC_IOC_PULSE_SEM.
Signed-off-by: Kai Krakow <[email protected]>
1 parent e871a00 commit d344c33

File tree

1 file changed

+159
-2
lines changed
  • tools/testing/selftests/drivers/winesync

1 file changed

+159
-2
lines changed

tools/testing/selftests/drivers/winesync/winesync.c

Lines changed: 159 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,61 @@ TEST(semaphore_state)
155155
EXPECT_EQ(1, sem_args.count);
156156
EXPECT_EQ(2, sem_args.max);
157157

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+
158213
ret = ioctl(fd, WINESYNC_IOC_DELETE, &sem_args.sem);
159214
EXPECT_EQ(0, ret);
160215

@@ -330,6 +385,61 @@ TEST(semaphore_state_getonwait)
330385
EXPECT_EQ(1, sem_args.count);
331386
EXPECT_EQ(2, sem_args.max);
332387

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+
333443
ret = ioctl(fd, WINESYNC_IOC_DELETE, &sem_args.sem);
334444
EXPECT_EQ(0, ret);
335445

@@ -951,6 +1061,10 @@ TEST(invalid_objects)
9511061
EXPECT_EQ(-1, ret);
9521062
EXPECT_EQ(EINVAL, errno);
9531063

1064+
ret = ioctl(fd, WINESYNC_IOC_PULSE_SEM, &sem_args);
1065+
EXPECT_EQ(-1, ret);
1066+
EXPECT_EQ(EINVAL, errno);
1067+
9541068
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
9551069
EXPECT_EQ(-1, ret);
9561070
EXPECT_EQ(EINVAL, errno);
@@ -1136,6 +1250,30 @@ TEST(wake_any)
11361250
EXPECT_EQ(0, thread_args.ret);
11371251
EXPECT_EQ(0, wait_args.index);
11381252

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+
11391277
/* test waking the mutex */
11401278

11411279
/* first grab it again for owner 123 */
@@ -1281,14 +1419,14 @@ TEST(wake_all)
12811419
EXPECT_EQ(0, mutex_args.count);
12821420
EXPECT_EQ(0, mutex_args.owner);
12831421

1284-
sem_args.count = 2;
1422+
sem_args.count = 1;
12851423
ret = ioctl(fd, WINESYNC_IOC_PUT_SEM, &sem_args);
12861424
EXPECT_EQ(0, ret);
12871425
EXPECT_EQ(0, sem_args.count);
12881426

12891427
ret = ioctl(fd, WINESYNC_IOC_READ_SEM, &sem_args);
12901428
EXPECT_EQ(0, ret);
1291-
EXPECT_EQ(1, sem_args.count);
1429+
EXPECT_EQ(0, sem_args.count);
12921430

12931431
ret = ioctl(fd, WINESYNC_IOC_READ_MUTEX, &mutex_args);
12941432
EXPECT_EQ(0, ret);
@@ -1299,6 +1437,25 @@ TEST(wake_all)
12991437
EXPECT_EQ(0, ret);
13001438
EXPECT_EQ(0, thread_args.ret);
13011439

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+
13021459
/* delete an object while it's being waited on */
13031460

13041461
get_abs_timeout(&timeout, CLOCK_MONOTONIC, 200);

0 commit comments

Comments
 (0)