| 1 | /*-----------------------------------------------------------------------------
|
|---|
| 2 | mbx.h -- Synchronization of mailbox access
|
|---|
| 3 |
|
|---|
| 4 | Copyright (c) 1995 JANZ Computer AG
|
|---|
| 5 | All Rights Reserved
|
|---|
| 6 |
|
|---|
| 7 | Created 96/01/23 by Stefan Althoefer
|
|---|
| 8 | Version 1.4 of 96/07/26
|
|---|
| 9 |
|
|---|
| 10 | Two processes -- local and peer -- communicate via mailboxes.
|
|---|
| 11 | There are two mailboxes for each direction. Thus there are four
|
|---|
| 12 | mailboxes altogether referred to by indexes 0,1,2,3.
|
|---|
| 13 |
|
|---|
| 14 | To synchronize read-write access to the mailboxes two synchronization
|
|---|
| 15 | bytes are used. These bytes are located in shared memory readable by
|
|---|
| 16 | both processes. One byte is owned by the local process the other by
|
|---|
| 17 | the (remote) peer process. Only the owner of a synchronization byte
|
|---|
| 18 | may write it.
|
|---|
| 19 |
|
|---|
| 20 | There are two functions for the local process to manipulate the
|
|---|
| 21 | synchronization bytes: msync_get() and msync_unget().
|
|---|
| 22 | With msync_get(1) (resp. msync_get(0)) the local process requests a
|
|---|
| 23 | mailbox for writing (resp. reading). The index "index" of the next box
|
|---|
| 24 | ready for writing (resp. for reading) is returned. The value -1 is
|
|---|
| 25 | returned if there is no such box. After using the box the local process
|
|---|
| 26 | calls msync_unget(writing, index) making the box available to the peer.
|
|---|
| 27 |
|
|---|
| 28 | The functions are declared static. This file is meant to included in
|
|---|
| 29 | the file where reading and writing mailboxes is done.
|
|---|
| 30 | It is necessary to designate the send (write) direction as either
|
|---|
| 31 | up or down by #defining MSYNC_UP in the local process and MSYNC_DOWN
|
|---|
| 32 | in the peer process (or vice versa).
|
|---|
| 33 | The addresses of the synchronization bytes must be specified
|
|---|
| 34 | with MSYNC_LOCL_ADDR or MSYNC_PEER_ADDR.
|
|---|
| 35 |
|
|---|
| 36 | -----------------------------------------------------------------------------*/
|
|---|
| 37 |
|
|---|
| 38 | #ifndef mbx_DEFINED
|
|---|
| 39 | #define mbx_DEFINED
|
|---|
| 40 |
|
|---|
| 41 | #define far
|
|---|
| 42 |
|
|---|
| 43 | /* Function prototypes by default */
|
|---|
| 44 | #ifdef __STDC__
|
|---|
| 45 | #define _PARAMS(args) args
|
|---|
| 46 | #else
|
|---|
| 47 | #define _PARAMS(args) ()
|
|---|
| 48 | #endif
|
|---|
| 49 |
|
|---|
| 50 | /* Mailbox access macros */
|
|---|
| 51 | #define mbx_get(i) ((unsigned char *)(MBX_BASE+(i+1) * MBX_LENGTH))
|
|---|
| 52 |
|
|---|
| 53 | /* Values for parameter "writing" in msync_*() */
|
|---|
| 54 | #define MBX_WRITING 1
|
|---|
| 55 | #define MBX_READING 0
|
|---|
| 56 |
|
|---|
| 57 | #define MSYNC_SHIFT(w) ((w) ? 4 : 0)
|
|---|
| 58 |
|
|---|
| 59 | /* Address of local synchronization byte */
|
|---|
| 60 | #ifdef MSYNC_LOCL_ADDR
|
|---|
| 61 | #define MSYNC_LOCL (MSYNC_LOCL_ADDR)
|
|---|
| 62 | #endif
|
|---|
| 63 |
|
|---|
| 64 | /* Address of peer synchronization byte */
|
|---|
| 65 | #ifdef MSYNC_PEER_ADDR
|
|---|
| 66 | #define MSYNC_PEER (MSYNC_PEER_ADDR)
|
|---|
| 67 | #endif
|
|---|
| 68 |
|
|---|
| 69 | #endif /* mbx_DEFINED */
|
|---|