Files
vxWorks/h/ioQLib.h
2025-08-20 18:25:46 +08:00

109 lines
2.7 KiB
C

/* ioQLib.h - I/O queue library header file */
/* Copyright 1993-2005 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
--------------------
01c,29apr05,hya added IO_DSYNC.
01b,26jan94,kdl changed name to ioQLib.h.
01a,04apr93,elh written.
*/
#ifndef __INCioQLibh
#define __INCioQLibh
#ifdef __cplusplus
extern "C" {
#endif
/* includes */
#include <vxWorks.h>
#include <lstLib.h>
#include <semLib.h>
/* typedefs */
typedef struct io_node /* I/O node */
{
NODE node; /* list node */
int op; /* op IO_READ | IO_WRITE */
int prio; /* priority */
int taskId; /* initiating task id */
int retVal; /* return value */
int errorVal; /* error value */
VOIDFUNCPTR doneRtn; /* done routine */
int value;
} IO_NODE;
typedef struct io_q /* I/O queue */
{
LIST workQ; /* list structure */
LIST waitQ; /* list structure */
VOIDFUNCPTR lock; /* lock routine */
VOIDFUNCPTR unlock; /* unlock routine */
int lockArg; /* arg for lock/unlock */
} IO_Q;
/* defines */
/* 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 */
#if defined(__STDC__) || defined(__cplusplus)
extern void ioQInit (IO_Q * pQ, VOIDFUNCPTR pLock, VOIDFUNCPTR pUnlock,
int lockArg);
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 * pQ, FUNCPTR pRoutine, int arg1, int arg2);
#else /* __STDC__ */
extern void ioQInit ();
extern void ioQNodeDone ();
extern void ioQLockSem ();
extern void ioQUnlockSem ();
extern void ioQAdd ();
extern void ioQDelete ();
extern IO_NODE * ioQEach ();
#endif /* __STDC__ */
#ifdef __cplusplus
}
#endif
#endif /* __INCioQLibh */