3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/mm/zone.c
6 * PURPOSE: Implements zone buffers
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
11 /* INCLUDES ****************************************************************/
15 /* FUNCTIONS ***************************************************************/
17 // undocumented? from extypes.h in here for now...
19 //typedef struct _ZONE_ENTRY
21 // SINGLE_LIST_ENTRY Entry;
22 //} ZONE_ENTRY, *PZONE_ENTRY;
37 PZONE_SEGMENT_HEADER entry
;
38 PZONE_SEGMENT_HEADER seg
;
41 seg
= (PZONE_SEGMENT_HEADER
)Segment
;
42 seg
->Reserved
= (PVOID
) SegmentSize
;
44 PushEntryList(&Zone
->SegmentList
,&seg
->SegmentList
);
46 entry
= (PZONE_SEGMENT_HEADER
)( ((char*)seg
) + sizeof(ZONE_SEGMENT_HEADER
) );
48 for (i
=0;i
<(SegmentSize
/ Zone
->BlockSize
);i
++)
50 PushEntryList(&Zone
->FreeList
,&entry
->SegmentList
);
51 entry
= (PZONE_SEGMENT_HEADER
)(((char*)entry
) + sizeof(PZONE_SEGMENT_HEADER
) +
54 return(STATUS_SUCCESS
);
63 ExInterlockedExtendZone (
73 KeAcquireSpinLock(Lock
,&oldlvl
);
74 ret
= ExExtendZone(Zone
,Segment
,SegmentSize
);
75 KeReleaseSpinLock(Lock
,oldlvl
);
89 ULONG InitialSegmentSize
92 * FUNCTION: Initalizes a zone header
94 * Zone = zone header to be initialized
95 * BlockSize = Size (in bytes) of the allocation size of the zone
96 * InitialSegment = Initial segment of storage allocated by the
98 * InitialSegmentSize = Initial size of the segment
102 PZONE_SEGMENT_HEADER seg
;
103 PZONE_SEGMENT_HEADER entry
;
105 Zone
->FreeList
.Next
=NULL
;
106 Zone
->SegmentList
.Next
=NULL
;
107 Zone
->BlockSize
=BlockSize
;
108 Zone
->TotalSegmentSize
= InitialSegmentSize
;
110 seg
= (PZONE_SEGMENT_HEADER
)InitialSegment
;
111 seg
->Reserved
= (PVOID
*) InitialSegmentSize
;
113 PushEntryList(&Zone
->SegmentList
,&seg
->SegmentList
);
115 entry
= (PZONE_SEGMENT_HEADER
)( ((char*)seg
) + sizeof(ZONE_SEGMENT_HEADER
) );
117 for (i
=0;i
<(InitialSegmentSize
/ BlockSize
);i
++)
119 PushEntryList(&Zone
->FreeList
,&entry
->SegmentList
);
120 entry
= (PZONE_SEGMENT_HEADER
)(((char*)entry
) + sizeof(PZONE_SEGMENT_HEADER
) + BlockSize
);
123 return(STATUS_SUCCESS
);