3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/mm/zone.c
6 * PURPOSE: Implements zone buffers
7 * PROGRAMMER: David Welch (welch@mcmail.com)
10 /* INCLUDES ****************************************************************/
14 /* FUNCTIONS ***************************************************************/
16 // undocumented? from extypes.h in here for now...
18 //typedef struct _ZONE_ENTRY
20 // SINGLE_LIST_ENTRY Entry;
21 //} ZONE_ENTRY, *PZONE_ENTRY;
36 PZONE_SEGMENT_HEADER entry
;
37 PZONE_SEGMENT_HEADER seg
;
40 seg
= (PZONE_SEGMENT_HEADER
)Segment
;
41 seg
->Reserved
= (PVOID
) SegmentSize
;
43 PushEntryList(&Zone
->SegmentList
,&seg
->SegmentList
);
45 entry
= (PZONE_SEGMENT_HEADER
)( ((char*)seg
) + sizeof(ZONE_SEGMENT_HEADER
) );
47 for (i
=0;i
<(SegmentSize
/ Zone
->BlockSize
);i
++)
49 PushEntryList(&Zone
->FreeList
,&entry
->SegmentList
);
50 entry
= (PZONE_SEGMENT_HEADER
)(((char*)entry
) + sizeof(PZONE_SEGMENT_HEADER
) +
53 return(STATUS_SUCCESS
);
62 ExInterlockedExtendZone (
72 KeAcquireSpinLock(Lock
,&oldlvl
);
73 ret
= ExExtendZone(Zone
,Segment
,SegmentSize
);
74 KeReleaseSpinLock(Lock
,oldlvl
);
88 ULONG InitialSegmentSize
91 * FUNCTION: Initalizes a zone header
93 * Zone = zone header to be initialized
94 * BlockSize = Size (in bytes) of the allocation size of the zone
95 * InitialSegment = Initial segment of storage allocated by the
97 * InitialSegmentSize = Initial size of the segment
101 PZONE_SEGMENT_HEADER seg
;
102 PZONE_SEGMENT_HEADER entry
;
104 Zone
->FreeList
.Next
=NULL
;
105 Zone
->SegmentList
.Next
=NULL
;
106 Zone
->BlockSize
=BlockSize
;
107 Zone
->TotalSegmentSize
= InitialSegmentSize
;
109 seg
= (PZONE_SEGMENT_HEADER
)InitialSegment
;
110 seg
->Reserved
= (PVOID
*) InitialSegmentSize
;
112 PushEntryList(&Zone
->SegmentList
,&seg
->SegmentList
);
114 entry
= (PZONE_SEGMENT_HEADER
)( ((char*)seg
) + sizeof(ZONE_SEGMENT_HEADER
) );
116 for (i
=0;i
<(InitialSegmentSize
/ BlockSize
);i
++)
118 PushEntryList(&Zone
->FreeList
,&entry
->SegmentList
);
119 entry
= (PZONE_SEGMENT_HEADER
)(((char*)entry
) + sizeof(PZONE_SEGMENT_HEADER
) + BlockSize
);
122 return(STATUS_SUCCESS
);