Jump to content

WinWaitMuxWaitSem: Difference between revisions

From EDM2
Ak120 (talk | contribs)
No edit summary
Line 1: Line 1:
=== Syntax ===
=== Syntax ===
  rc = WinWaitMuxWaitSem( ''hmuxSemaphore'',
  rc = WinWaitMuxWaitSem( ''hmuxSemaphore'',
                         ''ulTimeOut'',
                         ''ulTimeOut'',
                         ''pulUserField'' );
                         ''pulUserField'' );


=== Parameters ===
=== Parameters ===
Line 15: Line 13:
The number of milliseconds the function will wait before
The number of milliseconds the function will wait before
returning.
returning.
* Set to '''SEM_IMMEDIATE_RETURN''' (0), the function will return immediately regardless of whether or not the semaphore is posted.
* Set to '''SEM_IMMEDIATE_RETURN''' (0), the function will return immediately regardless of whether or not the semaphore is posted.
* Set to '''SEM_INDEFINITE_WAIT''' (-1), the function will block indefinitely (forever) until the semaphore is posted.
* Set to '''SEM_INDEFINITE_WAIT''' (-1), the function will block indefinitely (forever) until the semaphore is posted.
Line 21: Line 18:
'''PULONG ''pulUserField'' (output)'''
'''PULONG ''pulUserField'' (output)'''


A pointer to a ULONG that will contain the value of the user field from
A pointer to a ULONG that will contain the value of the user field from the SEMRECORD structure. If the MuxWait semaphore was created with the DCMW_WAIT_ALL flag, this will contain the user field of the last semaphore that was posted or released. If the MuxWait semaphore was created with the DCMW_WAIT_ANY flag, this will contain the user field of the semaphore that was
the SEMRECORD structure. If the MuxWait semaphore was created with the
posted or released. If the thread did not block, this will contain the user field of the last semaphore in the MuxWait list.
DCMW_WAIT_ALL flag, this will contain the user field of the last semaphore that
was posted or released. If the MuxWait semaphore was created with the
DCMW_WAIT_ANY flag, this will contain the user field of the semaphore that was
posted or released. If the thread did not block, this will contain the user
field of the last semaphore in the MuxWait list.


=== Returns ===
=== Returns ===
  APIRET rc
APIRET rc
The following values can be returned
The following values can be returned
           
{|class="wikitable"
{| border="1"
|-
|-
|0
|0
|NO_ERROR
|NO_ERROR
|Operation  
|Operation successful
successful
|-
|-
|6
|6
|ERROR_INVALID_HANDLE
|ERROR_INVALID_HANDLE
|Error, The value in ''phmuxSemaphore'' does not point to a valid  
|Error, The value in ''phmuxSemaphore'' does not point to a valid semaphore
semaphore
|-
|-
|8
|8
Line 57: Line 45:
|95
|95
|ERROR_INTERRUPT
|ERROR_INTERRUPT
|Error,  
|Error, The thread has become unblocked by an external event such as an exception
The thread has become unblocked by an external event such as an exception
|-
|-
|103
|103
Line 66: Line 53:
|105
|105
|ERROR_SEM_OWNER_DIED
|ERROR_SEM_OWNER_DIED
|Error, The owner of a mutex semaphore in the muxwait list has died  
|Error, The owner of a mutex semaphore in the muxwait list has died without freeing the semaphore
without freeing the semaphore
|-
|-
|286
|286
Line 83: Line 69:
|640
|640
|ERROR_TIMEOUT
|ERROR_TIMEOUT
|Error,  
|Error, The caller was blocked for ''ulTimeout'' milliseconds but ownership of the  
The caller was blocked for ''ulTimeout'' milliseconds but ownership of the  
semaphore could not be obtained within this time limit, Time has expired
semaphore could not be obtained within this time limit, Time has expired
|}
|}
 
=== Include Info ===
=== Include Info ===
  #define  INCL_WINMESSAGEMGR
  #define  INCL_WINMESSAGEMGR
  #include <os2.h>
  #include <os2.h>
 


=== Usage Explanation ===
=== Usage Explanation ===
WinWaitMuxWaitSem blocks until the specified muxwait semaphore clears.
WinWaitMuxWaitSem blocks until the specified muxwait semaphore clears.
MuxWait semaphores are edge triggered. This means that if a muxwait semaphore
MuxWait semaphores are edge triggered. This means that if a muxwait semaphore consists of a number of event semaphores and all have posted except for one, if one of the semaphores resets before the last hold-out posts then it will need to wait for the reset semaphore to post again.
consists of a number of event semaphores and all have posted except for one, if
one of the semaphores resets before the last hold-out posts then it will
need to wait for the reset semaphore to post again.
 
 
If the MuxWait semaphore consists of mutex semaphores and was created with the
DCMW_WAIT_ALL attribute, the process obtains ownership of all mutex semaphores
only when all semaphores have been released. If the MuxWait semaphore was
created with the DCMW_WAIT_ANY attribute, the process obtains ownership of the
first mutex semaphore to release.


If the MuxWait semaphore consists of mutex semaphores and was created with the DCMW_WAIT_ALL attribute, the process obtains ownership of all mutex semaphores only when all semaphores have been released. If the MuxWait semaphore was created with the DCMW_WAIT_ANY attribute, the process obtains ownership of the first mutex semaphore to release.


WinWaitMuxWaitSem is intended to be used in Presentation Manager
WinWaitMuxWaitSem is intended to be used in Presentation Manager applications in place of the DosWaitMuxWaitSem counterpart to avoid hanging the PM Message Queue.
applications in place of the DosWaitMuxWaitSem counterpart to
avoid hanging the PM Message Queue.
 


=== Relevant Structures ===
=== Relevant Structures ===
   
   
=== Gotchas ===
=== Gotchas ===
 
The process calling WinWaitMuxWaitSem must first obtain access to the semaphore in question or ERROR_INVALID_HANDLE will be returned.
The process calling WinWaitMuxWaitSem must first obtain access to
the semaphore in question or ERROR_INVALID_HANDLE will be returned.
If the thread to be blocked, waiting on an event semaphore, is not a PM thread,
If the thread to be blocked, waiting on an event semaphore, is not a PM thread,
[[DosWaitMuxWaitSem]] should be used instead
[[DosWaitMuxWaitSem]] should be used instead of WinWaitMuxWaitSem.
of WinWaitMuxWaitSem.
 


=== Sample Code ===
=== Sample Code ===
Line 149: Line 116:
}
}
</pre>  
</pre>  
=== See Also ===
=== See Also ===
[[OS2 API:CPI:DosAddMuxWaitSem|DosAddMuxWaitSem]],
[[OS2 API:CPI:DosAddMuxWaitSem|DosAddMuxWaitSem]],

Revision as of 22:36, 19 July 2016

Syntax

rc = WinWaitMuxWaitSem( hmuxSemaphore,
                        ulTimeOut,
                        pulUserField );

Parameters

HEV hevSemaphore (input)

The handle of the semaphore to block on.

ULONG ulTimeout (input)

The number of milliseconds the function will wait before returning.

  • Set to SEM_IMMEDIATE_RETURN (0), the function will return immediately regardless of whether or not the semaphore is posted.
  • Set to SEM_INDEFINITE_WAIT (-1), the function will block indefinitely (forever) until the semaphore is posted.

PULONG pulUserField (output)

A pointer to a ULONG that will contain the value of the user field from the SEMRECORD structure. If the MuxWait semaphore was created with the DCMW_WAIT_ALL flag, this will contain the user field of the last semaphore that was posted or released. If the MuxWait semaphore was created with the DCMW_WAIT_ANY flag, this will contain the user field of the semaphore that was posted or released. If the thread did not block, this will contain the user field of the last semaphore in the MuxWait list.

Returns

APIRET rc

The following values can be returned

0 NO_ERROR Operation successful
6 ERROR_INVALID_HANDLE Error, The value in phmuxSemaphore does not point to a valid semaphore
8 ERROR_NOT_ENOUGH_MEMORY Error, The system memory limit has been exceeded
87 ERROR_INVALID_PARAMETER Error, One or more parameters is not recognized, See parameters above,

Both pszSemaphoreName and phmuxSemaphore may be NULL

95 ERROR_INTERRUPT Error, The thread has become unblocked by an external event such as an exception
103 ERROR_TOO_MANY_SEM_REQUESTS Error
105 ERROR_SEM_OWNER_DIED Error, The owner of a mutex semaphore in the muxwait list has died without freeing the semaphore
286 ERROR_EMPTY_MUXWAIT Error, The MuxWait semaphore hmuxSemaphore is empty
287 ERROR_MUTEX_OWNED Error, A mutex semaphore in the muxwait list is currently owned
292 ERROR_WRONG_TYPE Error
640 ERROR_TIMEOUT Error, The caller was blocked for ulTimeout milliseconds but ownership of the

semaphore could not be obtained within this time limit, Time has expired

Include Info

#define  INCL_WINMESSAGEMGR
#include <os2.h>

Usage Explanation

WinWaitMuxWaitSem blocks until the specified muxwait semaphore clears. MuxWait semaphores are edge triggered. This means that if a muxwait semaphore consists of a number of event semaphores and all have posted except for one, if one of the semaphores resets before the last hold-out posts then it will need to wait for the reset semaphore to post again.

If the MuxWait semaphore consists of mutex semaphores and was created with the DCMW_WAIT_ALL attribute, the process obtains ownership of all mutex semaphores only when all semaphores have been released. If the MuxWait semaphore was created with the DCMW_WAIT_ANY attribute, the process obtains ownership of the first mutex semaphore to release.

WinWaitMuxWaitSem is intended to be used in Presentation Manager applications in place of the DosWaitMuxWaitSem counterpart to avoid hanging the PM Message Queue.

Relevant Structures

Gotchas

The process calling WinWaitMuxWaitSem must first obtain access to the semaphore in question or ERROR_INVALID_HANDLE will be returned. If the thread to be blocked, waiting on an event semaphore, is not a PM thread, DosWaitMuxWaitSem should be used instead of WinWaitMuxWaitSem.

Sample Code

 
#define INCL_WINMESSAGEMGR
#include 

HMUX  hmuxMySemaphore;     /* MySemaphore handle */
ULONG TimeOut= -1;         /* the number of milliseconds the */
                           /* the caller will block for the sem */
                           /* this example will block forever */
ULONG ulUserField;         /* to be filled with useful info */
APIRET rc;                 /* return code */

	/* access is gained to the semaphore in question */
	/* either by DosCreateEventSem ... */
	/* ... or by DosOpenEventSem */
	/* its handle is placed in hevMySemaphore */

	rc = WinWaitMuxWaitSem(hevMySemaphore, TimeOut,&ulUserField);

	if (rc != 0)
	{
	  /* We got an error to take care of. */
	}

See Also

DosAddMuxWaitSem, DosCloseMuxWaitSem, DosCreateMuxWaitSem, DosDeleteMuxWaitSem, DosOpenMuxWaitSem, DosQueryMuxWaitSem, DosWaitMuxWaitSem