Jump to content

DosCloseQueue: Difference between revisions

From EDM2
Ak120 (talk | contribs)
 
(4 intermediate revisions by the same user not shown)
Line 1: Line 1:
==Description==
Ends access to a queue, or deletes a queue.
Ends access to a queue, or deletes a queue.


==Syntax==
==Syntax==
<PRE>
DosCloseQueue (hq)
#define INCL_DOSQUEUES
#include <os2.h>


HQUEUE    hq;    /*  The handle of the queue to be closed. */
APIRET    ulrc;  /*  Return Code. */
ulrc = DosCloseQueue(hq);
</PRE>
==Parameters==
==Parameters==
; hq (HQUEUE) - input : The handle of the queue to be closed.
;hq (HQUEUE) - input : The handle of the queue to be closed.
 
:This is the handle received from a previous call to [[DosCreateQueue]] or [[DosOpenQueue]].
This is the handle received from a previous call to DosCreateQueue or DosOpenQueue.
==Return Code==
ulrc (APIRET) - returns
 
DosCloseQueue returns one of the following values:


* 0     NO_ERROR  
;ulrc (APIRET) - returns:Return Code.
* 337   ERROR_QUE_INVALID_HANDLE  
:DosCloseQueue returns one of the following values:
*0 NO_ERROR
*337 ERROR_QUE_INVALID_HANDLE


==Remarks==
==Remarks==
Line 30: Line 18:
For the owner, any outstanding elements are deleted. Other processes that have the queue open will receive the ERROR_QUE_INVALID_HANDLE return code on their next request.
For the owner, any outstanding elements are deleted. Other processes that have the queue open will receive the ERROR_QUE_INVALID_HANDLE return code on their next request.


For a writer of the queue, access to the queue is ended, but the queue elements are not deleted.  
For a writer of the queue, access to the queue is ended, but the queue elements are not deleted.


==Example Code==
==Example Code==
This example creates and opens a queue named "SPECIAL.QUE", writes to it, reads from it, and finally closes it.
{{OS2API Example Queue}}
 
<PRE>
#define INCL_DOSQUEUES  /* DOS Queue values */
#define INCL_DOSPROCESS  /* DOS thread and process values */
#define INCL_DOSERRORS  /* DOS error values */
#include <os2.h>
#include <stdio.h>
#include <string.h>
 
int main(VOID) {
 
  PSZ        szQueueName  = "\\QUEUES\\SPECIAL.QUE";
  HQUEUE      hqSpecialQue = NULLHANDLE; /* Queue handle                  */
  PSZ        DataBuffer  = "";        /* Data buffer for queue data    */
  REQUESTDATA Request      = {0};        /* Reques */
  PID        pidOwner    = 0;
  ULONG      ulDataLen    = 0;          /* Length of data returned        */
  BYTE        ElemPrty    = 0;          /* Priority of element (returned) */
  APIRET      rc          = NO_ERROR;  /* Return code                    */


  rc = DosCreateQueue(&hqSpecialQue,    /* Queue handle                    */
            QUE_FIFO |                  /* First-In First-Out order        */
            QUE_CONVERT_ADDRESS,        /* Convert 16-bit addresses to 32  */
            szQueueName);              /* Name of the queue to create    */
  if (rc!= NO_ERROR) {
      printf ("DosCreateQueue error: return code = %u\n", rc);
      return 1;
  }
  rc = DosOpenQueue (&pidOwner,        /* PID of queue owner              */
                      &hqSpecialQue,    /* Handle for created queue        */
                      szQueueName);      /* Name of the queue to open      */
  if (rc!= NO_ERROR) {
      printf ("DosOpenQueue error: return code = %u\n", rc);
      return 1;
  }
  DataBuffer = "To be, or not to be.  That is the question...";
  rc = DosWriteQueue (hqSpecialQue,        /* Queue to write to          */
                      12345L,              /* Request data                */
                      strlen(DataBuffer),  /* Length of data to write    */
                      DataBuffer,          /* Pointer to data            */
                      0L);              /* Priority (not applicable here) */
  if (rc!= NO_ERROR) {
      printf ("DosWriteQueue error: return code = %u\n", rc);
      return 1;
  }
  DataBuffer = "";                  /* Clear the DataBuffer */
  Request.pid = pidOwner;          /* process ID for the DosReadQueue */
  rc = DosReadQueue (hqSpecialQue,          /* Queue to read from          */
                      &Request,              /* Request data from write    */
                      &ulDataLen,            /* Length of data returned    */
                      (PVOID) &DataBuffer,  /* The data                    */
                      0L,                    /* Remove first element        */
                      DCWW_WAIT,            /* Wait for available data    */
                      &ElemPrty,            /* Priority of data (returned) */
                      0L);            /* Semaphore to use when not waiting */
  if (rc!= NO_ERROR) {
      printf ("DosReadQueue error: return code = %u\n", rc);
      return 1;
  } else {
      printf ("DosReadQueue returns: '%s'\n", DataBuffer);
      printf ("      (Request data = %u)\n", Request.ulData);
  }
  rc = DosCloseQueue(hqSpecialQue);        /* Close the queue */
  if (rc!= NO_ERROR) {
      printf ("DosCloseQueue error: return code = %u\n", rc);
      return 1;
  }
  return NO_ERROR;
}
</PRE>
==Related Functions==
==Related Functions==
* [[OS2 API:CPI:DosCreateQueue|DosCreateQueue]]
* [[DosCreateQueue]]
* [[OS2 API:CPI:DosOpenQueue|DosOpenQueue]]
* [[DosOpenQueue]]
* [[OS2 API:CPI:DosPeekQueue|DosPeekQueue]]
* [[DosPeekQueue]]
* [[OS2 API:CPI:DosPurgeQueue|DosPurgeQueue]]
* [[DosPurgeQueue]]
* [[OS2 API:CPI:DosQueryQueue|DosQueryQueue]]
* [[DosQueryQueue]]
* [[OS2 API:CPI:DosReadQueue|DosReadQueue]]
* [[DosReadQueue]]
* [[OS2 API:CPI:DosWriteQueue|DosWriteQueue]]
* [[DosWriteQueue]]
 


[[Category:The OS/2 API Project]]
[[Category:Dos]]

Latest revision as of 01:46, 13 December 2019

Ends access to a queue, or deletes a queue.

Syntax

DosCloseQueue (hq)

Parameters

hq (HQUEUE) - input
The handle of the queue to be closed.
This is the handle received from a previous call to DosCreateQueue or DosOpenQueue.
ulrc (APIRET) - returns
Return Code.
DosCloseQueue returns one of the following values:
  • 0 NO_ERROR
  • 337 ERROR_QUE_INVALID_HANDLE

Remarks

DosCloseQueue ends further processing of a queue by the requesting process. The action taken depends on whether the requester is the owner of the queue or a writer of the queue.

For the owner, any outstanding elements are deleted. Other processes that have the queue open will receive the ERROR_QUE_INVALID_HANDLE return code on their next request.

For a writer of the queue, access to the queue is ended, but the queue elements are not deleted.

Example Code

This example creates and opens a queue named "SPECIAL.QUE", writes to it, reads from it, and finally closes it.

#define INCL_DOSQUEUES   /* DOS Queue values */
#define INCL_DOSPROCESS  /* DOS thread and process values */
#define INCL_DOSERRORS   /* DOS error values */
#include <os2.h>
#include <stdio.h>
#include <string.h>

int main(VOID) {

   PSZ         szQueueName  = "\\QUEUES\\SPECIAL.QUE";
   HQUEUE      hqSpecialQue = NULLHANDLE; /* Queue handle                   */
   PSZ         DataBuffer   = "";         /* Data buffer for queue data     */
   REQUESTDATA Request      = {0};        /* Reques */
   PID         pidOwner     = 0;
   ULONG       ulDataLen    = 0;          /* Length of data returned        */
   BYTE        ElemPrty     = 0;          /* Priority of element (returned) */
   APIRET      rc           = NO_ERROR;   /* Return code                    */

   rc = DosCreateQueue(&hqSpecialQue,    /* Queue handle                    */
             QUE_FIFO |                  /* First-In First-Out order        */
             QUE_CONVERT_ADDRESS,        /* Convert 16-bit addresses to 32  */
             szQueueName);               /* Name of the queue to create     */
   if (rc!= NO_ERROR) {
      printf ("DosCreateQueue error: return code = %u\n", rc);
      return 1;
   }

   rc = DosOpenQueue (&pidOwner,         /* PID of queue owner              */
                      &hqSpecialQue,     /* Handle for created queue        */
                      szQueueName);      /* Name of the queue to open       */
   if (rc!= NO_ERROR) {
      printf ("DosOpenQueue error: return code = %u\n", rc);
      return 1;
   }

   DataBuffer = "To be, or not to be.  That is the question...";
   rc = DosWriteQueue (hqSpecialQue,        /* Queue to write to           */
                       12345L,              /* Request data                */
                       strlen(DataBuffer),  /* Length of data to write     */
                       DataBuffer,          /* Pointer to data             */
                       0L);              /* Priority (not applicable here) */
   if (rc!= NO_ERROR) {
      printf ("DosWriteQueue error: return code = %u\n", rc);
      return 1;
   }

   DataBuffer = "";                  /* Clear the DataBuffer */
   Request.pid = pidOwner;           /* process ID for the DosReadQueue */
   rc = DosReadQueue (hqSpecialQue,          /* Queue to read from          */
                      &Request,              /* Request data from write     */
                      &ulDataLen,            /* Length of data returned     */
                      (PVOID) &DataBuffer,   /* The data                    */
                      0L,                    /* Remove first element        */
                      DCWW_WAIT,             /* Wait for available data     */
                      &ElemPrty,             /* Priority of data (returned) */
                      0L);             /* Semaphore to use when not waiting */

   if (rc!= NO_ERROR) {
      printf ("DosReadQueue error: return code = %u\n", rc);
      return 1;
   } else {
      printf ("DosReadQueue returns: '%s'\n", DataBuffer);
      printf ("      (Request data = %u)\n", Request.ulData);
   }

   rc = DosCloseQueue(hqSpecialQue);         /* Close the queue */
   if (rc!= NO_ERROR) {
      printf ("DosCloseQueue error: return code = %u\n", rc);
      return 1;
   }

   return NO_ERROR;
}

Related Functions