windows-nt/Source/XPSP1/NT/multimedia/media/avi/avifile/disk32.h
2020-09-26 16:20:57 +08:00

129 lines
2.8 KiB
C

/****************************************************************************
*
* disk32.h
*
* routines to do async disk writes in Win32 Chicago
*
***************************************************************************/
#if !defined DISK32_H
#define DISK32_H
#ifdef __cplusplus
extern "C" { // Assume C declarations for C++
#endif // __cplusplus
// include this struct as a field in any code that is to be enqueued.
//
typedef struct _qelm * PQELM;
typedef struct _qelm {
PQELM pNext;
PQELM pPrev;
} QELM;
// use this for the head/tail of a queue.
//
typedef struct _qhead * PQHEAD;
typedef struct _qhead {
HANDLE hEvtElms; // optional Semaphore that has element count
CRITICAL_SECTION csList; // list synchronization lock
QELM qe; // head/tail pointers
} QHEAD;
// Initalize the queue.
//
BOOL WINAPI QueueInitialize (
PQHEAD pHead
);
// de-Initalize the queue
//
BOOL WINAPI QueueDelete (
PQHEAD pHead
);
// insert an element in the queue. If a thread is waiting on the queue
// it will be awakened.
//
VOID WINAPI QueueInsert (
PQHEAD pHead,
PQELM pqe
);
// remove an element from the queue. if the queue is empty.
// wait for an element to be inserted. A timeout of 0 can be
// used to POLL the queue.
//
PQELM WINAPI QueueRemove (
PQHEAD pHead,
DWORD dwTimeout
);
#ifdef DEBUG
void WINAPI QueueDump (
PQHEAD pHead
);
#else
#define QueueDump(a)
#endif
typedef struct _qiobuf * PQIOBUF;
typedef struct _qiobuf {
QELM qe; // queue pointers, used by queue.c MUST be first field!!
LPVOID lpv; // pointer to data
DWORD cb; // size of data
DWORD dwOffset; // file seek offset
DWORD dwError; // success/fail of write operation
DWORD cbDone; // actual bytes written/read
BYTE bWrite; // read/write flag
BYTE bPending; // TRUE when io has been removed from done queue
BYTE bSpare[2]; // spare flags
} QIOBUF;
typedef struct _qio * LPQIO;
typedef struct _qio {
QHEAD que; // head for buffers queued to be written
QHEAD queDone; // pointer to head of queue for write completion
HANDLE hFile;
HANDLE hThread;
DWORD tid;
UINT uState;
UINT nIOCount;
int nPrio;
} QIO;
BOOL WINAPI QioInitialize (
LPQIO lpqio,
HANDLE hFile,
int nPrio
);
// add a buffer to the async io queue
//
BOOL WINAPI QioAdd (
LPQIO lpqio,
PQIOBUF pqBuf
);
BOOL WINAPI QioWait (
LPQIO lpqio,
PQIOBUF pqBufWait,
BOOL bWait
);
BOOL WINAPI QioCommit (
LPQIO lpqio
);
// Shutdown Qio thread
//
BOOL WINAPI QioShutdown (
LPQIO lpqio
);
#ifdef __cplusplus
} // Assume C declarations for C++
#endif // __cplusplus
#endif // DISK32_H