type
    MsgPort_t = unknown 34,
    MinNode_t = unknown 8,
    Node_t = unknown 14,

    Semaphore_t = struct {
	MsgPort_t sm_MsgPort;
	uint sm_Bids;
    },

    SemaphoreRequest_t = struct {
	MinNode_t sr_Link;
	*Task_t sr_Waiter;
    },

    SignalSemaphore_t = struct {
	Node_t ss_Link;
	uint ss_NestCount;
	MinList_t ss_WaitQueue;
	SemaphoreRequest_t ss_MultipleLink;
	*Task_t ss_Owner;
	uint ss_QueueCount;
    };

extern
    AddSemaphore(*SignalSemaphore_t ss)void,
    AttemptSemaphore(*SignalSemaphore_t ss)bool,
    FindSemaphore(*char name)*SignalSemaphore_t,
    InitSemaphore(*SignalSemaphore_t ss)void,
    ObtainSemaphore(*SignalSemaphore_t ss)void,
    ObtainSemaphoreList(*SignalSemaphore_t ss)void,
    Procure(*Semaphore_t sm; *Message_t bidMessage)bool,
    ReleaseSemaphore(*SignalSemaphore_t ss)void,
    ReleaseSemaphoreList(*SignalSemaphore_t ss)void,
    RemSemaphore(*SignalSemaphore_t ss)void,
    Vacate(*Semaphore_t sm)void;
