diff --git a/src/header/sys_epoll/cbindgen.toml b/src/header/sys_epoll/cbindgen.toml index e162dbb4f6ce185318d8a0e8d9e9e35a0907fe7f..a998c82f33f524f4611463f2619ac714949df705 100644 --- a/src/header/sys_epoll/cbindgen.toml +++ b/src/header/sys_epoll/cbindgen.toml @@ -1,4 +1,4 @@ -sys_includes = [] +sys_includes = ["signal.h"] include_guard = "_SYS_EPOLL_H" language = "C" style = "Tag" diff --git a/tests/Makefile b/tests/Makefile index 2f967511f9409605ae09c8d215bfdf4e5bf10c35..8c4e9d578d3a0cbb108b7ca1f0c8582683011713 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -61,6 +61,7 @@ EXPECT_BINS=\ string/strtok \ string/strtok_r \ strings \ + sys_epoll/epoll \ time/asctime \ time/gmtime \ time/localtime \ diff --git a/tests/expected/sys_epoll/epoll.stderr b/tests/expected/sys_epoll/epoll.stderr new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/expected/sys_epoll/epoll.stdout b/tests/expected/sys_epoll/epoll.stdout new file mode 100644 index 0000000000000000000000000000000000000000..18680314e8eec0b1671f3e853f2c9763abc0b5e6 --- /dev/null +++ b/tests/expected/sys_epoll/epoll.stdout @@ -0,0 +1,1024 @@ +0 == 0 +1 == 1 +2 == 2 +3 == 3 +4 == 4 +5 == 5 +6 == 6 +7 == 7 +8 == 8 +9 == 9 +10 == 10 +11 == 11 +12 == 12 +13 == 13 +14 == 14 +15 == 15 +16 == 16 +17 == 17 +18 == 18 +19 == 19 +20 == 20 +21 == 21 +22 == 22 +23 == 23 +24 == 24 +25 == 25 +26 == 26 +27 == 27 +28 == 28 +29 == 29 +30 == 30 +31 == 31 +32 == 32 +33 == 33 +34 == 34 +35 == 35 +36 == 36 +37 == 37 +38 == 38 +39 == 39 +40 == 40 +41 == 41 +42 == 42 +43 == 43 +44 == 44 +45 == 45 +46 == 46 +47 == 47 +48 == 48 +49 == 49 +50 == 50 +51 == 51 +52 == 52 +53 == 53 +54 == 54 +55 == 55 +56 == 56 +57 == 57 +58 == 58 +59 == 59 +60 == 60 +61 == 61 +62 == 62 +63 == 63 +64 == 64 +65 == 65 +66 == 66 +67 == 67 +68 == 68 +69 == 69 +70 == 70 +71 == 71 +72 == 72 +73 == 73 +74 == 74 +75 == 75 +76 == 76 +77 == 77 +78 == 78 +79 == 79 +80 == 80 +81 == 81 +82 == 82 +83 == 83 +84 == 84 +85 == 85 +86 == 86 +87 == 87 +88 == 88 +89 == 89 +90 == 90 +91 == 91 +92 == 92 +93 == 93 +94 == 94 +95 == 95 +96 == 96 +97 == 97 +98 == 98 +99 == 99 +100 == 100 +101 == 101 +102 == 102 +103 == 103 +104 == 104 +105 == 105 +106 == 106 +107 == 107 +108 == 108 +109 == 109 +110 == 110 +111 == 111 +112 == 112 +113 == 113 +114 == 114 +115 == 115 +116 == 116 +117 == 117 +118 == 118 +119 == 119 +120 == 120 +121 == 121 +122 == 122 +123 == 123 +124 == 124 +125 == 125 +126 == 126 +127 == 127 +128 == 128 +129 == 129 +130 == 130 +131 == 131 +132 == 132 +133 == 133 +134 == 134 +135 == 135 +136 == 136 +137 == 137 +138 == 138 +139 == 139 +140 == 140 +141 == 141 +142 == 142 +143 == 143 +144 == 144 +145 == 145 +146 == 146 +147 == 147 +148 == 148 +149 == 149 +150 == 150 +151 == 151 +152 == 152 +153 == 153 +154 == 154 +155 == 155 +156 == 156 +157 == 157 +158 == 158 +159 == 159 +160 == 160 +161 == 161 +162 == 162 +163 == 163 +164 == 164 +165 == 165 +166 == 166 +167 == 167 +168 == 168 +169 == 169 +170 == 170 +171 == 171 +172 == 172 +173 == 173 +174 == 174 +175 == 175 +176 == 176 +177 == 177 +178 == 178 +179 == 179 +180 == 180 +181 == 181 +182 == 182 +183 == 183 +184 == 184 +185 == 185 +186 == 186 +187 == 187 +188 == 188 +189 == 189 +190 == 190 +191 == 191 +192 == 192 +193 == 193 +194 == 194 +195 == 195 +196 == 196 +197 == 197 +198 == 198 +199 == 199 +200 == 200 +201 == 201 +202 == 202 +203 == 203 +204 == 204 +205 == 205 +206 == 206 +207 == 207 +208 == 208 +209 == 209 +210 == 210 +211 == 211 +212 == 212 +213 == 213 +214 == 214 +215 == 215 +216 == 216 +217 == 217 +218 == 218 +219 == 219 +220 == 220 +221 == 221 +222 == 222 +223 == 223 +224 == 224 +225 == 225 +226 == 226 +227 == 227 +228 == 228 +229 == 229 +230 == 230 +231 == 231 +232 == 232 +233 == 233 +234 == 234 +235 == 235 +236 == 236 +237 == 237 +238 == 238 +239 == 239 +240 == 240 +241 == 241 +242 == 242 +243 == 243 +244 == 244 +245 == 245 +246 == 246 +247 == 247 +248 == 248 +249 == 249 +250 == 250 +251 == 251 +252 == 252 +253 == 253 +254 == 254 +255 == 255 +256 == 256 +257 == 257 +258 == 258 +259 == 259 +260 == 260 +261 == 261 +262 == 262 +263 == 263 +264 == 264 +265 == 265 +266 == 266 +267 == 267 +268 == 268 +269 == 269 +270 == 270 +271 == 271 +272 == 272 +273 == 273 +274 == 274 +275 == 275 +276 == 276 +277 == 277 +278 == 278 +279 == 279 +280 == 280 +281 == 281 +282 == 282 +283 == 283 +284 == 284 +285 == 285 +286 == 286 +287 == 287 +288 == 288 +289 == 289 +290 == 290 +291 == 291 +292 == 292 +293 == 293 +294 == 294 +295 == 295 +296 == 296 +297 == 297 +298 == 298 +299 == 299 +300 == 300 +301 == 301 +302 == 302 +303 == 303 +304 == 304 +305 == 305 +306 == 306 +307 == 307 +308 == 308 +309 == 309 +310 == 310 +311 == 311 +312 == 312 +313 == 313 +314 == 314 +315 == 315 +316 == 316 +317 == 317 +318 == 318 +319 == 319 +320 == 320 +321 == 321 +322 == 322 +323 == 323 +324 == 324 +325 == 325 +326 == 326 +327 == 327 +328 == 328 +329 == 329 +330 == 330 +331 == 331 +332 == 332 +333 == 333 +334 == 334 +335 == 335 +336 == 336 +337 == 337 +338 == 338 +339 == 339 +340 == 340 +341 == 341 +342 == 342 +343 == 343 +344 == 344 +345 == 345 +346 == 346 +347 == 347 +348 == 348 +349 == 349 +350 == 350 +351 == 351 +352 == 352 +353 == 353 +354 == 354 +355 == 355 +356 == 356 +357 == 357 +358 == 358 +359 == 359 +360 == 360 +361 == 361 +362 == 362 +363 == 363 +364 == 364 +365 == 365 +366 == 366 +367 == 367 +368 == 368 +369 == 369 +370 == 370 +371 == 371 +372 == 372 +373 == 373 +374 == 374 +375 == 375 +376 == 376 +377 == 377 +378 == 378 +379 == 379 +380 == 380 +381 == 381 +382 == 382 +383 == 383 +384 == 384 +385 == 385 +386 == 386 +387 == 387 +388 == 388 +389 == 389 +390 == 390 +391 == 391 +392 == 392 +393 == 393 +394 == 394 +395 == 395 +396 == 396 +397 == 397 +398 == 398 +399 == 399 +400 == 400 +401 == 401 +402 == 402 +403 == 403 +404 == 404 +405 == 405 +406 == 406 +407 == 407 +408 == 408 +409 == 409 +410 == 410 +411 == 411 +412 == 412 +413 == 413 +414 == 414 +415 == 415 +416 == 416 +417 == 417 +418 == 418 +419 == 419 +420 == 420 +421 == 421 +422 == 422 +423 == 423 +424 == 424 +425 == 425 +426 == 426 +427 == 427 +428 == 428 +429 == 429 +430 == 430 +431 == 431 +432 == 432 +433 == 433 +434 == 434 +435 == 435 +436 == 436 +437 == 437 +438 == 438 +439 == 439 +440 == 440 +441 == 441 +442 == 442 +443 == 443 +444 == 444 +445 == 445 +446 == 446 +447 == 447 +448 == 448 +449 == 449 +450 == 450 +451 == 451 +452 == 452 +453 == 453 +454 == 454 +455 == 455 +456 == 456 +457 == 457 +458 == 458 +459 == 459 +460 == 460 +461 == 461 +462 == 462 +463 == 463 +464 == 464 +465 == 465 +466 == 466 +467 == 467 +468 == 468 +469 == 469 +470 == 470 +471 == 471 +472 == 472 +473 == 473 +474 == 474 +475 == 475 +476 == 476 +477 == 477 +478 == 478 +479 == 479 +480 == 480 +481 == 481 +482 == 482 +483 == 483 +484 == 484 +485 == 485 +486 == 486 +487 == 487 +488 == 488 +489 == 489 +490 == 490 +491 == 491 +492 == 492 +493 == 493 +494 == 494 +495 == 495 +496 == 496 +497 == 497 +498 == 498 +499 == 499 +500 == 500 +501 == 501 +502 == 502 +503 == 503 +504 == 504 +505 == 505 +506 == 506 +507 == 507 +508 == 508 +509 == 509 +510 == 510 +511 == 511 +512 == 512 +513 == 513 +514 == 514 +515 == 515 +516 == 516 +517 == 517 +518 == 518 +519 == 519 +520 == 520 +521 == 521 +522 == 522 +523 == 523 +524 == 524 +525 == 525 +526 == 526 +527 == 527 +528 == 528 +529 == 529 +530 == 530 +531 == 531 +532 == 532 +533 == 533 +534 == 534 +535 == 535 +536 == 536 +537 == 537 +538 == 538 +539 == 539 +540 == 540 +541 == 541 +542 == 542 +543 == 543 +544 == 544 +545 == 545 +546 == 546 +547 == 547 +548 == 548 +549 == 549 +550 == 550 +551 == 551 +552 == 552 +553 == 553 +554 == 554 +555 == 555 +556 == 556 +557 == 557 +558 == 558 +559 == 559 +560 == 560 +561 == 561 +562 == 562 +563 == 563 +564 == 564 +565 == 565 +566 == 566 +567 == 567 +568 == 568 +569 == 569 +570 == 570 +571 == 571 +572 == 572 +573 == 573 +574 == 574 +575 == 575 +576 == 576 +577 == 577 +578 == 578 +579 == 579 +580 == 580 +581 == 581 +582 == 582 +583 == 583 +584 == 584 +585 == 585 +586 == 586 +587 == 587 +588 == 588 +589 == 589 +590 == 590 +591 == 591 +592 == 592 +593 == 593 +594 == 594 +595 == 595 +596 == 596 +597 == 597 +598 == 598 +599 == 599 +600 == 600 +601 == 601 +602 == 602 +603 == 603 +604 == 604 +605 == 605 +606 == 606 +607 == 607 +608 == 608 +609 == 609 +610 == 610 +611 == 611 +612 == 612 +613 == 613 +614 == 614 +615 == 615 +616 == 616 +617 == 617 +618 == 618 +619 == 619 +620 == 620 +621 == 621 +622 == 622 +623 == 623 +624 == 624 +625 == 625 +626 == 626 +627 == 627 +628 == 628 +629 == 629 +630 == 630 +631 == 631 +632 == 632 +633 == 633 +634 == 634 +635 == 635 +636 == 636 +637 == 637 +638 == 638 +639 == 639 +640 == 640 +641 == 641 +642 == 642 +643 == 643 +644 == 644 +645 == 645 +646 == 646 +647 == 647 +648 == 648 +649 == 649 +650 == 650 +651 == 651 +652 == 652 +653 == 653 +654 == 654 +655 == 655 +656 == 656 +657 == 657 +658 == 658 +659 == 659 +660 == 660 +661 == 661 +662 == 662 +663 == 663 +664 == 664 +665 == 665 +666 == 666 +667 == 667 +668 == 668 +669 == 669 +670 == 670 +671 == 671 +672 == 672 +673 == 673 +674 == 674 +675 == 675 +676 == 676 +677 == 677 +678 == 678 +679 == 679 +680 == 680 +681 == 681 +682 == 682 +683 == 683 +684 == 684 +685 == 685 +686 == 686 +687 == 687 +688 == 688 +689 == 689 +690 == 690 +691 == 691 +692 == 692 +693 == 693 +694 == 694 +695 == 695 +696 == 696 +697 == 697 +698 == 698 +699 == 699 +700 == 700 +701 == 701 +702 == 702 +703 == 703 +704 == 704 +705 == 705 +706 == 706 +707 == 707 +708 == 708 +709 == 709 +710 == 710 +711 == 711 +712 == 712 +713 == 713 +714 == 714 +715 == 715 +716 == 716 +717 == 717 +718 == 718 +719 == 719 +720 == 720 +721 == 721 +722 == 722 +723 == 723 +724 == 724 +725 == 725 +726 == 726 +727 == 727 +728 == 728 +729 == 729 +730 == 730 +731 == 731 +732 == 732 +733 == 733 +734 == 734 +735 == 735 +736 == 736 +737 == 737 +738 == 738 +739 == 739 +740 == 740 +741 == 741 +742 == 742 +743 == 743 +744 == 744 +745 == 745 +746 == 746 +747 == 747 +748 == 748 +749 == 749 +750 == 750 +751 == 751 +752 == 752 +753 == 753 +754 == 754 +755 == 755 +756 == 756 +757 == 757 +758 == 758 +759 == 759 +760 == 760 +761 == 761 +762 == 762 +763 == 763 +764 == 764 +765 == 765 +766 == 766 +767 == 767 +768 == 768 +769 == 769 +770 == 770 +771 == 771 +772 == 772 +773 == 773 +774 == 774 +775 == 775 +776 == 776 +777 == 777 +778 == 778 +779 == 779 +780 == 780 +781 == 781 +782 == 782 +783 == 783 +784 == 784 +785 == 785 +786 == 786 +787 == 787 +788 == 788 +789 == 789 +790 == 790 +791 == 791 +792 == 792 +793 == 793 +794 == 794 +795 == 795 +796 == 796 +797 == 797 +798 == 798 +799 == 799 +800 == 800 +801 == 801 +802 == 802 +803 == 803 +804 == 804 +805 == 805 +806 == 806 +807 == 807 +808 == 808 +809 == 809 +810 == 810 +811 == 811 +812 == 812 +813 == 813 +814 == 814 +815 == 815 +816 == 816 +817 == 817 +818 == 818 +819 == 819 +820 == 820 +821 == 821 +822 == 822 +823 == 823 +824 == 824 +825 == 825 +826 == 826 +827 == 827 +828 == 828 +829 == 829 +830 == 830 +831 == 831 +832 == 832 +833 == 833 +834 == 834 +835 == 835 +836 == 836 +837 == 837 +838 == 838 +839 == 839 +840 == 840 +841 == 841 +842 == 842 +843 == 843 +844 == 844 +845 == 845 +846 == 846 +847 == 847 +848 == 848 +849 == 849 +850 == 850 +851 == 851 +852 == 852 +853 == 853 +854 == 854 +855 == 855 +856 == 856 +857 == 857 +858 == 858 +859 == 859 +860 == 860 +861 == 861 +862 == 862 +863 == 863 +864 == 864 +865 == 865 +866 == 866 +867 == 867 +868 == 868 +869 == 869 +870 == 870 +871 == 871 +872 == 872 +873 == 873 +874 == 874 +875 == 875 +876 == 876 +877 == 877 +878 == 878 +879 == 879 +880 == 880 +881 == 881 +882 == 882 +883 == 883 +884 == 884 +885 == 885 +886 == 886 +887 == 887 +888 == 888 +889 == 889 +890 == 890 +891 == 891 +892 == 892 +893 == 893 +894 == 894 +895 == 895 +896 == 896 +897 == 897 +898 == 898 +899 == 899 +900 == 900 +901 == 901 +902 == 902 +903 == 903 +904 == 904 +905 == 905 +906 == 906 +907 == 907 +908 == 908 +909 == 909 +910 == 910 +911 == 911 +912 == 912 +913 == 913 +914 == 914 +915 == 915 +916 == 916 +917 == 917 +918 == 918 +919 == 919 +920 == 920 +921 == 921 +922 == 922 +923 == 923 +924 == 924 +925 == 925 +926 == 926 +927 == 927 +928 == 928 +929 == 929 +930 == 930 +931 == 931 +932 == 932 +933 == 933 +934 == 934 +935 == 935 +936 == 936 +937 == 937 +938 == 938 +939 == 939 +940 == 940 +941 == 941 +942 == 942 +943 == 943 +944 == 944 +945 == 945 +946 == 946 +947 == 947 +948 == 948 +949 == 949 +950 == 950 +951 == 951 +952 == 952 +953 == 953 +954 == 954 +955 == 955 +956 == 956 +957 == 957 +958 == 958 +959 == 959 +960 == 960 +961 == 961 +962 == 962 +963 == 963 +964 == 964 +965 == 965 +966 == 966 +967 == 967 +968 == 968 +969 == 969 +970 == 970 +971 == 971 +972 == 972 +973 == 973 +974 == 974 +975 == 975 +976 == 976 +977 == 977 +978 == 978 +979 == 979 +980 == 980 +981 == 981 +982 == 982 +983 == 983 +984 == 984 +985 == 985 +986 == 986 +987 == 987 +988 == 988 +989 == 989 +990 == 990 +991 == 991 +992 == 992 +993 == 993 +994 == 994 +995 == 995 +996 == 996 +997 == 997 +998 == 998 +999 == 999 +1000 == 1000 +1001 == 1001 +1002 == 1002 +1003 == 1003 +1004 == 1004 +1005 == 1005 +1006 == 1006 +1007 == 1007 +1008 == 1008 +1009 == 1009 +1010 == 1010 +1011 == 1011 +1012 == 1012 +1013 == 1013 +1014 == 1014 +1015 == 1015 +1016 == 1016 +1017 == 1017 +1018 == 1018 +1019 == 1019 +1020 == 1020 +1021 == 1021 +1022 == 1022 +1023 == 1023 diff --git a/tests/sys_epoll/epoll.c b/tests/sys_epoll/epoll.c new file mode 100644 index 0000000000000000000000000000000000000000..3d89341de7e1d92e9400b912475cc28dcd4eebb4 --- /dev/null +++ b/tests/sys_epoll/epoll.c @@ -0,0 +1,158 @@ +#include <fcntl.h> +#include <stdio.h> +#include <sys/epoll.h> +#include <sys/wait.h> +#include <unistd.h> + +int reader(int fd) { + // Create an epoll file + int epollfd = epoll_create1(EPOLL_CLOEXEC); + if (epollfd < 0) { + perror("epoll_create1"); + return 1; + } + + // Register for events from the reader file + struct epoll_event ev; + ev.events = EPOLLIN; + ev.data.fd = fd; + if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev) < 0) { + perror("epoll_ctl"); + return 1; + } + + // Process exactly 1024 events + struct epoll_event events[8]; + for (int i = 0; i < 1024; i++) { + // Wait for the next event + int nfds = epoll_wait(epollfd, events, sizeof(events)/sizeof(struct epoll_event), -1); + if (nfds < 0) { + perror("epoll_wait"); + return 1; + } + + // For each event received + for (int n = 0; n < nfds; n++) { + // If the event is the reader file + if (events[n].data.fd == fd) { + // Read the current event count + int writer_i; + int count = read(fd, &writer_i, sizeof(writer_i)); + if (count < 0) { + perror("read"); + return 1; + } else if (count < sizeof(writer_i)) { + fprintf(stderr, "read %d instead of %d\n", count, sizeof(writer_i)); + return 1; + } + // Make sure the writer's event count matches our own + if (i != writer_i) { + fprintf(stderr, "received event count %d instead of %d\n", writer_i, i); + return 1; + } + printf("%d == %d\n", i, writer_i); + } else { + // Otherwise, return an error + fprintf(stderr, "unknown fd %d\n", events[n].data.fd); + return 1; + } + } + } + + return 0; +} + +int writer(int fd) { + // Create an epoll file + int epollfd = epoll_create1(EPOLL_CLOEXEC); + if (epollfd < 0) { + perror("epoll_create1"); + return 1; + } + + // Register for events from the writer file + struct epoll_event ev; + ev.events = EPOLLOUT; + ev.data.fd = fd; + if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev) < 0) { + perror("epoll_ctl"); + return 1; + } + + // Process exactly 1024 events + struct epoll_event events[8]; + for (int i = 0; i < 1024; i++) { + // Wait for the next event + int nfds = epoll_wait(epollfd, events, sizeof(events)/sizeof(struct epoll_event), -1); + if (nfds < 0) { + perror("epoll_wait"); + return 1; + } + + // For each event received + for (int n = 0; n < nfds; n++) { + // If the event is the writer file + if (events[n].data.fd == fd) { + // Write the current event count + int count = write(fd, &i, sizeof(i)); + if (count < 0) { + perror("write"); + return 1; + } else if (count < sizeof(i)) { + fprintf(stderr, "wrote %d instead of %d\n", count, sizeof(i)); + return 1; + } + } else { + // Otherwise, return an error + fprintf(stderr, "unknown fd %d\n", events[n].data.fd); + return 1; + } + } + } + + return 0; +} + +int main(int argc, char **argv) { + // Create a non-blocking pipe to use for epoll testing + int pipefd[2]; + if (pipe2(pipefd, O_CLOEXEC | O_NONBLOCK) < 0) { + perror("pipe2"); + return 1; + } + + pid_t pid = fork(); + if (pid < 0) { + perror("fork"); + return 1; + } else if (pid == 0) { + // Child process will read events + close(pipefd[1]); + return reader(pipefd[0]); + } else { + // Parent process will write events + close(pipefd[0]); + int ret = writer(pipefd[1]); + + // Wait for child process + int status = 0; + if (waitpid(pid, &status, 0) != pid) { + perror("waitpid"); + return 1; + } + + // If writer failed, return exit status + if (ret != 0) { + return ret; + } + + // If child exited with exit status + if (WIFEXITED(status)) { + // Return the child's exit status + return WEXITSTATUS(status); + } else { + // Otherwise, return 1 + return 1; + } + } +}