Home | History | Annotate | Download | only in inc
      1 /*
      2  * dspbridge/mpu_api/inc/sync.h
      3  *
      4  * DSP-BIOS Bridge driver support functions for TI OMAP processors.
      5  *
      6  * Copyright (C) 2007 Texas Instruments, Inc.
      7  *
      8  * This program is free software; you can redistribute it and/or modify it
      9  * under the terms of the GNU Lesser General Public License as published
     10  * by the Free Software Foundation version 2.1 of the License.
     11  *
     12  * This program is distributed .as is. WITHOUT ANY WARRANTY of any kind,
     13  * whether express or implied; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15  * Lesser General Public License for more details.
     16  */
     17 
     18 /*
     19  *  ======== sync.h ========
     20  *  Purpose:
     21  *      Provide synchronization services.
     22  *
     23  *  Public Functions:
     24  *      SYNC_CloseEvent
     25  *      SYNC_DeleteCS
     26  *      SYNC_EnterCS
     27  *      SYNC_Exit
     28  *      SYNC_Init
     29  *      SYNC_InitializeCS
     30  *      SYNC_LeaveCS
     31  *      SYNC_OpenEvent
     32  *      SYNC_PostMessage
     33  *      SYNC_ResetEvent
     34  *      SYNC_SetEvent
     35  *      SYNC_WaitOnEvent
     36  *      SYNC_WaitOnMultipleEvents
     37  *
     38  *! Revision History:
     39  *! ================
     40  *! 05-Oct-2000 jeh Added SYNC_WaitOnMultipleEvents().
     41  *! 01-Dec-1999 ag: Added #define SYNC_MAXNAMELENGTH.
     42  *! 04-Nov-1999 kc: Added critical section functions and objects to SYNC.
     43  *! 29-Oct-1999 kc: Cleaned up for code review.
     44  *! 24-Sep-1999 kc: Added WinCE notes.
     45  *! 20-Oct-1997 gp: Removed unused SYNC_ critical section and must complete fxns
     46  *!                 Added SYNC_HOBJECT, SYNC_ATTRS, and object validation, and
     47  *!                 merged SYNC_DestroyEvent into SYNC_CloseEvent, and merged
     48  *!                 SYNC_CreateEvent into SYNC_OpenEvent.
     49  *! 07-Oct-1997 gp: Added SYNC_Create/DestroyEvent (for NT testing).
     50  *! 06-Oct-1997 gp: Added SYNC_OpenEvent.
     51  *! 03-Jun-1997 gp: Added SYNC_{Begin|End}CritSection() functions.
     52  *! 03-Jan-1997 gp: Added SYNC_INFINITE define.
     53  *! 05-Aug-1996 gp: Created.
     54  */
     55 
     56 #ifndef _SYNC_H
     57 #define _SYNC_H
     58 
     59 #ifdef __cplusplus
     60 extern "C" {
     61 #endif
     62 
     63 #include <dspapi.h>
     64 
     65 /* Special timeout value indicating an infinite wait: */
     66 #define SYNC_INFINITE  0xffffffff
     67 
     68 /* Maximum string length of a named event */
     69 #define SYNC_MAXNAMELENGTH 32
     70 
     71 /* Generic SYNC object: */
     72 	struct SYNC_OBJECT;
     73 	/*typedef struct SYNC_OBJECT *SYNC_HOBJECT;*/
     74 
     75 /* Generic SYNC CS object: */
     76 	struct SYNC_CSOBJECT;
     77 	/*typedef struct SYNC_CSOBJECT *SYNC_HCSOBJECT;*/
     78 
     79 /* Used SYNC_CSOBJECT instead of SYNC_DPCCSOBJECT to avoid warnings */
     80 	/*typedef struct SYNC_CSOBJECT *SYNC_HDPCCSOBJECT;*/
     81 
     82 /* SYNC object attributes: */
     83 	struct SYNC_ATTRS {
     84 		HANDLE hUserEvent;	/* Platform's User Mode synch. object.      */
     85 		HANDLE hKernelEvent;	/* Platform's Kernel Mode sync. object.     */
     86 		DWORD dwReserved1;	/* For future expansion.                    */
     87 		DWORD dwReserved2;	/* For future expansion.                    */
     88 	} ;
     89 
     90 /*
     91  *  ======== SYNC_CloseEvent ========
     92  *  Purpose:
     93  *      Close this event handle, freeing resources allocated in SYNC_OpenEvent
     94  *      if necessary.
     95  *  Parameters:
     96  *      hEvent: Handle to a synchronization event, created/opened in
     97  *              SYNC_OpenEvent.
     98  *  Returns:
     99  *      DSP_SOK:        Success;
    100  *      DSP_EFAIL:      Failed to close event handle.
    101  *      DSP_EHANDLE:    Invalid handle.
    102  *  Requires:
    103  *      SYNC initialized.
    104  *  Ensures:
    105  *      Any subsequent usage of hEvent would be invalid.
    106  */
    107 	extern DSP_STATUS SYNC_CloseEvent(IN struct SYNC_OBJECT* hEvent);
    108 
    109 /*
    110  *  ======== SYNC_DeleteCS ========
    111  *  Purpose:
    112  *      Delete a critical section.
    113  *  Parameters:
    114  *      hCSObj: critical section handle.
    115  *  Returns:
    116  *      DSP_SOK:        Success.
    117  *      DSP_EHANDLE:    Invalid handle.
    118  *  Requires:
    119  *  Ensures:
    120  */
    121 	extern DSP_STATUS SYNC_DeleteCS(IN struct SYNC_CSOBJECT* hCSObj);
    122 
    123 /*
    124  *  ======== SYNC_EnterCS ========
    125  *  Purpose:
    126  *      Enter the critical section.
    127  *  Parameters:
    128  *      hCSObj: critical section handle.
    129  *  Returns:
    130  *      DSP_SOK:        Success.
    131  *      DSP_EHANDLE:    Invalid handle.
    132  *  Requires:
    133  *  Ensures:
    134  */
    135 	extern DSP_STATUS SYNC_EnterCS(IN struct SYNC_CSOBJECT* hCSObj);
    136 
    137 /*
    138  *  ======== SYNC_Exit ========
    139  *  Purpose:
    140  *      Discontinue usage of module; free resources when reference count
    141  *      reaches 0.
    142  *  Parameters:
    143  *  Returns:
    144  *  Requires:
    145  *      SYNC initialized.
    146  *  Ensures:
    147  *      Resources used by module are freed when cRef reaches zero.
    148  */
    149 	extern VOID SYNC_Exit();
    150 
    151 /*
    152  *  ======== SYNC_Init ========
    153  *  Purpose:
    154  *      Initializes private state of SYNC module.
    155  *  Parameters:
    156  *  Returns:
    157  *      TRUE if initialized; FALSE if error occured.
    158  *  Requires:
    159  *  Ensures:
    160  *      SYNC initialized.
    161  */
    162 	extern bool SYNC_Init();
    163 
    164 /*
    165  *  ======== SYNC_InitializeCS ========
    166  *  Purpose:
    167  *      Initialize the critical section.
    168  *  Parameters:
    169  *      hCSObj: critical section handle.
    170  *  Returns:
    171  *      DSP_SOK:        Success.
    172  *      DSP_EMEMORY:    Out of memory.
    173  *  Requires:
    174  *  Ensures:
    175  */
    176 	extern DSP_STATUS SYNC_InitializeCS(OUT struct SYNC_CSOBJECT* * phCSObj);
    177 
    178 /*
    179  *  ======== SYNC_InitializeDPCCS ========
    180  *  Purpose:
    181  *      Initialize the critical section between process context and DPC.
    182  *  Parameters:
    183  *      hCSObj: critical section handle.
    184  *  Returns:
    185  *      DSP_SOK:        Success.
    186  *      DSP_EMEMORY:    Out of memory.
    187  *  Requires:
    188  *  Ensures:
    189  */
    190 	extern DSP_STATUS SYNC_InitializeDPCCS(OUT struct SYNC_CSOBJECT** phCSObj);
    191 
    192 /*
    193  *  ======== SYNC_LeaveCS ========
    194  *  Purpose:
    195  *      Leave the critical section.
    196  *  Parameters:
    197  *      hCSObj: critical section handle.
    198  *  Returns:
    199  *      DSP_SOK:        Success.
    200  *      DSP_EHANDLE:    Invalid handle.
    201  *  Requires:
    202  *  Ensures:
    203  */
    204 	extern DSP_STATUS SYNC_LeaveCS(IN struct SYNC_CSOBJECT* hCSObj);
    205 
    206 /*
    207  *  ======== SYNC_OpenEvent ========
    208  *  Purpose:
    209  *      Create/open and initialize an event object for thread synchronization,
    210  *      which is initially in the non-signalled state.
    211  *  Parameters:
    212  *      phEvent:    Pointer to location to receive the event object handle.
    213  *      pAttrs:     Pointer to SYNC_ATTRS object containing initial SYNC
    214  *                  SYNC_OBJECT attributes.  If this pointer is NULL, then
    215  *                  SYNC_OpenEvent will create and manage an OS specific
    216  *                  syncronization object.
    217  *          pAttrs->hUserEvent:  Platform's User Mode synchronization object.
    218  *
    219  *      The behaviour of the SYNC methods depend on the value of
    220  *      the hUserEvent attr:
    221  *
    222  *      1. (hUserEvent == NULL):
    223  *          A user mode event is created.
    224  *      2. (hUserEvent != NULL):
    225  *          A user mode event is supplied by the caller of SYNC_OpenEvent().
    226  *  Returns:
    227  *      DSP_SOK:        Success.
    228  *      DSP_EFAIL:      Unable to create user mode event.
    229  *      DSP_EMEMORY:    Insufficient memory.
    230  *      DSP_EINVALIDARG SYNC_ATTRS values are invalid.
    231  *  Requires:
    232  *      - SYNC initialized.
    233  *      - phEvent != NULL.
    234  *  Ensures:
    235  *      If function succeeded, pEvent->hEvent must be a valid event handle.
    236  */
    237 	extern DSP_STATUS SYNC_OpenEvent(OUT struct SYNC_OBJECT* * phEvent,
    238 					 IN OPTIONAL struct SYNC_ATTRS * pAttrs);
    239 
    240 /*
    241  * ========= SYNC_PostMessage ========
    242  *  Purpose:
    243  *      To post a windows message
    244  *  Parameters:
    245  *      hWindow:    Handle to the window
    246  *      uMsg:       Message to be posted
    247  *  Returns:
    248  *      DSP_SOK:        Success
    249  *      DSP_EFAIL:      Post message failed
    250  *      DSP_EHANDLE:    Invalid Window handle
    251  *  Requires:
    252  *      SYNC initialized
    253  *  Ensures
    254  */
    255 	extern DSP_STATUS SYNC_PostMessage(IN HANDLE hWindow, IN UINT uMsg);
    256 
    257 /*
    258  *  ======== SYNC_ResetEvent ========
    259  *  Purpose:
    260  *      Reset a syncronization event object state to non-signalled.
    261  *  Parameters:
    262  *      hEvent:         Handle to a sync event.
    263  *  Returns:
    264  *      DSP_SOK:        Success;
    265  *      DSP_EFAIL:      Failed to reset event.
    266  *      DSP_EHANDLE:    Invalid handle.
    267  *  Requires:
    268  *      SYNC initialized.
    269  *  Ensures:
    270  */
    271 	extern DSP_STATUS SYNC_ResetEvent(IN struct SYNC_OBJECT* hEvent);
    272 
    273 /*
    274  *  ======== SYNC_SetEvent ========
    275  *  Purpose:
    276  *      Signal the event.  Will unblock one waiting thread.
    277  *  Parameters:
    278  *      hEvent:         Handle to an event object.
    279  *  Returns:
    280  *      DSP_SOK:        Success.
    281  *      DSP_EFAIL:      Failed to signal event.
    282  *      DSP_EHANDLE:    Invalid handle.
    283  *  Requires:
    284  *      SYNC initialized.
    285  *  Ensures:
    286  */
    287 	extern DSP_STATUS SYNC_SetEvent(IN struct SYNC_OBJECT* hEvent);
    288 
    289 /*
    290  *  ======== SYNC_WaitOnEvent ========
    291  *  Purpose:
    292  *      Wait for an event to be signalled, up to the specified timeout.
    293  *  Parameters:
    294  *      hEvent:         Handle to an event object.
    295  *      dwTimeOut:      The time-out interval, in milliseconds.
    296  *                      The function returns if the interval elapses, even if
    297  *                      the object's state is nonsignaled.
    298  *                      If zero, the function tests the object's state and
    299  *                      returns immediately.
    300  *                      If SYNC_INFINITE, the function's time-out interval
    301  *                      never elapses.
    302  *  Returns:
    303  *      DSP_SOK:        The object was signalled.
    304  *      DSP_EHANDLE:    Invalid handle.
    305  *      SYNC_E_FAIL:    Wait failed, possibly because the process terminated.
    306  *      SYNC_E_TIMEOUT: Timeout expired while waiting for event to be signalled.
    307  *  Requires:
    308  *  Ensures:
    309  */
    310 	extern DSP_STATUS SYNC_WaitOnEvent(IN struct SYNC_OBJECT* hEvent,
    311 					   IN DWORD dwTimeOut);
    312 
    313 /*
    314  *  ======== SYNC_WaitOnMultipleEvents ========
    315  *  Purpose:
    316  *      Wait for any of an array of events to be signalled, up to the
    317  *      specified timeout.
    318  *      Note: dwTimeOut must be SYNC_INFINITE to signal infinite wait.
    319  *  Parameters:
    320  *      hSyncEvents:    Array of handles to event objects.
    321  *      uCount:         Number of event handles.
    322  *      dwTimeOut:      The time-out interval, in milliseconds.
    323  *                      The function returns if the interval elapses, even if
    324  *                      no event is signalled.
    325  *                      If zero, the function tests the object's state and
    326  *                      returns immediately.
    327  *                      If SYNC_INFINITE, the function's time-out interval
    328  *                      never elapses.
    329  *      puIndex:        Location to store index of event that was signalled.
    330  *  Returns:
    331  *      DSP_SOK:        The object was signalled.
    332  *      SYNC_E_FAIL:    Wait failed, possibly because the process terminated.
    333  *      SYNC_E_TIMEOUT: Timeout expired before event was signalled.
    334  *      DSP_EMEMORY:    Memory allocation failed.
    335  *  Requires:
    336  *  Ensures:
    337  */
    338 	extern DSP_STATUS SYNC_WaitOnMultipleEvents(IN struct SYNC_OBJECT**
    339 						    hSyncEvents, IN UINT uCount,
    340 						    IN DWORD dwTimeout,
    341 						    OUT UINT * puIndex);
    342 
    343 
    344 #ifdef __cplusplus
    345 }
    346 #endif
    347 #endif				/* _SYNC_H */
    348