DosCancelLockRequestL

From EDM2
Revision as of 00:40, 15 September 2017 by Ak120 (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

DosCancelLockRequestL cancels an outstanding DosSetFileLocksL request.

Syntax

DosCancelLockRequestL (hFile, pflLock)

Parameters

hFile (HFILE) input 
File handle used in the DosSetFileLocksL function that is to be cancelled.
pflLockL (PFILELOCKL) input 
Address of the structure describing the lock request to cancel.

Return Code

ulrc (APIRET) returns

DosCancelLockRequestL returns one of the following values

  • 0 NO_ERROR
  • ERROR_INVALID_HANDLE
  • 87 ERROR_INVALID_PARAMETER
  • 173 ERROR_CANCEL_VIOLATION

Remarks

DosCancelLockRequestL allows a process to cancel the lock range request of an outstanding DosSetFileLocksL function.

If two threads in a process are waiting on a lock file range, and another thread issues DosCancelLockRequestL for that lock file range, then both waiting threads are released.

Not all file-system drivers (FSDs) can cancel an outstanding lock request.

Local Area Network (LAN) servers cannot cancel an outstanding lock request if they use a version of the operating system prior to OS/2 Version 2.00.

Example Code

This example opens a file named CANLOCK.DAT, locks a block of the data, writes some data to it, and then cancels the lock request.

#define INCL_DOSFILEMGR       /* File Manager values */
#define INCL_DOSERRORS        /* DOS Error values    */
#include <os2.h>
#include <stdio.h>
#include <string.h>

int main(VOID){
  HFILE     FileHandle   = NULLHANDLE;  /* File handle */
  ULONG     Action       = 0,           /* Action taken by DosOpenL */
            Wrote        = 0;           /* Number of bytes written by DosWrite */
  CHAR      FileData 40  = "Forty bytes of demonstration text data\r\n";
  APIRET    rc           = NO_ERROR;    /* Return code */

  FILELOCKL LockArea     = 0,         /* Area of file to lock */
            UnlockArea   = 0;         /* Area of file to unlock */

  rc = DosOpenL("canlock.dat",                /* File to open */
                 FileHandle,                  /* File handle */
                 Action,                      /* Action taken */
                 256,                         /* File primary allocation */
                 FILE_ARCHIVED,               /* File attributes */
                 FILE_OPEN | FILE_CREATE,     /* Open function type */
                 OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE,
                 0L);                         /* No extended attributes */
  if (rc != NO_ERROR)                         /* If open failed */
    printf("DosOpenL error  return code = %u\n", rc);
    return 1;  
 
  LockArea.lOffset = 0;               /* Start locking at beginning of file */
  LockArea.lRange =  40;              /* Use a lock range of 40 bytes       */
  UnLockArea.lOffset = 0;             /* Start unlocking at beginning of file */
  UnLockArea.lRange =  0;             /* Use a unlock range of 0 bytes       */

  rc = DosSetFileLocksL(FileHandle,   /* File handle   */
                        UnlockArea,   /* No unlock area */
                        LockArea,     /* Lock current record */
                        2000L,        /* Lock time-out value of 2 seconds */
                        0L);          /* Exclusive lock, not atomic */
  if (rc != NO_ERROR)
    printf("DosSetFileLocks error  return code = %u\n", rc);
    return 1;
 
  rc = DosWrite(FileHandle, FileData, sizeof(FileData), Wrote);
  if (rc != NO_ERROR)
    printf("DosWrite error return code = %u\n", rc);
    return 1;
 
  /* Should check if (rc != NO_ERROR) here... */

  LockArea.lOffset = 0;               /* Start locking at beginning of file */
  LockArea.lRange =  0;               /* Use a lock range of 40 bytes       */
  UnLockArea.lOffset = 0;             /* Start locking at beginning of file */
  UnLockArea.lRange = 40;             /* Use a lock range of 40 bytes       */

  rc = DosSetFileLocksL(FileHandle,   /* File handle  */
       UnlockArea,                    /* Unlock area */
       LockArea,                      /* No Lock */
       2000L,                         /* Lock time-out value of 2 seconds */
       0L);                           /* Exclusive lock, not atomic */
  if (rc != NO_ERROR)
    printf("DosSetFileLocksL error  return code = %u\n", rc);
    return 1;
  rc = DosClose(FileHandle);
  /* Should check if (rc != NO_ERROR) here... */
 
 return NO_ERROR;
 rc = DosClose(FileHandle);
/* Should check if (rc != NO_ERROR) here... */

return NO_ERROR;
}

Related Functions