[Contents] [index] [Help] [Retrace] [browse <] [Browse >]

Exec semaphores are signal based. Using signal semaphores is the easiest
way to protect shared, single-access resources in the Amiga.  Your task
will sleep until the semaphore is available for use.  The signalsemaphore
structure is as follows:

    struct SignalSemaphore {
        struct  Node ss_Link;
        SHORT   ss_NestCount;
        struct  MinList ss_WaitQueue;
        struct  SemaphoreRequest ss_MultipleLink;
        struct  Task *ss_Owner;
        SHORT   ss_QueueCount;
    };

ss_Link
    is the node structure used to link semaphores together.  The ln_pri
    and ln_name fields are used to set the priority of the semaphore in a
    list and to name the semaphore for public access.  if a semaphore is
    not public the ln_Name and ln_Pri fields may be left NULL.

ss_NestCount
    is the count of number of locks the current owner has on the
    semaphore.

ss_WaitQueue
    is the list header for the list of other tasks waiting for this
    semaphore.

ss_MultipleLink
    is the semaphorerequest used by obtainsemaphorelist().

ss_Owner
    is the pointer to the current owning task.

ss_QueueCount
    is the number of other tasks waiting for the semaphore.

A practical application of a SignalSemaphore would be to use it as the
base of a shared data structure.  For example:

    struct SharedList {
        struct SignalSemaphore sl_Semaphore;
        struct MinList         sl_List;
    };

 creating a signalsemaphore structure 
 making a signalsemaphore available to the public 
 obtaining a signalsemaphore exclusively 
 obtaining a shared signalsemaphore 
 checking a signalsemaphore 
 releasing a signalsemaphore 
 removing a signalsemaphore structure