Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

167 lines
4.5 KiB

/*
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_