iofunc_lock()
Lock a resource
Synopsis:
#include <sys/iofunc.h>
int iofunc_lock( resmgr_context_t * ctp,
io_lock_t * msg,
iofunc_ocb_t * ocb,
iofunc_attr_t * attr );
Arguments:
- ctp
- A pointer to a resmgr_context_t structure that the resource-manager library uses to pass context information between functions.
- msg
- A pointer to the io_lock_t structure that contains the message that the resource manager received; see below.
- ocb
- A pointer to the iofunc_ocb_t structure for the Open Control Block that was created when the client opened the resource.
- attr
- A pointer to the iofunc_attr_t structure that describes the characteristics of the device that's associated with your resource manager.
Library:
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
Description:
The function iofunc_lock() does what is required for POSIX locks. For more information, see lockf().
io_lock_t structure
The io_lock_t structure holds the _IO_LOCK message received by the resource manager:
struct _io_lock {
uint16_t type;
uint16_t combine_len;
uint32_t subtype;
uint32_t nbytes;
/* char data[1]; */ /* for F_*LK this will be flock_t */
};
struct _io_lock_reply {
uint32_t zero [3];
/* char data[1]; */ /* for F_*LK this will be flock_t */
};
typedef union {
struct _io_lock i;
struct _io_lock_reply o;
} io_lock_t;
The I/O message structures are unions of an input message (coming to the resource manager) and an output or reply message (going back to the client).
The i member is a structure of type _io_read that contains the following members:
- type
- _IO_LOCK.
- combine_len
- If the message is a combine message, _IO_COMBINE_FLAG is set in this member. For more information, see Combine Messages chapter of Writing a Resource Manager.
- subtype
- One of the following:
- F_GETLK
- F_GETLK64
- F_SETLK
- F_SETLK64
- F_SETLKW
- F_SETLKW64
For more information, see fcntl().
- nbytes
- The number of bytes of data included in the message.
The commented-out declaration for data indicates that
nbytes bytes of data (a flock_t structure) immediately follow the
io_lock_t structure.
For information about this structure, see
flock structure
in the entry for fcntl().
QNX OS uses this structure for both flock() and the F_GETLK* and F_SETLK* commands for fcntl(). As a QNX OS extension, if the structure is for a call to flock(), the l_type member of this structure has F_FLOCK ORed into it. Your resource manager can check this bit and behave appropriately:
- For fcntl(), the basis of locking is the process; all file descriptors for a file within a process are considered to be the same when deciding whether to allow or block the lock.
- For flock(), the basis is the open control block; a dup()'d file descriptor—even if in a different process—is treated the same as the original for locking purposes, but a second open() of the file—even in the same process—is a different beast.
Returns:
- -1
- Success; the resource manager library should return a one-part IOV to the client.
- EACCES or EAGAIN
- The operation is F_TLOCK or F_TEST, and the section is already locked by another process.
- EAGAIN
- The operation is F_LOCK or F_TLOCK, and the file is mapped with mmap().
- EBADF
- The file descripter isn't valid, or the operation is F_LOCK or F_TLOCK, and the file descriptor isn't open for writing.
- EDEADLK
- The operation is F_LOCK, and a deadlock was detected.
- EINTR
- A signal was caught during execution of the function.
- EINVAL
- The operation isn't one of F_LOCK, F_TLOCK, F_TEST, or F_ULOCK, or the size plus the current file offset is less than 0.
- ENOMEM
- The system can't allocate sufficient memory to store lock resources.
- EOPNOTSUPP or EINVAL
- The implementation doesn't support the locking of files of the type indicated by the file descriptor.
- EOVERFLOW
- The offset of the first, or if the size isn't 0 then the last, byte in the requested section can't be represented correctly in an object of type off_t.
Classification:
Safety: | |
---|---|
Cancellation point | No |
Signal handler | Yes |
Thread | Yes |