[← Home](../README.md) · [Exec Kernel](README.md) # Signals — AllocSignal, SetSignal, Wait ## Overview Signals are the lightest AmigaOS synchronization primitive. Each task has 32 signal bits (`tc_SigAlloc`). A task blocks on `Wait(mask)` until any of the specified bits are set by another task or interrupt handler calling `Signal()`. --- ## Signal Bit Constants ```c /* exec/tasks.h — NDK39 */ /* Bits 0–15: application-allocated via AllocSignal() */ /* Bits 16–31: reserved by exec */ #define SIGB_ABORT 0 /* bit 0: break signal */ #define SIGB_CHILD 1 /* bit 1: child task signal */ #define SIGB_BLIT 4 /* bit 4: blitter done (exec internal) */ #define SIGB_SINGLE 4 /* alias */ #define SIGB_INTUITION 5 /* bit 5: Intuition events (exec internal) */ #define SIGB_DOS 8 /* bit 8: DOS signal */ /* Workbench/DOS break signals (bits 12–15): */ #define SIGBREAKB_CTRL_C 12 #define SIGBREAKB_CTRL_D 13 #define SIGBREAKB_CTRL_E 14 #define SIGBREAKB_CTRL_F 15 #define SIGBREAKF_CTRL_C (1L<mp_SigBit); ULONG waitMask = portSig | SIGBREAKF_CTRL_C; BOOL running = TRUE; while (running) { ULONG sigs = Wait(waitMask); if (sigs & SIGBREAKF_CTRL_C) { running = FALSE; } if (sigs & portSig) { struct Message *msg; while ((msg = GetMsg(port)) != NULL) { /* handle message */ ReplyMsg(msg); } } } DeleteMsgPort(port); ``` --- ## References - NDK39: `exec/tasks.h`, `exec/execbase.h` - ADCD 2.1: `AllocSignal`, `FreeSignal`, `Signal`, `Wait`, `SetSignal` - `06_exec_os/tasks_processes.md` — tc_SigAlloc, tc_SigRecvd fields - *Amiga ROM Kernel Reference Manual: Exec* — signals chapter