168 lines
4.5 KiB
C
168 lines
4.5 KiB
C
/*
|
||
|
||
Copyright (c) 1992 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
iopool.h
|
||
|
||
Abstract:
|
||
|
||
This module contains the IO pool management stuff.
|
||
|
||
Author:
|
||
|
||
Jameel Hyder (microsoft!jameelh)
|
||
|
||
|
||
Revision History:
|
||
25 Feb 1994 Initial Version
|
||
|
||
Notes: Tab stop: 4
|
||
--*/
|
||
|
||
#ifndef _IOPOOL_
|
||
|
||
#define _IOPOOL_
|
||
|
||
#define DWORDSIZEBLOCK(Size) (((Size) + sizeof(DWORD) - 1) & ~(sizeof(DWORD)-1))
|
||
#define LONGLONGSIZEBLOCK(Size) ((Size) + (sizeof(LONGLONG) - (Size)%(sizeof(LONGLONG))))
|
||
#define PAGED_BLOCK_SIGNATURE *(PDWORD)"PAGD"
|
||
#define NONPAGED_BLOCK_SIGNATURE *(PDWORD)"NPGD"
|
||
|
||
/* MSKK hideyukn, Our Nls table is larger than 0x20000, 07/05/95 */
|
||
// used for debug builds only: bumped up to 0x200000 (note one more 0)
|
||
#define MAXIMUM_ALLOC_SIZE 0x200000 // For sanity checking
|
||
|
||
typedef struct
|
||
{
|
||
unsigned tg_Size:20;
|
||
unsigned tg_Flags:4;
|
||
unsigned tg_Tag:8;
|
||
} TAG, *PTAG;
|
||
|
||
#define MAX_POOL_AGE 6
|
||
#define POOL_AGE_TIME 15
|
||
#define POOL_ALLOC_SIZE (0x2000) - POOL_OVERHEAD
|
||
#define NUM_BUFS_IN_POOL 3
|
||
|
||
#define POOL_ALLOC_3 ASP_QUANTUM
|
||
#define POOL_ALLOC_2 1600
|
||
#define POOL_ALLOC_1 512
|
||
#define LOCKS_BUF_SPACE (POOL_ALLOC_SIZE - sizeof(IOPOOL) - \
|
||
POOL_ALLOC_1 - POOL_ALLOC_2 - POOL_ALLOC_3 - \
|
||
(NUM_BUFS_IN_POOL * sizeof(IOPOOL_HDR)))
|
||
|
||
#define IO_POOL_NOT_IN_USE 0
|
||
#define IO_POOL_IN_USE 1
|
||
#define IO_POOL_HUGE_BUFFER 2
|
||
|
||
#define NUM_LOCKS_IN_POOL ((LOCKS_BUF_SPACE)/(sizeof(IOPOOL_HDR) + sizeof(FORKLOCK)))
|
||
|
||
// The pool is structured as a set of 1 each of POOL_ALLOC_x buffers linked in
|
||
// ascending order of sizes. The balance of the POOL_ALLOC_SIZE is divided into
|
||
// a number of fork-lock structures. The layout is as follows:
|
||
//
|
||
// +---------------------+
|
||
// | IoPool Structure |----------+
|
||
// | |--+ |
|
||
// +---------------------+ | |
|
||
// +--| IoPool Hdr |<-+ |
|
||
// | +---------------------+ |
|
||
// | | | |
|
||
// | . Buffer 1 . |
|
||
// | | | |
|
||
// | +---------------------+ |
|
||
// +->| IoPool Hdr |--+ |
|
||
// +---------------------+ | |
|
||
// | | | |
|
||
// . Buffer 2 . | |
|
||
// | | | |
|
||
// +---------------------+ | |
|
||
// |||--| IoPool Hdr |<-+ |
|
||
// +---------------------+ |
|
||
// | | |
|
||
// . Buffer 3 . |
|
||
// | | |
|
||
// +---------------------+ |
|
||
// +--| IoPool Hdr |<---------+
|
||
// | +---------------------+
|
||
// | | |
|
||
// . . ForkLock1 .
|
||
// . | |
|
||
// | +---------------------+
|
||
// +->| IoPool Hdr |--|||
|
||
// +---------------------+
|
||
// | |
|
||
// . ForkLockN .
|
||
// | |
|
||
// +---------------------+
|
||
//
|
||
//
|
||
#if DBG
|
||
#define POOLHDR_SIGNATURE *(PDWORD)"PLH"
|
||
#define VALID_PLH(pPoolHdr) (((pPoolHdr) != NULL) && \
|
||
((pPoolHdr)->Signature == POOLHDR_SIGNATURE))
|
||
#else
|
||
#define VALID_PLH(pPoolHdr) ((pPoolHdr) != NULL)
|
||
#endif
|
||
|
||
typedef struct _IoPoolHdr
|
||
{
|
||
#if DBG
|
||
DWORD Signature;
|
||
DWORD IoPoolHdr_Align1;
|
||
#endif
|
||
union
|
||
{
|
||
struct _IoPoolHdr * iph_Next; // Valid when it is on the free list
|
||
struct _IoPool * iph_pPool; // Valid when it is allocated. Used
|
||
// to put it back on the free list
|
||
};
|
||
DWORD IoPoolHdr_Align2;
|
||
TAG iph_Tag; // Keep it at end since it is accessed
|
||
// by moving back from the free ptr
|
||
} IOPOOL_HDR, *PIOPOOL_HDR;
|
||
|
||
#if DBG
|
||
#define IOPOOL_SIGNATURE *(PDWORD)"IOP"
|
||
#define VALID_IOP(pPool) (((pPool) != NULL) && \
|
||
((pPool)->Signature == IOPOOL_SIGNATURE))
|
||
#else
|
||
#define VALID_IOP(pPool) ((pPool) != NULL)
|
||
#endif
|
||
|
||
typedef struct _IoPool
|
||
{
|
||
#if DBG
|
||
DWORD Signature;
|
||
DWORD QuadAlign1;
|
||
#endif
|
||
struct _IoPool * iop_Next;
|
||
struct _IoPool ** iop_Prev;
|
||
struct _IoPoolHdr * iop_FreeBufHead; // The list of POOL headers start here
|
||
struct _IoPoolHdr * iop_FreeLockHead; // The list of fork-locks start here
|
||
DWORD QuadAlign2;
|
||
USHORT iop_Age; // Used to age out pool
|
||
BYTE iop_NumFreeBufs; // Number of free IO buffer
|
||
BYTE iop_NumFreeLocks; // Number of free fork locks
|
||
} IOPOOL, *PIOPOOL;
|
||
|
||
LOCAL PIOPOOL afpIoPoolHead = { NULL };
|
||
LOCAL AFP_SPIN_LOCK afpIoPoolLock = { 0 };
|
||
LOCAL USHORT afpPoolAllocSizes[NUM_BUFS_IN_POOL] =
|
||
{
|
||
POOL_ALLOC_1,
|
||
POOL_ALLOC_2,
|
||
POOL_ALLOC_3
|
||
};
|
||
|
||
LOCAL AFPSTATUS FASTCALL
|
||
afpIoPoolAge(
|
||
IN PVOID pContext
|
||
);
|
||
|
||
#endif // _IOPOOL_
|
||
|
||
|