Files
m241Neelima/vxworks-6.9/target/h/ioQLib.h
T
2026-07-30 11:19:44 +05:30

151 lines
4.2 KiB
C

/* ioQLib.h - I/O queue library header file */
/* Copyright 1993-2006, 2010 Wind River Systems, Inc.
*
* The right to copy, distribute, modify or otherwise make use
* of this software may be licensed only pursuant to the terms
* of an applicable Wind River license agreement.
*/
/*
modification history
--------------------
01h,23jun10,jxu LP64 support: changed structure member(taskId) of _Vx_io_node
from type of int to TASK_ID, and member(retVal) from int to
ssize_t.
01g,28apr10,pad Moved extern C statement after include statements.
01f,24jul06,jpb Removal of duplicate definiton of IO_NODE and IO_Q.
01e,13mar06,mil Added prefix _Vx_ to struct io_node and struct io_q.
01d,26jan06,mil Updated for POSIX namespace conformance (P2).
01c,29apr05,hya added IO_DSYNC.
01b,26jan94,kdl changed name to ioQLib.h.
01a,04apr93,elh written.
*/
#ifndef __INCioQLibh
#define __INCioQLibh
/* includes */
#if !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE) && \
!defined(_POSIX_AEP_RT_CONTROLLER_C_SOURCE)
#include <vxWorks.h>
#include <semLib.h>
#else /* _POSIX_xxx_SOURCE */
#include <types/vxTypesOld.h>
#endif /* _POSIX_xxx_SOURCE */
#include <lstLib.h>
#ifdef __cplusplus
extern "C" {
#endif
/* typedefs */
#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
defined(_POSIX_AEP_RT_CONTROLLER_C_SOURCE)
#undef node
#undef op
#undef prio
#undef taskId
#undef retVal
#undef errorVal
#undef doneRtn
#undef value
#endif
typedef struct _Vx_io_node /* I/O node */
{
_Vx_NODE node; /* list node */
int op; /* op IO_READ | IO_WRITE */
int prio; /* priority */
#ifdef _WRS_KERNEL
TASK_ID taskId; /* initiating task id */
#else
_Vx_TASK_ID taskId; /* initiating task id */
#endif
ssize_t retVal; /* return value */
int errorVal; /* error value */
#ifdef _WRS_KERNEL
VOIDFUNCPTR doneRtn; /* done routine */
#else
_Vx_VOIDFUNCPTR doneRtn; /* done routine */
#endif
int value;
} _Vx_IO_NODE;
#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \
defined(_POSIX_AEP_RT_CONTROLLER_C_SOURCE)
#undef workQ
#undef waitQ
#undef lock
#undef unlock
#undef lockArg
#endif
typedef struct _Vx_io_q /* I/O queue */
{
_Vx_LIST workQ; /* list structure */
_Vx_LIST waitQ; /* list structure */
void (*lock)(_Vx_usr_arg_t); /* lock routine */
void (*unlock)(_Vx_usr_arg_t); /* unlock routine */
_Vx_usr_arg_t lockArg; /* arg for lock/unlock */
} _Vx_IO_Q;
#if !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE) && \
!defined(_POSIX_AEP_RT_CONTROLLER_C_SOURCE)
typedef _Vx_IO_NODE IO_NODE;
typedef _Vx_IO_Q IO_Q;
#endif
/* defines */
#if !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE) && \
!defined(_POSIX_AEP_RT_CONTROLLER_C_SOURCE)
/* i/o operations */
#define IO_READ 0 /* READ operation */
#define IO_WRITE 1 /* WRITE operation */
#define IO_SYNC 2 /* Sync operation */
#define IO_DSYNC 3 /* Data sync operation */
/* i/o synchronization and operations */
#define IOQ_LOCK(pQ) ((*(pQ)->lock) ((pQ)->lockArg))
#define IOQ_UNLOCK(pQ) ((*(pQ)->unlock) ((pQ)->lockArg))
#define IOQ_WORK_ADD(pQ, pNode, prio) \
ioQAdd (&(pQ)->workQ, (pNode), (prio))
#define IOQ_WORK_ADD_HEAD(pQ, pNode) \
lstInsert (&(pQ)->workQ, NULL, &(pNode)->node)
#define IOQ_WAIT_ADD(pQ, pNode, prio) \
ioQAdd (&(pQ)->waitQ, (pNode), (prio))
#define IOQ_WORK_DELETE(pQ, pNode) lstDelete (&(pQ)->workQ, &(pNode)->node)
#define IOQ_WAIT_DELETE(pQ, pNode) lstDelete (&(pQ)->waitQ, &(pNode)->node)
/* forward declarations */
extern void ioQInit (IO_Q * , void (*)(_Vx_usr_arg_t),
void (*)(_Vx_usr_arg_t), _Vx_usr_arg_t );
extern void ioQNodeDone (IO_NODE * pNode);
extern void ioQLockSem (SEM_ID semId);
extern void ioQUnlockSem (SEM_ID semId);
extern void ioQAdd (LIST * pQ, IO_NODE * pNode, int prio);
extern void ioQDelete (IO_Q * pQ, IO_NODE * pNode);
extern IO_NODE* ioQEach (LIST * ,
BOOL ( * )(IO_NODE*, _Vx_usr_arg_t, _Vx_usr_arg_t),
_Vx_usr_arg_t , _Vx_usr_arg_t );
#endif /* _POSIX_xxx_SOURCE */
#ifdef __cplusplus
}
#endif
#endif /* __INCioQLibh */