- Add comments to code and clean it up
- Fix some incorrect operations
- Optimize and fix loops
Modified: trunk/reactos/ntoskrnl/ex/zone.c
_____
Modified: trunk/reactos/ntoskrnl/ex/zone.c
--- trunk/reactos/ntoskrnl/ex/zone.c 2005-08-05 06:53:56 UTC (rev
17057)
+++ trunk/reactos/ntoskrnl/ex/zone.c 2005-08-05 06:54:15 UTC (rev
17058)
@@ -1,57 +1,68 @@
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
- * FILE: ntoskrnl/mm/zone.c
+ * FILE: ntoskrnl/ex/zone.c
* PURPOSE: Implements zone buffers
*
- * PROGRAMMERS: David Welch (welch(a)mcmail.com)
+ * PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net)
+ * David Welch (welch(a)mcmail.com)
*/
/* INCLUDES
****************************************************************/
#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
/* FUNCTIONS
***************************************************************/
-// undocumented? from extypes.h in here for now...
-
-//typedef struct _ZONE_ENTRY
-//{
-// SINGLE_LIST_ENTRY Entry;
-//} ZONE_ENTRY, *PZONE_ENTRY;
-
-
-
/*
* @implemented
*/
NTSTATUS
STDCALL
-ExExtendZone (
- PZONE_HEADER Zone,
- PVOID Segment,
- ULONG SegmentSize
- )
+ExExtendZone(PZONE_HEADER Zone,
+ PVOID Segment,
+ ULONG SegmentSize)
{
- PZONE_SEGMENT_HEADER entry;
- PZONE_SEGMENT_HEADER seg;
- unsigned int i;
+ ULONG_PTR Entry;
+ ULONG i;
- seg = (PZONE_SEGMENT_HEADER)Segment;
- seg->Reserved = (PVOID) SegmentSize;
+ /*
+ * BlockSize and Segment must be 8-byte aligned.
+ * Blocksize cannot exceed Segment Size.
+ */
+ if (((ULONG_PTR)Segment & 7) ||
+ (SegmentSize & 7) ||
+ (Zone->BlockSize > SegmentSize))
+ {
+ DPRINT1("Invalid ExExtendZone Alignment and/or Size\n");
+ return STATUS_INVALID_PARAMETER;
+ }
- PushEntryList(&Zone->SegmentList,&seg->SegmentList);
+ /* Link the Zone and Segment */
+
PushEntryList(&Zone->SegmentList,&((PZONE_SEGMENT_HEADER)Segment)->Segme
ntList);
- entry = (PZONE_SEGMENT_HEADER)( ((char*)seg) +
sizeof(ZONE_SEGMENT_HEADER) );
+ /* Get to the first entry */
+ Entry = (ULONG_PTR)Segment + sizeof(ZONE_SEGMENT_HEADER);
- for (i=0;i<(SegmentSize / Zone->BlockSize);i++)
- {
- PushEntryList(&Zone->FreeList,&entry->SegmentList);
- entry = (PZONE_SEGMENT_HEADER)(((char*)entry) +
sizeof(PZONE_SEGMENT_HEADER) +
- Zone->BlockSize);
- }
- return(STATUS_SUCCESS);
+ /* Loop through the segments */
+ for (i = sizeof(ZONE_SEGMENT_HEADER);
+ i <= SegmentSize - Zone->BlockSize;
+ i+= Zone->BlockSize)
+ {
+ /* Link the Free and Segment Lists */
+ PushEntryList(&Zone->FreeList, (PSINGLE_LIST_ENTRY)Entry);
+
+ /* Go to the next entry */
+ Entry += Zone->BlockSize;
+ }
+
+ /* Update Segment Size */
+ Zone->TotalSegmentSize += i;
+
+ /* Return Success */
+ return STATUS_SUCCESS;
}
@@ -60,35 +71,27 @@
*/
NTSTATUS
STDCALL
-ExInterlockedExtendZone (
- PZONE_HEADER Zone,
- PVOID Segment,
- ULONG SegmentSize,
- PKSPIN_LOCK Lock
- )
+ExInterlockedExtendZone(PZONE_HEADER Zone,
+ PVOID Segment,
+ ULONG SegmentSize,
+ PKSPIN_LOCK Lock)
{
- NTSTATUS ret;
- KIRQL oldlvl;
+ NTSTATUS Status;
+ KIRQL OldIrql;
- KeAcquireSpinLock(Lock,&oldlvl);
- ret = ExExtendZone(Zone,Segment,SegmentSize);
- KeReleaseSpinLock(Lock,oldlvl);
- return(ret);
+ /* Get the lock */
+ KeAcquireSpinLock(Lock, &OldIrql);
+
+ /* Extend the Zone */
+ Status = ExExtendZone(Zone, Segment, SegmentSize);
+
+ /* Release lock and return status */
+ KeReleaseSpinLock(Lock, OldIrql);
+ return Status;
}
/*
- * @implemented
- */
-NTSTATUS
-STDCALL
-ExInitializeZone (
- PZONE_HEADER Zone,
- ULONG BlockSize,
- PVOID InitialSegment,
- ULONG InitialSegmentSize
- )
-/*
* FUNCTION: Initalizes a zone header
* ARGUMENTS:
* Zone = zone header to be initialized
@@ -96,31 +99,60 @@
* InitialSegment = Initial segment of storage allocated by
the
* caller
* InitialSegmentSize = Initial size of the segment
+ *
+ * @implemented
*/
+NTSTATUS
+STDCALL
+ExInitializeZone(PZONE_HEADER Zone,
+ ULONG BlockSize,
+ PVOID InitialSegment,
+ ULONG InitialSegmentSize)
{
- unsigned int i;
- PZONE_SEGMENT_HEADER seg;
- PZONE_SEGMENT_HEADER entry;
+ ULONG i;
+ ULONG_PTR Entry;
- Zone->FreeList.Next=NULL;
- Zone->SegmentList.Next=NULL;
- Zone->BlockSize=BlockSize;
- Zone->TotalSegmentSize = InitialSegmentSize;
+ /*
+ * BlockSize and Segment must be 8-byte aligned.
+ * Blocksize cannot exceed Segment Size.
+ */
+ if (((ULONG_PTR)InitialSegment & 7) ||
+ (InitialSegmentSize & 7) ||
+ (BlockSize > InitialSegmentSize))
+ {
+ DPRINT1("Invalid ExInitializeZone Alignment and/or Size\n");
+ return STATUS_INVALID_PARAMETER;
+ }
- seg = (PZONE_SEGMENT_HEADER)InitialSegment;
- seg->Reserved = (PVOID*) InitialSegmentSize;
+ /* Set the Zone Header */
+ Zone->BlockSize = BlockSize;
- PushEntryList(&Zone->SegmentList,&seg->SegmentList);
+ /* Link empty list */
+ Zone->FreeList.Next = NULL;
+ Zone->SegmentList.Next = NULL;
+ PushEntryList(&Zone->SegmentList,
&((PZONE_SEGMENT_HEADER)InitialSegment)->SegmentList);
+ ((PZONE_SEGMENT_HEADER)InitialSegment)->Reserved = NULL;
- entry = (PZONE_SEGMENT_HEADER)( ((char*)seg) +
sizeof(ZONE_SEGMENT_HEADER) );
+ /* Get first entry */
+ Entry = (ULONG_PTR)InitialSegment + sizeof(ZONE_SEGMENT_HEADER);
- for (i=0;i<(InitialSegmentSize / BlockSize);i++)
- {
- PushEntryList(&Zone->FreeList,&entry->SegmentList);
- entry = (PZONE_SEGMENT_HEADER)(((char*)entry) +
sizeof(PZONE_SEGMENT_HEADER) + BlockSize);
- }
+ /* Loop through the segments */
+ for (i = sizeof(ZONE_SEGMENT_HEADER);
+ i <= InitialSegmentSize - BlockSize;
+ i+= BlockSize)
+ {
+ /* Link the Free and Segment Lists */
+ PushEntryList(&Zone->FreeList, (PSINGLE_LIST_ENTRY)Entry);
- return(STATUS_SUCCESS);
+ /* Go to the next entry */
+ Entry += Zone->BlockSize;
+ }
+
+ /* Update Segment Size */
+ Zone->TotalSegmentSize += i;
+
+ /* Return success */
+ return STATUS_SUCCESS;
}
/* EOF */
Show replies by date