1 /** 2 * D header file for POSIX. 3 * 4 * Copyright: Copyright Sean Kelly 2005 - 2009. 5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) 6 * Authors: Sean Kelly, 7 Alex Rønne Petersen 8 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition 9 * Source: $(DRUNTIMESRC core/sys/posix/_signal.d) 10 */ 11 12 module core.sys.posix.signal; 13 14 import core.sys.posix.config; 15 public import core.stdc.signal; 16 public import core.sys.posix.sys.types; // for pid_t 17 public import core.sys.posix.time; // for timespec 18 19 version (OSX) 20 version = Darwin; 21 else version (iOS) 22 version = Darwin; 23 else version (TVOS) 24 version = Darwin; 25 else version (WatchOS) 26 version = Darwin; 27 28 version (ARM) version = ARM_Any; 29 version (AArch64) version = ARM_Any; 30 version (HPPA) version = HPPA_Any; 31 version (MIPS32) version = MIPS_Any; 32 version (MIPS64) version = MIPS_Any; 33 version (PPC) version = PPC_Any; 34 version (PPC64) version = PPC_Any; 35 version (RISCV32) version = RISCV_Any; 36 version (RISCV64) version = RISCV_Any; 37 version (S390) version = IBMZ_Any; 38 version (SPARC) version = SPARC_Any; 39 version (SPARC64) version = SPARC_Any; 40 version (SystemZ) version = IBMZ_Any; 41 version (X86) version = X86_Any; 42 version (X86_64) version = X86_Any; 43 44 version (Posix): 45 extern (C): 46 //nothrow: // this causes http://issues.dlang.org/show_bug.cgi?id=12738 (which has been fixed) 47 //@system: 48 49 // 50 // Required 51 // 52 /* 53 SIG_DFL (defined in core.stdc.signal) 54 SIG_ERR (defined in core.stdc.signal) 55 SIG_IGN (defined in core.stdc.signal) 56 57 sig_atomic_t (defined in core.stdc.signal) 58 59 SIGEV_NONE 60 SIGEV_SIGNAL 61 SIGEV_THREAD 62 63 union sigval 64 { 65 int sival_int; 66 void* sival_ptr; 67 } 68 69 SIGRTMIN 70 SIGRTMAX 71 72 SIGABRT (defined in core.stdc.signal) 73 SIGALRM 74 SIGBUS 75 SIGCHLD 76 SIGCONT 77 SIGFPE (defined in core.stdc.signal) 78 SIGHUP 79 SIGILL (defined in core.stdc.signal) 80 SIGINT (defined in core.stdc.signal) 81 SIGKILL 82 SIGPIPE 83 SIGQUIT 84 SIGSEGV (defined in core.stdc.signal) 85 SIGSTOP 86 SIGTERM (defined in core.stdc.signal) 87 SIGTSTP 88 SIGTTIN 89 SIGTTOU 90 SIGUSR1 91 SIGUSR2 92 SIGURG 93 94 struct sigaction_t 95 { 96 sigfn_t sa_handler; 97 sigset_t sa_mask; 98 sigactfn_t sa_sigaction; 99 } 100 101 sigfn_t signal(int sig, sigfn_t func); (defined in core.stdc.signal) 102 int raise(int sig); (defined in core.stdc.signal) 103 */ 104 105 //SIG_DFL (defined in core.stdc.signal) 106 //SIG_ERR (defined in core.stdc.signal) 107 //SIG_IGN (defined in core.stdc.signal) 108 109 //sig_atomic_t (defined in core.stdc.signal) 110 111 private alias void function(int) sigfn_t; 112 private alias void function(int, siginfo_t*, void*) sigactfn_t; 113 114 // nothrow versions 115 nothrow @nogc 116 { 117 private alias void function(int) sigfn_t2; 118 private alias void function(int, siginfo_t*, void*) sigactfn_t2; 119 } 120 121 enum 122 { 123 SIGEV_SIGNAL, 124 SIGEV_NONE, 125 SIGEV_THREAD 126 } 127 128 union sigval 129 { 130 int sival_int; 131 void* sival_ptr; 132 } 133 134 version (Solaris) 135 { 136 import core.sys.posix.unistd; 137 138 @property int SIGRTMIN() nothrow @nogc { 139 __gshared static int sig = -1; 140 if (sig == -1) { 141 sig = cast(int)sysconf(_SC_SIGRT_MIN); 142 } 143 return sig; 144 } 145 146 @property int SIGRTMAX() nothrow @nogc { 147 __gshared static int sig = -1; 148 if (sig == -1) { 149 sig = cast(int)sysconf(_SC_SIGRT_MAX); 150 } 151 return sig; 152 } 153 } 154 else version (FreeBSD) 155 { 156 // Note: it appears that FreeBSD (prior to 7) and OSX do not support realtime signals 157 // https://github.com/freebsd/freebsd/blob/e79c62ff68fc74d88cb6f479859f6fae9baa5101/sys/sys/signal.h#L117 158 enum SIGRTMIN = 65; 159 enum SIGRTMAX = 126; 160 } 161 else version (DragonFlyBSD) 162 { 163 enum SIGRTMIN = 35; 164 enum SIGRTMAX = 126; 165 } 166 else version (NetBSD) 167 { 168 enum SIGRTMIN = 33; 169 enum SIGRTMAX = 63; 170 } 171 else version (linux) 172 { 173 // Note: CRuntime_Bionic switched to calling these functions 174 // since Lollipop, and Glibc, UClib and Musl all implement them 175 // the same way since it's part of LSB. 176 private extern (C) nothrow @nogc 177 { 178 int __libc_current_sigrtmin(); 179 int __libc_current_sigrtmax(); 180 } 181 182 @property int SIGRTMIN() nothrow @nogc @system { 183 __gshared static int sig = -1; 184 if (sig == -1) { 185 sig = __libc_current_sigrtmin(); 186 } 187 return sig; 188 } 189 190 @property int SIGRTMAX() nothrow @nogc @system { 191 __gshared static int sig = -1; 192 if (sig == -1) { 193 sig = __libc_current_sigrtmax(); 194 } 195 return sig; 196 } 197 } 198 199 version (linux) 200 { 201 version (X86_Any) 202 { 203 //SIGABRT (defined in core.stdc.signal) 204 enum SIGALRM = 14; 205 enum SIGBUS = 7; 206 enum SIGCHLD = 17; 207 enum SIGCONT = 18; 208 //SIGFPE (defined in core.stdc.signal) 209 enum SIGHUP = 1; 210 //SIGILL (defined in core.stdc.signal) 211 //SIGINT (defined in core.stdc.signal) 212 enum SIGKILL = 9; 213 enum SIGPIPE = 13; 214 enum SIGQUIT = 3; 215 //SIGSEGV (defined in core.stdc.signal) 216 enum SIGSTOP = 19; 217 //SIGTERM (defined in core.stdc.signal) 218 enum SIGTSTP = 20; 219 enum SIGTTIN = 21; 220 enum SIGTTOU = 22; 221 enum SIGUSR1 = 10; 222 enum SIGUSR2 = 12; 223 enum SIGURG = 23; 224 } 225 else version (HPPA_Any) 226 { 227 //SIGABRT (defined in core.stdc.signal) 228 enum SIGALRM = 14; 229 enum SIGBUS = 10; 230 enum SIGCHLD = 18; 231 enum SIGCONT = 26; 232 //SIGFPE (defined in core.stdc.signal) 233 enum SIGHUP = 1; 234 //SIGILL (defined in core.stdc.signal) 235 //SIGINT (defined in core.stdc.signal) 236 enum SIGKILL = 9; 237 enum SIGPIPE = 13; 238 enum SIGQUIT = 3; 239 //SIGSEGV (defined in core.stdc.signal) 240 enum SIGSTOP = 24; 241 //SIGTERM (defined in core.stdc.signal) 242 enum SIGTSTP = 25; 243 enum SIGTTIN = 27; 244 enum SIGTTOU = 28; 245 enum SIGUSR1 = 16; 246 enum SIGUSR2 = 17; 247 enum SIGURG = 29; 248 } 249 else version (MIPS_Any) 250 { 251 //SIGABRT (defined in core.stdc.signal) 252 enum SIGALRM = 14; 253 enum SIGBUS = 10; 254 enum SIGCHLD = 18; 255 enum SIGCONT = 25; 256 //SIGFPE (defined in core.stdc.signal) 257 enum SIGHUP = 1; 258 //SIGILL (defined in core.stdc.signal) 259 //SIGINT (defined in core.stdc.signal) 260 enum SIGKILL = 9; 261 enum SIGPIPE = 13; 262 enum SIGQUIT = 3; 263 //SIGSEGV (defined in core.stdc.signal) 264 enum SIGSTOP = 23; 265 //SIGTERM (defined in core.stdc.signal) 266 enum SIGTSTP = 24; 267 enum SIGTTIN = 26; 268 enum SIGTTOU = 27; 269 enum SIGUSR1 = 16; 270 enum SIGUSR2 = 17; 271 enum SIGURG = 21; 272 } 273 else version (PPC_Any) 274 { 275 //SIGABRT (defined in core.stdc.signal) 276 enum SIGALRM = 14; 277 enum SIGBUS = 7; 278 enum SIGCHLD = 17; 279 enum SIGCONT = 18; 280 //SIGFPE (defined in core.stdc.signal) 281 enum SIGHUP = 1; 282 //SIGILL (defined in core.stdc.signal) 283 //SIGINT (defined in core.stdc.signal) 284 enum SIGKILL = 9; 285 enum SIGPIPE = 13; 286 enum SIGQUIT = 3; 287 //SIGSEGV (defined in core.stdc.signal) 288 enum SIGSTOP = 19; 289 //SIGTERM (defined in core.stdc.signal) 290 enum SIGTSTP = 20; 291 enum SIGTTIN = 21; 292 enum SIGTTOU = 22; 293 enum SIGUSR1 = 10; 294 enum SIGUSR2 = 12; 295 enum SIGURG = 23; 296 } 297 else version (ARM_Any) 298 { 299 //SIGABRT (defined in core.stdc.signal) 300 enum SIGALRM = 14; 301 enum SIGBUS = 7; 302 enum SIGCHLD = 17; 303 enum SIGCONT = 18; 304 //SIGFPE (defined in core.stdc.signal) 305 enum SIGHUP = 1; 306 //SIGILL (defined in core.stdc.signal) 307 //SIGINT (defined in core.stdc.signal) 308 enum SIGKILL = 9; 309 enum SIGPIPE = 13; 310 enum SIGQUIT = 3; 311 //SIGSEGV (defined in core.stdc.signal) 312 enum SIGSTOP = 19; 313 //SIGTERM (defined in core.stdc.signal) 314 enum SIGTSTP = 20; 315 enum SIGTTIN = 21; 316 enum SIGTTOU = 22; 317 enum SIGUSR1 = 10; 318 enum SIGUSR2 = 12; 319 enum SIGURG = 23; 320 } 321 else version (RISCV_Any) 322 { 323 //SIGABRT (defined in core.stdc.signal) 324 enum SIGALRM = 14; 325 enum SIGBUS = 7; 326 enum SIGCHLD = 17; 327 enum SIGCONT = 18; 328 //SIGFPE (defined in core.stdc.signal) 329 enum SIGHUP = 1; 330 //SIGILL (defined in core.stdc.signal) 331 //SIGINT (defined in core.stdc.signal) 332 enum SIGKILL = 9; 333 enum SIGPIPE = 13; 334 enum SIGQUIT = 3; 335 //SIGSEGV (defined in core.stdc.signal) 336 enum SIGSTOP = 19; 337 //SIGTERM (defined in core.stdc.signal) 338 enum SIGTSTP = 20; 339 enum SIGTTIN = 21; 340 enum SIGTTOU = 22; 341 enum SIGUSR1 = 10; 342 enum SIGUSR2 = 12; 343 enum SIGURG = 23; 344 } 345 else version (SPARC_Any) 346 { 347 //SIGABRT (defined in core.stdc.signal) 348 enum SIGALRM = 14; 349 enum SIGBUS = 10; 350 enum SIGCHLD = 20; 351 enum SIGCONT = 19; 352 //SIGFPE (defined in core.stdc.signal) 353 enum SIGHUP = 1; 354 //SIGILL (defined in core.stdc.signal) 355 //SIGINT (defined in core.stdc.signal) 356 enum SIGKILL = 9; 357 enum SIGPIPE = 13; 358 enum SIGQUIT = 3; 359 //SIGSEGV (defined in core.stdc.signal) 360 enum SIGSTOP = 17; 361 //SIGTERM (defined in core.stdc.signal) 362 enum SIGTSTP = 18; 363 enum SIGTTIN = 21; 364 enum SIGTTOU = 22; 365 enum SIGUSR1 = 30; 366 enum SIGUSR2 = 31; 367 enum SIGURG = 16; 368 } 369 else version (IBMZ_Any) 370 { 371 //SIGABRT (defined in core.stdc.signal) 372 enum SIGALRM = 14; 373 enum SIGBUS = 7; 374 enum SIGCHLD = 17; 375 enum SIGCONT = 18; 376 //SIGFPE (defined in core.stdc.signal) 377 enum SIGHUP = 1; 378 //SIGILL (defined in core.stdc.signal) 379 //SIGINT (defined in core.stdc.signal) 380 enum SIGKILL = 9; 381 enum SIGPIPE = 13; 382 enum SIGQUIT = 3; 383 //SIGSEGV (defined in core.stdc.signal) 384 enum SIGSTOP = 19; 385 //SIGTERM (defined in core.stdc.signal) 386 enum SIGTSTP = 20; 387 enum SIGTTIN = 21; 388 enum SIGTTOU = 22; 389 enum SIGUSR1 = 10; 390 enum SIGUSR2 = 12; 391 enum SIGURG = 23; 392 } 393 else version (LoongArch64) 394 { 395 //SIGABRT (defined in core.stdc.signal) 396 enum SIGALRM = 14; 397 enum SIGBUS = 7; 398 enum SIGCHLD = 17; 399 enum SIGCONT = 18; 400 //SIGFPE (defined in core.stdc.signal) 401 enum SIGHUP = 1; 402 //SIGILL (defined in core.stdc.signal) 403 //SIGINT (defined in core.stdc.signal) 404 enum SIGKILL = 9; 405 enum SIGPIPE = 13; 406 enum SIGQUIT = 3; 407 //SIGSEGV (defined in core.stdc.signal) 408 enum SIGSTOP = 19; 409 //SIGTERM (defined in core.stdc.signal) 410 enum SIGTSTP = 20; 411 enum SIGTTIN = 21; 412 enum SIGTTOU = 22; 413 enum SIGUSR1 = 10; 414 enum SIGUSR2 = 12; 415 enum SIGURG = 23; 416 } 417 else 418 static assert(0, "unimplemented"); 419 } 420 else version (Darwin) 421 { 422 //SIGABRT (defined in core.stdc.signal) 423 enum SIGALRM = 14; 424 enum SIGBUS = 10; 425 enum SIGCHLD = 20; 426 enum SIGCONT = 19; 427 //SIGFPE (defined in core.stdc.signal) 428 enum SIGHUP = 1; 429 //SIGILL (defined in core.stdc.signal) 430 //SIGINT (defined in core.stdc.signal) 431 enum SIGKILL = 9; 432 enum SIGPIPE = 13; 433 enum SIGQUIT = 3; 434 //SIGSEGV (defined in core.stdc.signal) 435 enum SIGSTOP = 17; 436 //SIGTERM (defined in core.stdc.signal) 437 enum SIGTSTP = 18; 438 enum SIGTTIN = 21; 439 enum SIGTTOU = 22; 440 enum SIGUSR1 = 30; 441 enum SIGUSR2 = 31; 442 enum SIGURG = 16; 443 } 444 else version (FreeBSD) 445 { 446 //SIGABRT (defined in core.stdc.signal) 447 enum SIGALRM = 14; 448 enum SIGBUS = 10; 449 enum SIGCHLD = 20; 450 enum SIGCONT = 19; 451 //SIGFPE (defined in core.stdc.signal) 452 enum SIGHUP = 1; 453 //SIGILL (defined in core.stdc.signal) 454 //SIGINT (defined in core.stdc.signal) 455 enum SIGKILL = 9; 456 enum SIGPIPE = 13; 457 enum SIGQUIT = 3; 458 //SIGSEGV (defined in core.stdc.signal) 459 enum SIGSTOP = 17; 460 //SIGTERM (defined in core.stdc.signal) 461 enum SIGTSTP = 18; 462 enum SIGTTIN = 21; 463 enum SIGTTOU = 22; 464 enum SIGUSR1 = 30; 465 enum SIGUSR2 = 31; 466 enum SIGURG = 16; 467 } 468 else version (NetBSD) 469 { 470 //SIGABRT (defined in core.stdc.signal) 471 enum SIGALRM = 14; 472 enum SIGBUS = 10; 473 enum SIGCHLD = 20; 474 enum SIGCONT = 19; 475 //SIGFPE (defined in core.stdc.signal) 476 enum SIGHUP = 1; 477 //SIGILL (defined in core.stdc.signal) 478 //SIGINT (defined in core.stdc.signal) 479 enum SIGKILL = 9; 480 enum SIGPIPE = 13; 481 enum SIGQUIT = 3; 482 //SIGSEGV (defined in core.stdc.signal) 483 enum SIGSTOP = 17; 484 //SIGTERM (defined in core.stdc.signal) 485 enum SIGTSTP = 18; 486 enum SIGTTIN = 21; 487 enum SIGTTOU = 22; 488 enum SIGUSR1 = 30; 489 enum SIGUSR2 = 31; 490 enum SIGURG = 16; 491 } 492 else version (OpenBSD) 493 { 494 //SIGABRT (defined in core.stdc.signal) 495 enum SIGALRM = 14; 496 enum SIGBUS = 10; 497 enum SIGCHLD = 20; 498 enum SIGCONT = 19; 499 //SIGFPE (defined in core.stdc.signal) 500 enum SIGHUP = 1; 501 //SIGILL (defined in core.stdc.signal) 502 //SIGINT (defined in core.stdc.signal) 503 enum SIGKILL = 9; 504 enum SIGPIPE = 13; 505 enum SIGQUIT = 3; 506 //SIGSEGV (defined in core.stdc.signal) 507 enum SIGSTOP = 17; 508 //SIGTERM (defined in core.stdc.signal) 509 enum SIGTSTP = 18; 510 enum SIGTTIN = 21; 511 enum SIGTTOU = 22; 512 enum SIGUSR1 = 30; 513 enum SIGUSR2 = 31; 514 enum SIGURG = 16; 515 } 516 else version (DragonFlyBSD) 517 { 518 //SIGABRT (defined in core.stdc.signal) 519 enum SIGALRM = 14; 520 enum SIGBUS = 10; 521 enum SIGCHLD = 20; 522 enum SIGCONT = 19; 523 //SIGFPE (defined in core.stdc.signal) 524 enum SIGHUP = 1; 525 //SIGILL (defined in core.stdc.signal) 526 //SIGINT (defined in core.stdc.signal) 527 enum SIGKILL = 9; 528 enum SIGPIPE = 13; 529 enum SIGQUIT = 3; 530 //SIGSEGV (defined in core.stdc.signal) 531 enum SIGSTOP = 17; 532 //SIGTERM (defined in core.stdc.signal) 533 enum SIGTSTP = 18; 534 enum SIGTTIN = 21; 535 enum SIGTTOU = 22; 536 enum SIGUSR1 = 30; 537 enum SIGUSR2 = 31; 538 enum SIGURG = 16; 539 } 540 else version (Solaris) 541 { 542 //SIGABRT (defined in core.stdc.signal) 543 enum SIGALRM = 14; 544 enum SIGBUS = 10; 545 enum SIGCHLD = 18; 546 enum SIGCONT = 25; 547 //SIGFPE (defined in core.stdc.signal) 548 enum SIGHUP = 1; 549 //SIGILL (defined in core.stdc.signal) 550 //SIGINT (defined in core.stdc.signal) 551 enum SIGKILL = 9; 552 enum SIGPIPE = 13; 553 enum SIGQUIT = 3; 554 //SIGSEGV (defined in core.stdc.signal) 555 enum SIGSTOP = 23; 556 //SIGTERM (defined in core.stdc.signal) 557 enum SIGTSTP = 24; 558 enum SIGTTIN = 26; 559 enum SIGTTOU = 27; 560 enum SIGUSR1 = 16; 561 enum SIGUSR2 = 17; 562 enum SIGURG = 21; 563 } 564 else 565 { 566 static assert(false, "Unsupported platform"); 567 } 568 569 version (linux) 570 { 571 version (CRuntime_Musl) 572 { 573 struct sigaction_t 574 { 575 union 576 { 577 sigfn_t sa_handler; 578 sigactfn_t sa_sigaction; 579 } 580 sigset_t sa_mask; 581 int sa_flags; 582 void function() sa_restorer; 583 } 584 } 585 else version (CRuntime_Bionic) 586 { 587 version (D_LP64) 588 { 589 struct sigaction_t 590 { 591 int sa_flags; 592 union 593 { 594 sigfn_t sa_handler; 595 sigactfn_t sa_sigaction; 596 } 597 sigset_t sa_mask; 598 void function() sa_restorer; 599 } 600 } 601 else 602 { 603 struct sigaction_t 604 { 605 union 606 { 607 sigfn_t sa_handler; 608 sigactfn_t sa_sigaction; 609 } 610 sigset_t sa_mask; 611 int sa_flags; 612 void function() sa_restorer; 613 } 614 } 615 } 616 else version (SystemZ) 617 { 618 struct sigaction_t 619 { 620 static if ( true /* __USE_POSIX199309 */ ) 621 { 622 union 623 { 624 sigfn_t sa_handler; 625 sigactfn_t sa_sigaction; 626 } 627 } 628 else 629 { 630 sigfn_t sa_handler; 631 } 632 version (CRuntime_Glibc) 633 { 634 int __glibc_reserved0; 635 int sa_flags; 636 } 637 else 638 { 639 c_ulong sa_flags; 640 } 641 642 void function() sa_restorer; 643 644 sigset_t sa_mask; 645 } 646 } 647 else version (HPPA_Any) 648 { 649 struct sigaction_t 650 { 651 static if ( true /* __USE_POSIX199309 */ ) 652 { 653 union 654 { 655 sigfn_t sa_handler; 656 sigactfn_t sa_sigaction; 657 } 658 } 659 else 660 { 661 sigfn_t sa_handler; 662 } 663 version (CRuntime_Glibc) 664 { 665 version (D_LP64) 666 int __glibc_reserved0; 667 int sa_flags; 668 } 669 else 670 { 671 c_ulong sa_flags; 672 } 673 sigset_t sa_mask; 674 } 675 } 676 else version (MIPS_Any) 677 { 678 struct sigaction_t 679 { 680 int sa_flags; 681 682 static if ( true /* __USE_POSIX199309 */ ) 683 { 684 union 685 { 686 sigfn_t sa_handler; 687 sigactfn_t sa_sigaction; 688 } 689 } 690 else 691 { 692 sigfn_t sa_handler; 693 } 694 sigset_t sa_mask; 695 void function() sa_restorer; 696 697 version (CRuntime_Glibc) 698 { 699 static if ((void*).sizeof < 8) 700 int[1] sa_resv; 701 } 702 } 703 } 704 else version (SPARC_Any) 705 { 706 struct sigaction_t 707 { 708 static if ( true /* __USE_POSIX199309 */ ) 709 { 710 union 711 { 712 sigfn_t sa_handler; 713 sigactfn_t sa_sigaction; 714 } 715 } 716 else 717 { 718 sigfn_t sa_handler; 719 } 720 version (CRuntime_Glibc) 721 { 722 sigset_t sa_mask; 723 version (D_LP64) 724 int __glibc_reserved0; 725 int sa_flags; 726 void function() sa_restorer; 727 } 728 else 729 { 730 c_ulong sa_flags; 731 void function() sa_restorer; 732 sigset_t sa_mask; 733 } 734 } 735 } 736 else 737 { 738 struct sigaction_t 739 { 740 static if ( true /* __USE_POSIX199309 */ ) 741 { 742 union 743 { 744 sigfn_t sa_handler; 745 sigactfn_t sa_sigaction; 746 } 747 } 748 else 749 { 750 sigfn_t sa_handler; 751 } 752 sigset_t sa_mask; 753 int sa_flags; 754 755 void function() sa_restorer; 756 } 757 } 758 } 759 else version (FreeBSD) 760 { 761 struct sigaction_t 762 { 763 union 764 { 765 sigfn_t sa_handler; 766 sigactfn_t sa_sigaction; 767 } 768 int sa_flags; 769 sigset_t sa_mask; 770 } 771 } 772 else version (NetBSD) 773 { 774 struct sigaction_t 775 { 776 union 777 { 778 sigfn_t sa_handler; 779 sigactfn_t sa_sigaction; 780 } 781 sigset_t sa_mask; 782 int sa_flags; 783 } 784 } 785 else version (OpenBSD) 786 { 787 struct sigaction_t 788 { 789 union 790 { 791 sigfn_t __sa_handler; 792 alias sa_handler = __sa_handler; 793 sigactfn_t __sa_sigaction; 794 alias sa_sigaction = __sa_sigaction; 795 } 796 sigset_t sa_mask; 797 int sa_flags; 798 } 799 } 800 else version (DragonFlyBSD) 801 { 802 struct sigaction_t 803 { 804 union 805 { 806 sigfn_t sa_handler; 807 sigactfn_t sa_sigaction; 808 } 809 int sa_flags; 810 sigset_t sa_mask; 811 } 812 } 813 else version (Solaris) 814 { 815 struct sigaction_t 816 { 817 int sa_flags; 818 819 union 820 { 821 sigfn_t sa_handler; 822 sigactfn_t sa_sigaction; 823 } 824 825 sigset_t sa_mask; 826 version (D_LP64) {} 827 else 828 int[2] sa_resv; 829 } 830 } 831 else version (Darwin) 832 { 833 struct sigaction_t 834 { 835 static if ( true /* __USE_POSIX199309 */ ) 836 { 837 union 838 { 839 sigfn_t sa_handler; 840 sigactfn_t sa_sigaction; 841 } 842 } 843 else 844 { 845 sigfn_t sa_handler; 846 } 847 sigset_t sa_mask; 848 int sa_flags; 849 } 850 } 851 else 852 { 853 static assert(false, "Unsupported platform"); 854 } 855 856 // 857 // C Extension (CX) 858 // 859 /* 860 SIG_HOLD 861 862 sigset_t 863 pid_t (defined in core.sys.types) 864 865 SIGABRT (defined in core.stdc.signal) 866 SIGFPE (defined in core.stdc.signal) 867 SIGILL (defined in core.stdc.signal) 868 SIGINT (defined in core.stdc.signal) 869 SIGSEGV (defined in core.stdc.signal) 870 SIGTERM (defined in core.stdc.signal) 871 872 SA_NOCLDSTOP (CX|XSI) 873 SIG_BLOCK 874 SIG_UNBLOCK 875 SIG_SETMASK 876 877 struct siginfo_t 878 { 879 int si_signo; 880 int si_code; 881 882 version (XSI) 883 { 884 int si_errno; 885 pid_t si_pid; 886 uid_t si_uid; 887 void* si_addr; 888 int si_status; 889 c_long si_band; 890 } 891 version (RTS) 892 { 893 sigval si_value; 894 } 895 } 896 897 SI_USER 898 SI_QUEUE 899 SI_TIMER 900 SI_ASYNCIO 901 SI_MESGQ 902 */ 903 904 nothrow @nogc 905 { 906 907 version (linux) 908 { 909 enum SIG_HOLD = cast(sigfn_t2) 2; 910 911 private enum _SIGSET_NWORDS = 1024 / (8 * c_ulong.sizeof); 912 913 struct sigset_t 914 { 915 c_ulong[_SIGSET_NWORDS] __val; 916 } 917 918 enum SA_NOCLDSTOP = 1; // (CX|XSI) 919 920 version (MIPS_Any) 921 { 922 enum SIG_BLOCK = 1; 923 enum SIG_UNBLOCK = 2; 924 enum SIG_SETMASK = 3; 925 } 926 else version (SPARC_Any) 927 { 928 enum SIG_BLOCK = 1; 929 enum SIG_UNBLOCK = 2; 930 enum SIG_SETMASK = 4; 931 } 932 else 933 { 934 enum SIG_BLOCK = 0; 935 enum SIG_UNBLOCK = 1; 936 enum SIG_SETMASK = 2; 937 } 938 939 private enum __SI_MAX_SIZE = 128; 940 941 static if ( __WORDSIZE == 64 ) 942 { 943 private enum __SI_PAD_SIZE = ((__SI_MAX_SIZE / int.sizeof) - 4); 944 } 945 else 946 { 947 private enum __SI_PAD_SIZE = ((__SI_MAX_SIZE / int.sizeof) - 3); 948 } 949 950 struct siginfo_t 951 { 952 int si_signo; 953 version (MIPS_Any) // __SI_SWAP_ERRNO_CODE 954 { 955 int si_code; 956 int si_errno; 957 } 958 else 959 { 960 int si_errno; 961 int si_code; 962 } 963 964 union _sifields_t 965 { 966 int[__SI_PAD_SIZE] _pad; 967 968 // kill() 969 struct _kill_t 970 { 971 pid_t si_pid; 972 uid_t si_uid; 973 } _kill_t _kill; 974 // POSIX.1b timers. 975 struct _timer_t 976 { 977 int si_tid; 978 int si_overrun; 979 sigval si_sigval; 980 } _timer_t _timer; 981 982 // POSIX.1b signals 983 struct _rt_t 984 { 985 pid_t si_pid; 986 uid_t si_uid; 987 sigval si_sigval; 988 } _rt_t _rt; 989 990 // SIGCHLD 991 struct _sigchild_t 992 { 993 pid_t si_pid; 994 uid_t si_uid; 995 int si_status; 996 clock_t si_utime; 997 clock_t si_stime; 998 } _sigchild_t _sigchld; 999 1000 // SIGILL, SIGFPE, SIGSEGV, SIGBUS 1001 struct _sigfault_t 1002 { 1003 void* si_addr; 1004 } _sigfault_t _sigfault; 1005 1006 // SIGPOLL 1007 struct _sigpoll_t 1008 { 1009 c_long si_band; 1010 int si_fd; 1011 } _sigpoll_t _sigpoll; 1012 } _sifields_t _sifields; 1013 1014 nothrow @nogc: 1015 @property ref pid_t si_pid() return { return _sifields._kill.si_pid; } 1016 @property ref uid_t si_uid() return { return _sifields._kill.si_uid; } 1017 @property ref void* si_addr() return { return _sifields._sigfault.si_addr; } 1018 @property ref int si_status() return { return _sifields._sigchld.si_status; } 1019 @property ref c_long si_band() return { return _sifields._sigpoll.si_band; } 1020 @property ref sigval si_value() return { return _sifields._rt.si_sigval; } 1021 } 1022 1023 enum 1024 { 1025 SI_ASYNCNL = -60, 1026 SI_TKILL = -6, 1027 SI_SIGIO, 1028 SI_ASYNCIO, 1029 SI_MESGQ, 1030 SI_TIMER, 1031 SI_QUEUE, 1032 SI_USER, 1033 SI_KERNEL = 0x80 1034 } 1035 } 1036 else version (Darwin) 1037 { 1038 enum SIG_HOLD = cast(sigfn_t2) 5; 1039 1040 alias uint sigset_t; 1041 1042 enum SA_NOCLDSTOP = 8; // (CX|XSI) 1043 1044 enum SIG_BLOCK = 1; 1045 enum SIG_UNBLOCK = 2; 1046 enum SIG_SETMASK = 3; 1047 1048 struct siginfo_t 1049 { 1050 int si_signo; 1051 int si_errno; 1052 int si_code; 1053 pid_t si_pid; 1054 uid_t si_uid; 1055 int si_status; 1056 void* si_addr; 1057 sigval si_value; 1058 int si_band; 1059 uint[7] pad; 1060 } 1061 1062 enum SI_USER = 0x10001; 1063 enum SI_QUEUE = 0x10002; 1064 enum SI_TIMER = 0x10003; 1065 enum SI_ASYNCIO = 0x10004; 1066 enum SI_MESGQ = 0x10005; 1067 } 1068 else version (FreeBSD) 1069 { 1070 enum SIG_HOLD = cast(sigfn_t2) 3; 1071 1072 struct sigset_t 1073 { 1074 uint[4] __bits; 1075 } 1076 1077 enum SA_NOCLDSTOP = 8; 1078 1079 enum SIG_BLOCK = 1; 1080 enum SIG_UNBLOCK = 2; 1081 enum SIG_SETMASK = 3; 1082 1083 struct siginfo_t 1084 { 1085 int si_signo; 1086 int si_errno; 1087 int si_code; 1088 pid_t si_pid; 1089 uid_t si_uid; 1090 int si_status; 1091 void* si_addr; 1092 sigval si_value; 1093 union __reason 1094 { 1095 struct __fault 1096 { 1097 int _trapno; 1098 } 1099 __fault _fault; 1100 struct __timer 1101 { 1102 int _timerid; 1103 int _overrun; 1104 } 1105 __timer _timer; 1106 struct __mesgq 1107 { 1108 int _mqd; 1109 } 1110 __mesgq _mesgq; 1111 struct __poll 1112 { 1113 c_long _band; 1114 } 1115 __poll _poll; 1116 struct ___spare___ 1117 { 1118 c_long __spare1__; 1119 int[7] __spare2__; 1120 } 1121 ___spare___ __spare__; 1122 } 1123 __reason _reason; 1124 1125 @property ref c_long si_band() return { return _reason._poll._band; } 1126 } 1127 1128 enum SI_USER = 0x10001; 1129 enum SI_QUEUE = 0x10002; 1130 enum SI_TIMER = 0x10003; 1131 enum SI_ASYNCIO = 0x10004; 1132 enum SI_MESGQ = 0x10005; 1133 } 1134 else version (NetBSD) 1135 { 1136 enum SIG_HOLD = cast(sigfn_t2) 3; 1137 1138 struct sigset_t 1139 { 1140 uint[4] __bits; 1141 } 1142 1143 enum SA_NOCLDSTOP = 8; 1144 1145 enum SIG_BLOCK = 1; 1146 enum SIG_UNBLOCK = 2; 1147 enum SIG_SETMASK = 3; 1148 1149 union sigval_t 1150 { 1151 int sival_int; 1152 void* sival_ptr; 1153 } 1154 1155 struct _ksiginfo 1156 { 1157 int _signo; 1158 int _code; 1159 int _errno; 1160 version (D_LP64) 1161 int _pad; 1162 1163 union reason_t 1164 { 1165 struct rt_t 1166 { 1167 pid_t _pid; 1168 uid_t _uid; 1169 sigval_t _value; 1170 } rt_t _rt; 1171 struct child_t 1172 { 1173 pid_t _pid; 1174 uid_t _uid; 1175 int _status; 1176 clock_t _utime; 1177 clock_t _stime; 1178 } child_t _child; 1179 struct fault_t 1180 { 1181 void* _addr; 1182 int _trap; 1183 int _trap2; 1184 int _trap3; 1185 } fault_t fault; 1186 struct poll_t 1187 { 1188 c_long _band; 1189 int _fd; 1190 } poll_t _poll; 1191 } 1192 reason_t _reason; 1193 } 1194 1195 union siginfo_t 1196 { 1197 ubyte[128] si_pad; 1198 _ksiginfo _info; 1199 @property ref c_long si_band() return { return _info._reason._poll._band; } 1200 } 1201 1202 enum SI_USER = 0; 1203 enum SI_QUEUE = -1; 1204 enum SI_TIMER = -2; 1205 enum SI_ASYNCIO = -3; 1206 enum SI_MESGQ = -4; 1207 } 1208 else version (OpenBSD) 1209 { 1210 enum SIG_CATCH = cast(sigfn_t2) 2; 1211 enum SIG_HOLD = cast(sigfn_t2) 3; 1212 1213 alias sigset_t = uint; 1214 1215 enum SA_NOCLDSTOP = 0x0008; 1216 1217 enum SIG_BLOCK = 1; 1218 enum SIG_UNBLOCK = 2; 1219 enum SIG_SETMASK = 3; 1220 1221 private enum SI_MAXSZ = 128; 1222 private enum SI_PAD = (SI_MAXSZ / int.sizeof) - 3; 1223 1224 struct siginfo_t 1225 { 1226 int si_signo; 1227 int si_errno; 1228 int si_code; 1229 union _data 1230 { 1231 int[SI_PAD] _pad; 1232 struct _proc 1233 { 1234 pid_t _pid; 1235 union _pdata 1236 { 1237 struct _kill 1238 { 1239 uid_t _uid; 1240 sigval _value; 1241 } 1242 struct _cld 1243 { 1244 clock_t _utime; 1245 clock_t _stime; 1246 int _status; 1247 } 1248 } 1249 } 1250 struct _fault 1251 { 1252 caddr_t _addr; 1253 int _trapno; 1254 } 1255 } 1256 alias si_pid = _data._proc._pid; 1257 alias si_status = _data._proc._pdata._cld._status; 1258 alias si_stime = _data._proc._pdata._cld._stime; 1259 alias si_utime = _data._proc._pdata._cld._utime; 1260 alias si_uid = _data._proc._pdata._kill._uid; 1261 alias si_value = _data._proc._pdata._kill._value; 1262 alias si_addr = _data._fault._addr; 1263 alias si_trapno = _data._fault._trapno; 1264 } 1265 1266 enum SI_NOINFO = 32767; 1267 enum SI_USER = 0; 1268 enum SI_LWP = -1; 1269 enum SI_QUEUE = -2; 1270 enum SI_TIMER = -3; 1271 } 1272 else version (DragonFlyBSD) 1273 { 1274 enum SIG_CATCH = cast(sigfn_t2) 2; 1275 enum SIG_HOLD = cast(sigfn_t2) 3; 1276 1277 struct sigset_t 1278 { 1279 uint[4] __bits; 1280 } 1281 1282 enum SA_NOCLDSTOP = 8; 1283 1284 enum SIG_BLOCK = 1; 1285 enum SIG_UNBLOCK = 2; 1286 enum SIG_SETMASK = 3; 1287 1288 struct siginfo_t 1289 { 1290 int si_signo; 1291 int si_errno; 1292 int si_code; 1293 int si_pid; 1294 uint si_uid; 1295 int si_status; 1296 void* si_addr; 1297 sigval si_value; 1298 c_long si_band; 1299 int[7] __spare; 1300 } 1301 1302 enum SI_UNDEFINED = 0x00000; 1303 enum SI_USER = 0; 1304 enum SI_QUEUE = -1; 1305 enum SI_TIMER = -2; 1306 enum SI_ASYNCIO = -3; 1307 enum SI_MESGQ = -4; 1308 } 1309 else version (Solaris) 1310 { 1311 enum SIG_HOLD = cast(sigfn_t2)2; 1312 1313 struct sigset_t 1314 { 1315 uint[4] __bits; 1316 } 1317 1318 enum SIG_BLOCK = 1; 1319 enum SIG_UNBLOCK = 2; 1320 enum SIG_SETMASK = 3; 1321 1322 struct siginfo_t 1323 { 1324 int si_signo; 1325 int si_code; 1326 int si_errno; 1327 1328 version (D_LP64) 1329 int si_pad; 1330 1331 union ___data 1332 { 1333 version (D_LP64) 1334 int[(256 / int.sizeof) - 4] si_pad; 1335 else 1336 int[(128 / int.sizeof) - 3] si_pad; 1337 1338 struct ___proc 1339 { 1340 pid_t __pid; 1341 1342 union ___pdata 1343 { 1344 struct ___kill 1345 { 1346 uid_t __uid; 1347 sigval __value; 1348 } 1349 1350 ___kill __kill; 1351 1352 struct ___cld 1353 { 1354 clock_t __utime; 1355 int __status; 1356 clock_t __stime; 1357 } 1358 1359 ___cld __cld; 1360 } 1361 1362 ___pdata __pdata; 1363 ctid_t __ctid; 1364 zoneid_t __zoneid; 1365 } 1366 1367 ___proc __proc; 1368 1369 struct ___fault 1370 { 1371 void* __addr; 1372 int __trapno; 1373 caddr_t __pc; 1374 } 1375 1376 ___fault __fault; 1377 1378 struct ___file 1379 { 1380 int __fd; 1381 c_long __band; 1382 } 1383 1384 ___file __file; 1385 1386 struct ___prof 1387 { 1388 caddr_t __faddr; 1389 timestruc_t __tstamp; 1390 short __syscall; 1391 char __nsysarg = 0; 1392 char __fault = 0; 1393 c_long[8] __sysarg; 1394 int[10] __mstate; 1395 } 1396 1397 ___prof __prof; 1398 1399 struct ___rctl 1400 { 1401 int __entity; 1402 } 1403 1404 ___rctl __rctl; 1405 } 1406 1407 ___data __data; 1408 } 1409 1410 enum SI_NOINFO = 32767; 1411 enum SI_DTRACE = 2050; 1412 enum SI_RCTL = 2049; 1413 enum SI_USER = 0; 1414 enum SI_LWP = -1; 1415 enum SI_QUEUE = -2; 1416 enum SI_TIMER = -3; 1417 enum SI_ASYNCIO = -4; 1418 enum SI_MESGQ = -5; 1419 } 1420 else 1421 { 1422 static assert(false, "Unsupported platform"); 1423 } 1424 1425 /* 1426 int kill(pid_t, int); 1427 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1428 int sigaddset(sigset_t*, int); 1429 int sigdelset(sigset_t*, int); 1430 int sigemptyset(sigset_t*); 1431 int sigfillset(sigset_t*); 1432 int sigismember(const scope sigset_t*, int); 1433 int sigpending(sigset_t*); 1434 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1435 int sigsuspend(const scope sigset_t*); 1436 int sigwait(const scope sigset_t*, int*); 1437 */ 1438 1439 version (CRuntime_Glibc) 1440 { 1441 int kill(pid_t, int); 1442 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1443 int sigaddset(sigset_t*, int); 1444 int sigdelset(sigset_t*, int); 1445 int sigemptyset(sigset_t*); 1446 int sigfillset(sigset_t*); 1447 int sigismember(const scope sigset_t*, int); 1448 int sigpending(sigset_t*); 1449 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1450 int sigsuspend(const scope sigset_t*); 1451 int sigwait(const scope sigset_t*, int*); 1452 } 1453 else version (Darwin) 1454 { 1455 int kill(pid_t, int); 1456 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1457 int sigaddset(sigset_t*, int); 1458 int sigdelset(sigset_t*, int); 1459 int sigemptyset(sigset_t*); 1460 int sigfillset(sigset_t*); 1461 int sigismember(const scope sigset_t*, int); 1462 int sigpending(sigset_t*); 1463 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1464 int sigsuspend(const scope sigset_t*); 1465 int sigwait(const scope sigset_t*, int*); 1466 } 1467 else version (FreeBSD) 1468 { 1469 int kill(pid_t, int); 1470 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1471 int sigaddset(sigset_t*, int); 1472 int sigdelset(sigset_t*, int); 1473 int sigemptyset(sigset_t *); 1474 int sigfillset(sigset_t *); 1475 int sigismember(const scope sigset_t*, int); 1476 int sigpending(sigset_t *); 1477 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1478 int sigsuspend(const scope sigset_t*); 1479 int sigwait(const scope sigset_t*, int*); 1480 } 1481 else version (NetBSD) 1482 { 1483 int kill(pid_t, int); 1484 int __sigaction14(int, const scope sigaction_t*, sigaction_t*); 1485 int __sigaddset14(sigset_t*, int); 1486 int __sigdelset14(sigset_t*, int); 1487 int __sigemptyset14(sigset_t *); 1488 int __sigfillset14(sigset_t *); 1489 int __sigismember14(const scope sigset_t*, int); 1490 int __sigpending14(sigset_t *); 1491 int __sigprocmask14(int, const scope sigset_t*, sigset_t*); 1492 int __sigsuspend14(const scope sigset_t*); 1493 int sigwait(const scope sigset_t*, int*); 1494 1495 alias __sigaction14 sigaction; 1496 alias __sigaddset14 sigaddset; 1497 alias __sigdelset14 sigdelset; 1498 alias __sigemptyset14 sigemptyset; 1499 alias __sigfillset14 sigfillset; 1500 alias __sigismember14 sigismember; 1501 alias __sigpending14 sigpending; 1502 alias __sigprocmask14 sigprocmask; 1503 alias __sigsuspend14 sigsuspend; 1504 } 1505 else version (OpenBSD) 1506 { 1507 int kill(pid_t, int); 1508 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1509 int sigaddset(sigset_t*, int); 1510 int sigdelset(sigset_t*, int); 1511 int sigemptyset(sigset_t *); 1512 int sigfillset(sigset_t *); 1513 int sigismember(const scope sigset_t*, int); 1514 int sigpending(sigset_t *); 1515 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1516 int sigsuspend(const scope sigset_t*); 1517 int sigwait(const scope sigset_t*, int*); 1518 } 1519 else version (DragonFlyBSD) 1520 { 1521 int kill(pid_t, int); 1522 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1523 int sigaddset(sigset_t*, int); 1524 int sigdelset(sigset_t*, int); 1525 int sigemptyset(sigset_t *); 1526 int sigfillset(sigset_t *); 1527 int sigismember(const scope sigset_t*, int); 1528 int sigpending(sigset_t *); 1529 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1530 int sigsuspend(const scope sigset_t*); 1531 int sigwait(const scope sigset_t*, int*); 1532 } 1533 else version (Solaris) 1534 { 1535 int kill(pid_t, int); 1536 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1537 int sigaddset(sigset_t*, int); 1538 int sigdelset(sigset_t*, int); 1539 int sigemptyset(sigset_t*); 1540 int sigfillset(sigset_t*); 1541 int sigismember(const scope sigset_t*, int); 1542 int sigpending(sigset_t*); 1543 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1544 int sigsuspend(const scope sigset_t*); 1545 int sigwait(const scope sigset_t*, int*); 1546 } 1547 else version (CRuntime_Bionic) 1548 { 1549 public import core.sys.posix.time: timer_t; 1550 import core.stdc.string : memset; 1551 1552 version (X86) 1553 enum int LONG_BIT = 32; 1554 else version (ARM) 1555 enum int LONG_BIT = 32; 1556 else version (AArch64) 1557 enum int LONG_BIT = 64; 1558 else version (X86_64) 1559 enum int LONG_BIT = 64; 1560 else 1561 static assert(false, "Architecture not supported."); 1562 1563 int kill(pid_t, int); 1564 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1565 1566 // These functions are defined inline in bionic. 1567 int sigaddset(sigset_t* set, int signum) @system 1568 { 1569 c_ulong* local_set = cast(c_ulong*) set; 1570 signum--; 1571 local_set[signum/LONG_BIT] |= 1UL << (signum%LONG_BIT); 1572 return 0; 1573 } 1574 1575 int sigdelset(sigset_t* set, int signum) @system 1576 { 1577 c_ulong* local_set = cast(c_ulong*) set; 1578 signum--; 1579 local_set[signum/LONG_BIT] &= ~(1UL << (signum%LONG_BIT)); 1580 return 0; 1581 } 1582 1583 int sigemptyset(sigset_t* set) { memset(set, 0, (*set).sizeof); return 0; } 1584 1585 int sigfillset(sigset_t* set) { memset(set, ~0, (*set).sizeof); return 0; } 1586 1587 int sigismember(sigset_t* set, int signum) @system 1588 { 1589 c_ulong* local_set = cast(c_ulong*) set; 1590 signum--; 1591 return cast(int) ((local_set[signum/LONG_BIT] >> (signum%LONG_BIT)) & 1); 1592 } 1593 1594 int sigpending(sigset_t*); 1595 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1596 int sigsuspend(const scope sigset_t*); 1597 int sigwait(const scope sigset_t*, int*); 1598 } 1599 else version (CRuntime_Musl) 1600 { 1601 int kill(pid_t, int); 1602 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1603 int sigaddset(sigset_t*, int); 1604 int sigdelset(sigset_t*, int); 1605 int sigemptyset(sigset_t*); 1606 int sigfillset(sigset_t*); 1607 int sigismember(const scope sigset_t*, int); 1608 int sigpending(sigset_t*); 1609 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1610 int sigsuspend(const scope sigset_t*); 1611 int sigwait(const scope sigset_t*, int*); 1612 } 1613 else version (CRuntime_UClibc) 1614 { 1615 int kill(pid_t, int); 1616 int sigaction(int, const scope sigaction_t*, sigaction_t*); 1617 int sigaddset(sigset_t*, int); 1618 int sigdelset(sigset_t*, int); 1619 int sigemptyset(sigset_t*); 1620 int sigfillset(sigset_t*); 1621 int sigismember(const scope sigset_t*, int); 1622 int sigpending(sigset_t*); 1623 int sigprocmask(int, const scope sigset_t*, sigset_t*); 1624 int sigsuspend(const scope sigset_t*); 1625 int sigwait(const scope sigset_t*, int*); 1626 } 1627 else 1628 { 1629 static assert(false, "Unsupported platform"); 1630 } 1631 } 1632 1633 // 1634 // XOpen (XSI) 1635 // 1636 /* 1637 SIGPOLL 1638 SIGPROF 1639 SIGSYS 1640 SIGTRAP 1641 SIGVTALRM 1642 SIGXCPU 1643 SIGXFSZ 1644 1645 SA_ONSTACK 1646 SA_RESETHAND 1647 SA_RESTART 1648 SA_SIGINFO 1649 SA_NOCLDWAIT 1650 SA_NODEFER 1651 1652 ILL_ILLOPC 1653 ILL_ILLOPN 1654 ILL_ILLADR 1655 ILL_ILLTRP 1656 ILL_PRVOPC 1657 ILL_PRVREG 1658 ILL_COPROC 1659 ILL_BADSTK 1660 1661 FPE_INTDIV 1662 FPE_INTOVF 1663 FPE_FLTDIV 1664 FPE_FLTOVF 1665 FPE_FLTUND 1666 FPE_FLTRES 1667 FPE_FLTINV 1668 FPE_FLTSUB 1669 1670 SEGV_MAPERR 1671 SEGV_ACCERR 1672 1673 BUS_ADRALN 1674 BUS_ADRERR 1675 BUS_OBJERR 1676 1677 TRAP_BRKPT 1678 TRAP_TRACE 1679 1680 CLD_EXITED 1681 CLD_KILLED 1682 CLD_DUMPED 1683 CLD_TRAPPED 1684 CLD_STOPPED 1685 CLD_CONTINUED 1686 1687 POLL_IN 1688 POLL_OUT 1689 POLL_MSG 1690 POLL_ERR 1691 POLL_PRI 1692 POLL_HUP 1693 */ 1694 1695 version (linux) 1696 { 1697 version (X86_Any) 1698 { 1699 enum SIGPOLL = 29; 1700 enum SIGPROF = 27; 1701 enum SIGSYS = 31; 1702 enum SIGTRAP = 5; 1703 enum SIGVTALRM = 26; 1704 enum SIGXCPU = 24; 1705 enum SIGXFSZ = 25; 1706 } 1707 else version (HPPA_Any) 1708 { 1709 enum SIGPOLL = 22; 1710 enum SIGPROF = 21; 1711 enum SIGSYS = 31; 1712 enum SIGTRAP = 5; 1713 enum SIGVTALRM = 20; 1714 enum SIGXCPU = 12; 1715 enum SIGXFSZ = 30; 1716 } 1717 else version (MIPS_Any) 1718 { 1719 enum SIGPOLL = 22; 1720 enum SIGPROF = 29; 1721 enum SIGSYS = 12; 1722 enum SIGTRAP = 5; 1723 enum SIGVTALRM = 28; 1724 enum SIGXCPU = 30; 1725 enum SIGXFSZ = 31; 1726 } 1727 else version (PPC_Any) 1728 { 1729 enum SIGPOLL = 29; 1730 enum SIGPROF = 27; 1731 enum SIGSYS = 31; 1732 enum SIGTRAP = 5; 1733 enum SIGVTALRM = 26; 1734 enum SIGXCPU = 24; 1735 enum SIGXFSZ = 25; 1736 } 1737 else version (ARM_Any) 1738 { 1739 enum SIGPOLL = 29; 1740 enum SIGPROF = 27; 1741 enum SIGSYS = 31; 1742 enum SIGTRAP = 5; 1743 enum SIGVTALRM = 26; 1744 enum SIGXCPU = 24; 1745 enum SIGXFSZ = 25; 1746 } 1747 else version (RISCV_Any) 1748 { 1749 enum SIGPOLL = 29; 1750 enum SIGPROF = 27; 1751 enum SIGSYS = 31; 1752 enum SIGTRAP = 5; 1753 enum SIGVTALRM = 26; 1754 enum SIGXCPU = 24; 1755 enum SIGXFSZ = 25; 1756 } 1757 else version (SPARC_Any) 1758 { 1759 enum SIGPOLL = 23; 1760 enum SIGPROF = 27; 1761 enum SIGSYS = 12; 1762 enum SIGTRAP = 5; 1763 enum SIGVTALRM = 26; 1764 enum SIGXCPU = 24; 1765 enum SIGXFSZ = 25; 1766 } 1767 else version (IBMZ_Any) 1768 { 1769 enum SIGPOLL = 29; 1770 enum SIGPROF = 27; 1771 enum SIGSYS = 31; 1772 enum SIGTRAP = 5; 1773 enum SIGVTALRM = 26; 1774 enum SIGXCPU = 24; 1775 enum SIGXFSZ = 25; 1776 } 1777 else version (LoongArch64) 1778 { 1779 enum SIGPOLL = 29; 1780 enum SIGPROF = 27; 1781 enum SIGSYS = 31; 1782 enum SIGTRAP = 5; 1783 enum SIGVTALRM = 26; 1784 enum SIGXCPU = 24; 1785 enum SIGXFSZ = 25; 1786 } 1787 else 1788 static assert(0, "unimplemented"); 1789 1790 version (MIPS_Any) 1791 { 1792 enum SA_ONSTACK = 0x08000000; 1793 enum SA_RESETHAND = 0x80000000; 1794 enum SA_RESTART = 0x10000000; 1795 enum SA_SIGINFO = 8; 1796 enum SA_NOCLDWAIT = 0x10000; 1797 enum SA_NODEFER = 0x40000000; 1798 } 1799 else 1800 { 1801 enum SA_ONSTACK = 0x08000000; 1802 enum SA_RESETHAND = 0x80000000; 1803 enum SA_RESTART = 0x10000000; 1804 enum SA_SIGINFO = 4; 1805 enum SA_NOCLDWAIT = 2; 1806 enum SA_NODEFER = 0x40000000; 1807 } 1808 1809 enum SA_NOMASK = SA_NODEFER; 1810 enum SA_ONESHOT = SA_RESETHAND; 1811 enum SA_STACK = SA_ONSTACK; 1812 1813 enum 1814 { 1815 ILL_ILLOPC = 1, 1816 ILL_ILLOPN, 1817 ILL_ILLADR, 1818 ILL_ILLTRP, 1819 ILL_PRVOPC, 1820 ILL_PRVREG, 1821 ILL_COPROC, 1822 ILL_BADSTK 1823 } 1824 1825 enum 1826 { 1827 FPE_INTDIV = 1, 1828 FPE_INTOVF, 1829 FPE_FLTDIV, 1830 FPE_FLTOVF, 1831 FPE_FLTUND, 1832 FPE_FLTRES, 1833 FPE_FLTINV, 1834 FPE_FLTSUB 1835 } 1836 1837 enum 1838 { 1839 SEGV_MAPERR = 1, 1840 SEGV_ACCERR 1841 } 1842 1843 enum 1844 { 1845 BUS_ADRALN = 1, 1846 BUS_ADRERR, 1847 BUS_OBJERR 1848 } 1849 1850 enum 1851 { 1852 TRAP_BRKPT = 1, 1853 TRAP_TRACE 1854 } 1855 1856 enum 1857 { 1858 CLD_EXITED = 1, 1859 CLD_KILLED, 1860 CLD_DUMPED, 1861 CLD_TRAPPED, 1862 CLD_STOPPED, 1863 CLD_CONTINUED 1864 } 1865 1866 enum 1867 { 1868 POLL_IN = 1, 1869 POLL_OUT, 1870 POLL_MSG, 1871 POLL_ERR, 1872 POLL_PRI, 1873 POLL_HUP 1874 } 1875 } 1876 else version (Darwin) 1877 { 1878 enum SIGPOLL = 7; 1879 enum SIGPROF = 27; 1880 enum SIGSYS = 12; 1881 enum SIGTRAP = 5; 1882 enum SIGVTALRM = 26; 1883 enum SIGXCPU = 24; 1884 enum SIGXFSZ = 25; 1885 1886 enum SA_ONSTACK = 0x0001; 1887 enum SA_RESETHAND = 0x0004; 1888 enum SA_RESTART = 0x0002; 1889 enum SA_SIGINFO = 0x0040; 1890 enum SA_NOCLDWAIT = 0x0020; 1891 enum SA_NODEFER = 0x0010; 1892 1893 enum ILL_ILLOPC = 1; 1894 enum ILL_ILLOPN = 4; 1895 enum ILL_ILLADR = 5; 1896 enum ILL_ILLTRP = 2; 1897 enum ILL_PRVOPC = 3; 1898 enum ILL_PRVREG = 6; 1899 enum ILL_COPROC = 7; 1900 enum ILL_BADSTK = 8; 1901 1902 enum FPE_INTDIV = 7; 1903 enum FPE_INTOVF = 8; 1904 enum FPE_FLTDIV = 1; 1905 enum FPE_FLTOVF = 2; 1906 enum FPE_FLTUND = 3; 1907 enum FPE_FLTRES = 4; 1908 enum FPE_FLTINV = 5; 1909 enum FPE_FLTSUB = 6; 1910 1911 enum 1912 { 1913 SEGV_MAPERR = 1, 1914 SEGV_ACCERR 1915 } 1916 1917 enum 1918 { 1919 BUS_ADRALN = 1, 1920 BUS_ADRERR, 1921 BUS_OBJERR 1922 } 1923 1924 enum 1925 { 1926 TRAP_BRKPT = 1, 1927 TRAP_TRACE 1928 } 1929 1930 enum 1931 { 1932 CLD_EXITED = 1, 1933 CLD_KILLED, 1934 CLD_DUMPED, 1935 CLD_TRAPPED, 1936 CLD_STOPPED, 1937 CLD_CONTINUED 1938 } 1939 1940 enum 1941 { 1942 POLL_IN = 1, 1943 POLL_OUT, 1944 POLL_MSG, 1945 POLL_ERR, 1946 POLL_PRI, 1947 POLL_HUP 1948 } 1949 } 1950 else version (FreeBSD) 1951 { 1952 // No SIGPOLL on *BSD 1953 enum SIGPROF = 27; 1954 enum SIGSYS = 12; 1955 enum SIGTRAP = 5; 1956 enum SIGVTALRM = 26; 1957 enum SIGXCPU = 24; 1958 enum SIGXFSZ = 25; 1959 1960 enum 1961 { 1962 SA_ONSTACK = 0x0001, 1963 SA_RESTART = 0x0002, 1964 SA_RESETHAND = 0x0004, 1965 SA_NODEFER = 0x0010, 1966 SA_NOCLDWAIT = 0x0020, 1967 SA_SIGINFO = 0x0040, 1968 } 1969 1970 enum 1971 { 1972 ILL_ILLOPC = 1, 1973 ILL_ILLOPN, 1974 ILL_ILLADR, 1975 ILL_ILLTRP, 1976 ILL_PRVOPC, 1977 ILL_PRVREG, 1978 ILL_COPROC, 1979 ILL_BADSTK, 1980 } 1981 1982 enum 1983 { 1984 BUS_ADRALN = 1, 1985 BUS_ADRERR, 1986 BUS_OBJERR, 1987 } 1988 1989 enum 1990 { 1991 SEGV_MAPERR = 1, 1992 SEGV_ACCERR, 1993 } 1994 1995 enum 1996 { 1997 FPE_INTOVF = 1, 1998 FPE_INTDIV, 1999 FPE_FLTDIV, 2000 FPE_FLTOVF, 2001 FPE_FLTUND, 2002 FPE_FLTRES, 2003 FPE_FLTINV, 2004 FPE_FLTSUB, 2005 } 2006 2007 enum 2008 { 2009 TRAP_BRKPT = 1, 2010 TRAP_TRACE, 2011 } 2012 2013 enum 2014 { 2015 CLD_EXITED = 1, 2016 CLD_KILLED, 2017 CLD_DUMPED, 2018 CLD_TRAPPED, 2019 CLD_STOPPED, 2020 CLD_CONTINUED, 2021 } 2022 2023 enum 2024 { 2025 POLL_IN = 1, 2026 POLL_OUT, 2027 POLL_MSG, 2028 POLL_ERR, 2029 POLL_PRI, 2030 POLL_HUP, 2031 } 2032 } 2033 else version (NetBSD) 2034 { 2035 // No SIGPOLL on *BSD 2036 enum SIGPROF = 27; 2037 enum SIGSYS = 12; 2038 enum SIGTRAP = 5; 2039 enum SIGVTALRM = 26; 2040 enum SIGXCPU = 24; 2041 enum SIGXFSZ = 25; 2042 2043 enum 2044 { 2045 SA_ONSTACK = 0x0001, 2046 SA_RESTART = 0x0002, 2047 SA_RESETHAND = 0x0004, 2048 SA_NODEFER = 0x0010, 2049 SA_NOCLDWAIT = 0x0020, 2050 SA_SIGINFO = 0x0040, 2051 } 2052 2053 enum 2054 { 2055 ILL_ILLOPC = 1, 2056 ILL_ILLOPN, 2057 ILL_ILLADR, 2058 ILL_ILLTRP, 2059 ILL_PRVOPC, 2060 ILL_PRVREG, 2061 ILL_COPROC, 2062 ILL_BADSTK, 2063 } 2064 2065 enum 2066 { 2067 BUS_ADRALN = 1, 2068 BUS_ADRERR, 2069 BUS_OBJERR, 2070 } 2071 2072 enum 2073 { 2074 SEGV_MAPERR = 1, 2075 SEGV_ACCERR, 2076 } 2077 2078 enum 2079 { 2080 FPE_INTOVF = 1, 2081 FPE_INTDIV, 2082 FPE_FLTDIV, 2083 FPE_FLTOVF, 2084 FPE_FLTUND, 2085 FPE_FLTRES, 2086 FPE_FLTINV, 2087 FPE_FLTSUB, 2088 } 2089 2090 enum 2091 { 2092 TRAP_BRKPT = 1, 2093 TRAP_TRACE, 2094 } 2095 2096 enum 2097 { 2098 CLD_EXITED = 1, 2099 CLD_KILLED, 2100 CLD_DUMPED, 2101 CLD_TRAPPED, 2102 CLD_STOPPED, 2103 CLD_CONTINUED, 2104 } 2105 2106 enum 2107 { 2108 POLL_IN = 1, 2109 POLL_OUT, 2110 POLL_MSG, 2111 POLL_ERR, 2112 POLL_PRI, 2113 POLL_HUP, 2114 } 2115 } 2116 else version (OpenBSD) 2117 { 2118 // No SIGPOLL on *BSD 2119 enum SIGPROF = 27; 2120 enum SIGSYS = 12; 2121 enum SIGTRAP = 5; 2122 enum SIGVTALRM = 26; 2123 enum SIGXCPU = 24; 2124 enum SIGXFSZ = 25; 2125 2126 enum 2127 { 2128 SA_ONSTACK = 0x0001, 2129 SA_RESTART = 0x0002, 2130 SA_RESETHAND = 0x0004, 2131 SA_NODEFER = 0x0010, 2132 SA_NOCLDWAIT = 0x0020, 2133 SA_SIGINFO = 0x0040, 2134 } 2135 2136 enum 2137 { 2138 ILL_ILLOPC = 1, 2139 ILL_ILLOPN, 2140 ILL_ILLADR, 2141 ILL_ILLTRP, 2142 ILL_PRVOPC, 2143 ILL_PRVREG, 2144 ILL_COPROC, 2145 ILL_BADSTK, 2146 NSIGILL = ILL_BADSTK, 2147 } 2148 2149 enum 2150 { 2151 BUS_ADRALN = 1, 2152 BUS_ADRERR, 2153 BUS_OBJERR, 2154 NSIGBUS = BUS_OBJERR, 2155 } 2156 2157 enum 2158 { 2159 SEGV_MAPERR = 1, 2160 SEGV_ACCERR, 2161 NSIGSEGV = SEGV_ACCERR, 2162 } 2163 2164 enum 2165 { 2166 FPE_INTDIV = 1, 2167 FPE_INTOVF, 2168 FPE_FLTDIV, 2169 FPE_FLTOVF, 2170 FPE_FLTUND, 2171 FPE_FLTRES, 2172 FPE_FLTINV, 2173 FPE_FLTSUB, 2174 NSIGFPE = FPE_FLTSUB, 2175 } 2176 2177 enum 2178 { 2179 TRAP_BRKPT = 1, 2180 TRAP_TRACE, 2181 NSIGTRAP = TRAP_TRACE, 2182 } 2183 2184 enum 2185 { 2186 CLD_EXITED = 1, 2187 CLD_KILLED, 2188 CLD_DUMPED, 2189 CLD_TRAPPED, 2190 CLD_STOPPED, 2191 CLD_CONTINUED, 2192 NSIGCLD = CLD_CONTINUED, 2193 } 2194 2195 enum 2196 { 2197 POLL_IN = 1, 2198 POLL_OUT, 2199 POLL_MSG, 2200 POLL_ERR, 2201 POLL_PRI, 2202 POLL_HUP, 2203 NSIGPOLL = POLL_HUP, 2204 } 2205 } 2206 else version (DragonFlyBSD) 2207 { 2208 // No SIGPOLL on *BSD 2209 enum SIGPROF = 27; 2210 enum SIGSYS = 12; 2211 enum SIGTRAP = 5; 2212 enum SIGVTALRM = 26; 2213 enum SIGXCPU = 24; 2214 enum SIGXFSZ = 25; 2215 2216 enum 2217 { 2218 SA_ONSTACK = 0x0001, 2219 SA_RESTART = 0x0002, 2220 SA_RESETHAND = 0x0004, 2221 SA_NODEFER = 0x0010, 2222 SA_NOCLDWAIT = 0x0020, 2223 SA_SIGINFO = 0x0040, 2224 } 2225 2226 enum 2227 { 2228 ILL_ILLOPC = 1, 2229 ILL_ILLOPN, 2230 ILL_ILLADR, 2231 ILL_ILLTRP, 2232 ILL_PRVOPC, 2233 ILL_PRVREG, 2234 ILL_COPROC, 2235 ILL_BADSTK, 2236 } 2237 2238 enum 2239 { 2240 BUS_ADRALN = 1, 2241 BUS_ADRERR, 2242 BUS_OBJERR, 2243 } 2244 2245 enum 2246 { 2247 SEGV_MAPERR = 1, 2248 SEGV_ACCERR, 2249 } 2250 2251 enum 2252 { 2253 FPE_INTOVF = 1, 2254 FPE_INTDIV, 2255 FPE_FLTDIV, 2256 FPE_FLTOVF, 2257 FPE_FLTUND, 2258 FPE_FLTRES, 2259 FPE_FLTINV, 2260 FPE_FLTSUB, 2261 } 2262 2263 enum 2264 { 2265 TRAP_BRKPT = 1, 2266 TRAP_TRACE, 2267 } 2268 2269 enum 2270 { 2271 CLD_EXITED = 1, 2272 CLD_KILLED, 2273 CLD_DUMPED, 2274 CLD_TRAPPED, 2275 CLD_STOPPED, 2276 CLD_CONTINUED, 2277 } 2278 2279 enum 2280 { 2281 POLL_IN = 1, 2282 POLL_OUT, 2283 POLL_MSG, 2284 POLL_ERR, 2285 POLL_PRI, 2286 POLL_HUP, 2287 } 2288 } 2289 else version (Solaris) 2290 { 2291 enum SIGPOLL = 22; 2292 enum SIGIO = SIGPOLL; 2293 enum SIGPROF = 29; 2294 enum SIGSYS = 12; 2295 enum SIGTRAP = 5; 2296 enum SIGVTALRM = 28; 2297 enum SIGXCPU = 30; 2298 enum SIGXFSZ = 31; 2299 2300 enum 2301 { 2302 SA_ONSTACK = 0x00001, 2303 SA_RESTART = 0x00004, 2304 SA_RESETHAND = 0x00002, 2305 SA_NODEFER = 0x00010, 2306 SA_NOCLDWAIT = 0x10000, 2307 SA_SIGINFO = 0x00008, 2308 } 2309 2310 enum 2311 { 2312 ILL_ILLOPC = 1, 2313 ILL_ILLOPN, 2314 ILL_ILLADR, 2315 ILL_ILLTRP, 2316 ILL_PRVOPC, 2317 ILL_PRVREG, 2318 ILL_COPROC, 2319 ILL_BADSTK, 2320 } 2321 2322 enum 2323 { 2324 BUS_ADRALN = 1, 2325 BUS_ADRERR, 2326 BUS_OBJERR, 2327 } 2328 2329 enum 2330 { 2331 SEGV_MAPERR = 1, 2332 SEGV_ACCERR, 2333 } 2334 2335 enum 2336 { 2337 FPE_INTDIV = 1, 2338 FPE_INTOVF, 2339 FPE_FLTDIV, 2340 FPE_FLTOVF, 2341 FPE_FLTUND, 2342 FPE_FLTRES, 2343 FPE_FLTINV, 2344 FPE_FLTSUB, 2345 FPE_FLTDEN, 2346 } 2347 2348 enum 2349 { 2350 TRAP_BRKPT = 1, 2351 TRAP_TRACE, 2352 TRAP_RWATCH, 2353 TRAP_WWATCH, 2354 TRAP_XWATCH, 2355 TRAP_DTRACE, 2356 } 2357 2358 enum 2359 { 2360 CLD_EXITED = 1, 2361 CLD_KILLED, 2362 CLD_DUMPED, 2363 CLD_TRAPPED, 2364 CLD_STOPPED, 2365 CLD_CONTINUED, 2366 } 2367 2368 enum 2369 { 2370 POLL_IN = 1, 2371 POLL_OUT, 2372 POLL_MSG, 2373 POLL_ERR, 2374 POLL_PRI, 2375 POLL_HUP, 2376 } 2377 } 2378 else 2379 { 2380 static assert(false, "Unsupported platform"); 2381 } 2382 2383 /* 2384 SS_ONSTACK 2385 SS_DISABLE 2386 MINSIGSTKSZ 2387 SIGSTKSZ 2388 2389 ucontext_t // from ucontext 2390 mcontext_t // from ucontext 2391 2392 struct stack_t 2393 { 2394 void* ss_sp; 2395 size_t ss_size; 2396 int ss_flags; 2397 } 2398 2399 struct sigstack 2400 { 2401 int ss_onstack; 2402 void* ss_sp; 2403 } 2404 2405 sigfn_t bsd_signal(int sig, sigfn_t func); 2406 sigfn_t sigset(int sig, sigfn_t func); 2407 2408 int killpg(pid_t, int); 2409 int sigaltstack(const scope stack_t*, stack_t*); 2410 int sighold(int); 2411 int sigignore(int); 2412 int siginterrupt(int, int); 2413 int sigpause(int); 2414 int sigrelse(int); 2415 */ 2416 2417 version (CRuntime_Glibc) 2418 { 2419 enum SS_ONSTACK = 1; 2420 enum SS_DISABLE = 2; 2421 enum MINSIGSTKSZ = 2048; 2422 enum SIGSTKSZ = 8192; 2423 2424 //ucontext_t (defined in core.sys.posix.ucontext) 2425 //mcontext_t (defined in core.sys.posix.ucontext) 2426 2427 version (MIPS_Any) 2428 { 2429 struct stack_t 2430 { 2431 void* ss_sp; 2432 size_t ss_size; 2433 int ss_flags; 2434 } 2435 } 2436 else 2437 { 2438 struct stack_t 2439 { 2440 void* ss_sp; 2441 int ss_flags; 2442 size_t ss_size; 2443 } 2444 } 2445 2446 struct sigstack 2447 { 2448 void* ss_sp; 2449 int ss_onstack; 2450 } 2451 2452 sigfn_t bsd_signal(int sig, sigfn_t func); 2453 sigfn_t sigset(int sig, sigfn_t func); 2454 2455 nothrow: 2456 @nogc: 2457 sigfn_t2 bsd_signal(int sig, sigfn_t2 func); 2458 sigfn_t2 sigset(int sig, sigfn_t2 func); 2459 2460 int killpg(pid_t, int); 2461 int sigaltstack(const scope stack_t*, stack_t*); 2462 int sighold(int); 2463 int sigignore(int); 2464 int siginterrupt(int, int); 2465 int sigpause(int); 2466 int sigrelse(int); 2467 } 2468 else version (Darwin) 2469 { 2470 enum SS_ONSTACK = 0x0001; 2471 enum SS_DISABLE = 0x0004; 2472 enum MINSIGSTKSZ = 32768; 2473 enum SIGSTKSZ = 131072; 2474 2475 //ucontext_t (defined in core.sys.posix.ucontext) 2476 //mcontext_t (defined in core.sys.posix.ucontext) 2477 2478 struct stack_t 2479 { 2480 void* ss_sp; 2481 size_t ss_size; 2482 int ss_flags; 2483 } 2484 2485 struct sigstack 2486 { 2487 void* ss_sp; 2488 int ss_onstack; 2489 } 2490 2491 sigfn_t bsd_signal(int sig, sigfn_t func); 2492 sigfn_t sigset(int sig, sigfn_t func); 2493 2494 nothrow: 2495 @nogc: 2496 sigfn_t2 bsd_signal(int sig, sigfn_t2 func); 2497 sigfn_t2 sigset(int sig, sigfn_t2 func); 2498 2499 int killpg(pid_t, int); 2500 int sigaltstack(const scope stack_t*, stack_t*); 2501 int sighold(int); 2502 int sigignore(int); 2503 int siginterrupt(int, int); 2504 int sigpause(int); 2505 int sigrelse(int); 2506 } 2507 else version (FreeBSD) 2508 { 2509 enum 2510 { 2511 SS_ONSTACK = 0x0001, 2512 SS_DISABLE = 0x0004, 2513 } 2514 2515 enum MINSIGSTKSZ = 512 * 4; 2516 enum SIGSTKSZ = (MINSIGSTKSZ + 32768); 2517 2518 //ucontext_t (defined in core.sys.posix.ucontext) 2519 //mcontext_t (defined in core.sys.posix.ucontext) 2520 2521 struct stack_t 2522 { 2523 void* ss_sp; 2524 size_t ss_size; 2525 int ss_flags; 2526 } 2527 2528 struct sigstack 2529 { 2530 void* ss_sp; 2531 int ss_onstack; 2532 } 2533 2534 //sigfn_t bsd_signal(int sig, sigfn_t func); 2535 sigfn_t sigset(int sig, sigfn_t func); 2536 2537 nothrow: 2538 @nogc: 2539 //sigfn_t2 bsd_signal(int sig, sigfn_t2 func); 2540 sigfn_t2 sigset(int sig, sigfn_t2 func); 2541 2542 int killpg(pid_t, int); 2543 int sigaltstack(const scope stack_t*, stack_t*); 2544 int sighold(int); 2545 int sigignore(int); 2546 int siginterrupt(int, int); 2547 int sigpause(int); 2548 int sigrelse(int); 2549 } 2550 else version (NetBSD) 2551 { 2552 enum 2553 { 2554 SS_ONSTACK = 0x0001, 2555 SS_DISABLE = 0x0004, 2556 } 2557 2558 enum MINSIGSTKSZ = 8192; 2559 enum SIGSTKSZ = (MINSIGSTKSZ + 32768); 2560 2561 //ucontext_t (defined in core.sys.posix.ucontext) 2562 //mcontext_t (defined in core.sys.posix.ucontext) 2563 2564 struct stack_t 2565 { 2566 void* ss_sp; 2567 size_t ss_size; 2568 int ss_flags; 2569 } 2570 2571 struct sigstack 2572 { 2573 void* ss_sp; 2574 int ss_onstack; 2575 } 2576 2577 //sigfn_t bsd_signal(int sig, sigfn_t func); 2578 sigfn_t sigset(int sig, sigfn_t func); 2579 2580 nothrow: 2581 @nogc: 2582 //sigfn_t2 bsd_signal(int sig, sigfn_t2 func); 2583 sigfn_t2 sigset(int sig, sigfn_t2 func); 2584 2585 int killpg(pid_t, int); 2586 int sigaltstack(const scope stack_t*, stack_t*); 2587 int sighold(int); 2588 int sigignore(int); 2589 int siginterrupt(int, int); 2590 int sigpause(int); 2591 int sigrelse(int); 2592 } 2593 else version (OpenBSD) 2594 { 2595 enum 2596 { 2597 SS_ONSTACK = 0x0001, 2598 SS_DISABLE = 0x0004, 2599 } 2600 2601 enum MINSIGSTKSZ = 8192; 2602 enum SIGSTKSZ = (MINSIGSTKSZ + 32768); 2603 2604 //ucontext_t (defined in core.sys.posix.ucontext) 2605 //mcontext_t (defined in core.sys.posix.ucontext) 2606 2607 struct stack_t 2608 { 2609 void* ss_sp; 2610 size_t ss_size; 2611 int ss_flags; 2612 } 2613 2614 nothrow: 2615 @nogc: 2616 int killpg(pid_t, int); 2617 int sigaltstack(const scope stack_t*, stack_t*); 2618 int siginterrupt(int, int); 2619 int sigpause(int); 2620 } 2621 else version (DragonFlyBSD) 2622 { 2623 enum 2624 { 2625 SS_ONSTACK = 0x0001, 2626 SS_DISABLE = 0x0004, 2627 } 2628 2629 enum MINSIGSTKSZ = 8192; 2630 enum SIGSTKSZ = (MINSIGSTKSZ + 32768); 2631 2632 //ucontext_t (defined in core.sys.posix.ucontext) 2633 //mcontext_t (defined in core.sys.posix.ucontext) 2634 2635 struct stack_t 2636 { 2637 void* ss_sp; 2638 size_t ss_size; 2639 int ss_flags; 2640 } 2641 2642 struct sigstack 2643 { 2644 void* ss_sp; 2645 int ss_onstack; 2646 } 2647 2648 //sigfn_t bsd_signal(int sig, sigfn_t func); 2649 sigfn_t sigset(int sig, sigfn_t func); 2650 2651 nothrow: 2652 @nogc: 2653 //sigfn_t2 bsd_signal(int sig, sigfn_t2 func); 2654 sigfn_t2 sigset(int sig, sigfn_t2 func); 2655 2656 int killpg(pid_t, int); 2657 int sigaltstack(const scope stack_t*, stack_t*); 2658 int sighold(int); 2659 int sigignore(int); 2660 int siginterrupt(int, int); 2661 int sigpause(int); 2662 int sigrelse(int); 2663 } 2664 else version (Solaris) 2665 { 2666 enum 2667 { 2668 SS_ONSTACK = 0x0001, 2669 SS_DISABLE = 0x0002, 2670 } 2671 2672 enum MINSIGSTKSZ = 2048; 2673 enum SIGSTKSZ = 8192; 2674 2675 struct stack_t 2676 { 2677 void* ss_sp; 2678 size_t ss_size; 2679 int ss_flags; 2680 } 2681 2682 struct sigstack 2683 { 2684 void* ss_sp; 2685 int ss_onstack; 2686 } 2687 2688 sigfn_t sigset(int sig, sigfn_t func); 2689 2690 nothrow: 2691 @nogc: 2692 sigfn_t2 sigset(int sig, sigfn_t2 func); 2693 2694 int killpg(pid_t, int); 2695 int sigaltstack(const scope stack_t*, stack_t*); 2696 int sighold(int); 2697 int sigignore(int); 2698 int siginterrupt(int, int); 2699 int sigpause(int); 2700 int sigrelse(int); 2701 } 2702 else version (CRuntime_Bionic) 2703 { 2704 enum SS_ONSTACK = 1; 2705 enum SS_DISABLE = 2; 2706 enum MINSIGSTKSZ = 2048; 2707 enum SIGSTKSZ = 8192; 2708 2709 struct stack_t 2710 { 2711 void* ss_sp; 2712 int ss_flags; 2713 size_t ss_size; 2714 } 2715 2716 sigfn_t bsd_signal(int, sigfn_t); 2717 2718 nothrow: 2719 @nogc: 2720 sigfn_t2 bsd_signal(int, sigfn_t2); 2721 2722 int killpg(int, int); 2723 int sigaltstack(const scope stack_t*, stack_t*); 2724 int siginterrupt(int, int); 2725 } 2726 else version (CRuntime_Musl) 2727 { 2728 enum SS_ONSTACK = 1; 2729 enum SS_DISABLE = 2; 2730 2731 version (ARM) 2732 { 2733 enum MINSIGSTKSZ = 2048; 2734 enum SIGSTKSZ = 8192; 2735 } 2736 else version (AArch64) 2737 { 2738 enum MINSIGSTKSZ = 6144; 2739 enum SIGSTKSZ = 12288; 2740 } 2741 else version (IBMZ_Any) 2742 { 2743 enum MINSIGSTKSZ = 4096; 2744 enum SIGSTKSZ = 10240; 2745 } 2746 else version (MIPS_Any) 2747 { 2748 enum MINSIGSTKSZ = 2048; 2749 enum SIGSTKSZ = 8192; 2750 } 2751 else version (PPC_Any) 2752 { 2753 enum MINSIGSTKSZ = 4096; 2754 enum SIGSTKSZ = 10240; 2755 } 2756 else version (X86_Any) 2757 { 2758 enum MINSIGSTKSZ = 2048; 2759 enum SIGSTKSZ = 8192; 2760 } 2761 else 2762 static assert(0, "unimplemented"); 2763 2764 //ucontext_t (defined in core.sys.posix.ucontext) 2765 //mcontext_t (defined in core.sys.posix.ucontext) 2766 2767 version (MIPS_Any) 2768 { 2769 struct stack_t 2770 { 2771 void* ss_sp; 2772 size_t ss_size; 2773 int ss_flags; 2774 } 2775 } 2776 else 2777 { 2778 struct stack_t 2779 { 2780 void* ss_sp; 2781 int ss_flags; 2782 size_t ss_size; 2783 } 2784 } 2785 2786 sigfn_t bsd_signal(int sig, sigfn_t func); 2787 sigfn_t sigset(int sig, sigfn_t func); 2788 2789 nothrow: 2790 @nogc: 2791 sigfn_t2 bsd_signal(int sig, sigfn_t2 func); 2792 sigfn_t2 sigset(int sig, sigfn_t2 func); 2793 2794 int killpg(pid_t, int); 2795 int sigaltstack(const scope stack_t*, stack_t*); 2796 int sighold(int); 2797 int sigignore(int); 2798 int siginterrupt(int, int); 2799 int sigpause(int); 2800 int sigrelse(int); 2801 } 2802 else version (CRuntime_UClibc) 2803 { 2804 enum SS_ONSTACK = 1; 2805 enum SS_DISABLE = 2; 2806 enum MINSIGSTKSZ = 2048; 2807 enum SIGSTKSZ = 8192; 2808 2809 version (MIPS_Any) 2810 { 2811 struct stack_t 2812 { 2813 void *ss_sp; 2814 size_t ss_size; 2815 int ss_flags; 2816 } 2817 } 2818 else 2819 { 2820 struct stack_t 2821 { 2822 void* ss_sp; 2823 int ss_flags; 2824 size_t ss_size; 2825 } 2826 } 2827 2828 struct sigstack 2829 { 2830 void* ss_sp; 2831 int ss_onstack; 2832 } 2833 2834 sigfn_t sigset(int sig, sigfn_t func); 2835 2836 nothrow: 2837 @nogc: 2838 sigfn_t2 sigset(int sig, sigfn_t2 func); 2839 2840 int killpg(pid_t, int); 2841 int sigaltstack(const scope stack_t*, stack_t*); 2842 int sighold(int); 2843 int sigignore(int); 2844 int siginterrupt(int, int); 2845 int sigpause(int); 2846 int sigrelse(int); 2847 } 2848 else 2849 { 2850 static assert(false, "Unsupported platform"); 2851 } 2852 2853 // 2854 // Realtime Signals (RTS) 2855 // 2856 /* 2857 struct sigevent 2858 { 2859 int sigev_notify; 2860 int sigev_signo; 2861 sigval sigev_value; 2862 void(*)(sigval) sigev_notify_function; 2863 pthread_attr_t* sigev_notify_attributes; 2864 } 2865 */ 2866 2867 nothrow: 2868 @nogc: 2869 2870 version (linux) 2871 { 2872 private enum __SIGEV_MAX_SIZE = 64; 2873 2874 static if ( __WORDSIZE == 64 ) 2875 { 2876 private enum __SIGEV_PAD_SIZE = ((__SIGEV_MAX_SIZE / int.sizeof) - 4); 2877 } 2878 else 2879 { 2880 private enum __SIGEV_PAD_SIZE = ((__SIGEV_MAX_SIZE / int.sizeof) - 3); 2881 } 2882 2883 struct sigevent 2884 { 2885 sigval sigev_value; 2886 int sigev_signo; 2887 int sigev_notify; 2888 2889 union 2890 { 2891 int[__SIGEV_PAD_SIZE] _pad; 2892 pid_t _tid; 2893 2894 struct 2895 { 2896 void function(sigval) sigev_notify_function; 2897 void* sigev_notify_attributes; 2898 } 2899 } 2900 } 2901 } 2902 else version (FreeBSD) 2903 { 2904 struct sigevent 2905 { 2906 int sigev_notify; 2907 int sigev_signo; 2908 sigval sigev_value; 2909 union 2910 { 2911 lwpid_t _threadid; 2912 struct 2913 { 2914 void function(sigval) sigev_notify_function; 2915 void* sigev_notify_attributes; 2916 } 2917 c_long[8] __spare__; 2918 } 2919 } 2920 } 2921 else version (NetBSD) 2922 { 2923 struct sigevent 2924 { 2925 int sigev_notify; 2926 int sigev_signo; 2927 sigval sigev_value; 2928 void function(sigval) sigev_notify_function; 2929 void /* pthread_attr_t */*sigev_notify_attributes; 2930 } 2931 } 2932 else version (OpenBSD) 2933 { 2934 // OpenBSD does not implement sigevent. 2935 alias sigevent = void; 2936 } 2937 else version (DragonFlyBSD) 2938 { 2939 union _sigev_un_t 2940 { 2941 int sigev_signo; 2942 int sigev_notify_kqueue; 2943 void /*pthread_attr_t*/ * sigev_notify_attributes; 2944 } 2945 union _sigval_t 2946 { 2947 int sival_int; 2948 void * sival_ptr; 2949 int sigval_int; 2950 void * sigval_ptr; 2951 } 2952 struct sigevent 2953 { 2954 int sigev_notify; 2955 _sigev_un_t sigev_un; 2956 _sigval_t sigev_value; 2957 void function(_sigval_t) sigev_notify_function; 2958 } 2959 } 2960 else version (Darwin) 2961 { 2962 struct sigevent 2963 { 2964 int sigev_notify; 2965 int sigev_signo; 2966 sigval sigev_value; 2967 void function(sigval) sigev_notify_function; 2968 pthread_attr_t* sigev_notify_attributes; 2969 } 2970 } 2971 else version (Solaris) 2972 { 2973 struct sigevent 2974 { 2975 int sigev_notify; 2976 int sigev_signo; 2977 sigval sigev_value; 2978 void function(sigval) sigev_notify_function; 2979 pthread_attr_t* sigev_notify_attributes; 2980 int __sigev_pad2; 2981 } 2982 } 2983 else 2984 { 2985 static assert(false, "Unsupported platform"); 2986 } 2987 2988 /* 2989 int sigqueue(pid_t, int, const sigval); 2990 int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*); 2991 int sigwaitinfo(const scope sigset_t*, siginfo_t*); 2992 */ 2993 2994 nothrow: 2995 @nogc: 2996 2997 version (CRuntime_Glibc) 2998 { 2999 int sigqueue(pid_t, int, const sigval); 3000 int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*); 3001 int sigwaitinfo(const scope sigset_t*, siginfo_t*); 3002 } 3003 else version (FreeBSD) 3004 { 3005 int sigqueue(pid_t, int, const sigval); 3006 int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*); 3007 int sigwaitinfo(const scope sigset_t*, siginfo_t*); 3008 } 3009 else version (NetBSD) 3010 { 3011 int sigqueue(pid_t, int, const sigval); 3012 int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*); 3013 int sigwaitinfo(const scope sigset_t*, siginfo_t*); 3014 } 3015 else version (OpenBSD) 3016 { 3017 } 3018 else version (DragonFlyBSD) 3019 { 3020 int sigqueue(pid_t, int, const sigval); 3021 int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*); 3022 int sigwaitinfo(const scope sigset_t*, siginfo_t*); 3023 } 3024 else version (Darwin) 3025 { 3026 } 3027 else version (Solaris) 3028 { 3029 int sigqueue(pid_t, int, const sigval); 3030 int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*); 3031 int sigwaitinfo(const scope sigset_t*, siginfo_t*); 3032 } 3033 else version (CRuntime_Bionic) 3034 { 3035 } 3036 else version (CRuntime_Musl) 3037 { 3038 int sigqueue(pid_t, int, const sigval); 3039 pragma(mangle, muslRedirTime64Mangle!("sigtimedwait", "__sigtimedwait_time64")) 3040 int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*); 3041 int sigwaitinfo(const scope sigset_t*, siginfo_t*); 3042 } 3043 else version (CRuntime_UClibc) 3044 { 3045 int sigqueue(pid_t, int, const sigval); 3046 int sigtimedwait(const scope sigset_t*, siginfo_t*, const scope timespec*); 3047 int sigwaitinfo(const scope sigset_t*, siginfo_t*); 3048 } 3049 else 3050 { 3051 static assert(false, "Unsupported platform"); 3052 } 3053 3054 // 3055 // Threads (THR) 3056 // 3057 /* 3058 int pthread_kill(pthread_t, int); 3059 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3060 */ 3061 3062 version (CRuntime_Glibc) 3063 { 3064 int pthread_kill(pthread_t, int); 3065 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3066 } 3067 else version (Darwin) 3068 { 3069 int pthread_kill(pthread_t, int); 3070 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3071 } 3072 else version (FreeBSD) 3073 { 3074 int pthread_kill(pthread_t, int); 3075 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3076 } 3077 else version (NetBSD) 3078 { 3079 int pthread_kill(pthread_t, int); 3080 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3081 } 3082 else version (OpenBSD) 3083 { 3084 int pthread_kill(pthread_t, int); 3085 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3086 } 3087 else version (DragonFlyBSD) 3088 { 3089 int pthread_kill(pthread_t, int); 3090 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3091 } 3092 else version (Solaris) 3093 { 3094 int pthread_kill(pthread_t, int); 3095 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3096 } 3097 else version (CRuntime_Bionic) 3098 { 3099 int pthread_kill(pthread_t, int); 3100 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3101 } 3102 else version (CRuntime_Musl) 3103 { 3104 int pthread_kill(pthread_t, int); 3105 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3106 } 3107 else version (CRuntime_UClibc) 3108 { 3109 int pthread_kill(pthread_t, int); 3110 int pthread_sigmask(int, const scope sigset_t*, sigset_t*); 3111 int pthread_sigqueue(pthread_t, int, sigval); 3112 } 3113 else 3114 { 3115 static assert(false, "Unsupported platform"); 3116 }