Hey,

Excuse the idiot factor, but I am used to just relying on CVS/SVN to handle
merges for me. What tool do I use to merge the patch?

Jonathan Chayce Dickinson

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:sharpos-
> [EMAIL PROTECTED] On Behalf Of Ásgeir
> Halldórsson
> Sent: 12 November 2007 08:02 PM
> To: sharpos-developers@lists.sourceforge.net
> Subject: [SharpOS Developers] Page allocator changes take 2
> 
> Index: Kernel/Core/PageAllocator.cs
> ===================================================================
> --- Kernel/Core/PageAllocator.cs        (revision 457)
> +++ Kernel/Core/PageAllocator.cs        (working copy)
> @@ -9,6 +9,7 @@
> 
>  using SharpOS.AOT;
>  using SharpOS.ADC;
> +using System.Runtime.InteropServices;
> 
>  namespace SharpOS.Memory {
> 
> @@ -25,12 +26,14 @@
>                 static byte *kernelStartPage;   // physical pointer to
> the first page occupied by the kernel
>                 static uint kernelSize;         // kernel image size
> (pages)
>                 static uint totalPages;         // amount of pages with
> RAM
> -
> -               static uint *fpStack;           // stack containing
> free page addresses
> +
> +        static uint currentPage;
> +        static uint *fpStack;          // stack containing free page
> addresses
>                 static uint fpStackSize;        // size of the free
> page stack (KB)
>                 static uint fpStackPointer;
> -
> -               static uint *rpStack;           // stack containing
> reserved page addresses
> +
> +        static bool reservedPagesLeft;
> +        static ReservedPages *rpStack;         // stack containing
> reserved page addresses
>                 static uint rpStackSize;        // size of the reserved
> page stack (KB)
>                 static uint rpStackPointer;
> 
> @@ -39,7 +42,13 @@
> 
>                 #endregion
>                 #region Nested types
> -
> +        [StructLayout(LayoutKind.Sequential)]
> +        private struct ReservedPages
> +        {
> +            public uint Address;
> +            public uint Size;
> +        }
> +
>                 public enum Errors: uint {
>                         Success = 0,
>                         Unknown,
> @@ -95,9 +104,10 @@
>                         start += fpStackSize * Pager.AtomicPageSize;
> 
>                         // Allocate the reserved page stack
> -                       rpStack = (uint*)start;
> +            rpStack = (ReservedPages*)start;
>                         rpStackPointer = 0;
>                         rpStackSize = 1;
> +            reservedPagesLeft = false;
> 
>                         // Allocate paging information
>                         pagingMemory->Start = (byte*)PtrToPage(start +
> (rpStackSize * 1024) + (Pager.AtomicPageSize - 1));
> @@ -130,13 +140,7 @@
>                                 Kernel.Warning("Paging not set in
> commandline!");
> 
>                         // NOTE: 0x0000 page is reserved
> -                       for (int i = (int)(totalPages - 1); i >= 1; --
> i)
> -                       {
> -                               // we should be doing this but it's so
> slow!
> -                               // it needs to be rewritten to be fast
> enough to do..
> -                               //if (!IsPageReserved(page))
> -                                       PushFreePage((byte*)(i *
> Pager.AtomicPageSize));
> -                       }
> +            currentPage = 1;
> 
>                         if (paging)
>                         {
> @@ -196,17 +200,21 @@
>                 /// </summary>
>                 public static bool IsPageReserved (void *page)
>                 {
> -                       uint sp = 0;
> -                       uint *ptr = rpStack;
> -
> -                       while (sp < rpStackPointer) {
> -                               if (*ptr == (uint)page)
> -                                       return true;
> -                               ++sp;
> -                               ++ptr;
> -                       }
> -
> -                       return false;
> +            uint sp = 0;
> +            ReservedPages* ptr = rpStack;
> +            uint pageAddr = (uint)page;
> +
> +            while (sp < rpStackPointer)
> +            {
> +                if (pageAddr >= ptr->Address  && pageAddr <= (ptr-
> >Address + (ptr->Size * Pager.AtomicPageSize)))
> +                {
> +                    return true;
> +                }
> +                ++sp;
> +                ++ptr;
> +            }
> +
> +            return false;
>                 }
> 
>                 #endregion
> @@ -219,16 +227,7 @@
>                 {
>                         void *page = null;
> 
> -                       if (fpStackPointer == 0)
> -                               return null;
> -
> -                       do {
> -                               page = PopFreePage ();
> -                               if (!IsPageReserved(page))      //
> slow!
> -                                       return page;
> -                       } while (page != null);
> -
> -                       return null;
> +                       return PopFreePage ();
>                 }
> 
>                 /// <summary>
> @@ -432,7 +431,11 @@
> 
>                 #endregion
>                 #region ReservePage () family
> -
> +        private static ReservedPages* GetReservedPage()
> +        {
> +            return &rpStack[rpStackPointer++];
> +        }
> +
>                 /// <summary>
>                 /// Reserves a memory page so that it cannot be
> allocated using
>                 /// <see cref="M:Alloc()" /> or <see
> cref="M:RangeAlloc(uint count)" />.
> @@ -442,6 +445,7 @@
>                 /// </param>
>                 public static bool ReservePage(void *page)
>                 {
> +            reservedPagesLeft = true;
>                         if (page == null)
>                                 return false;
> 
> @@ -451,10 +455,12 @@
> 
>                         //if (!IsPageFree(page, &fsp))
>                         //      return false;
> -
> -                       PushReservedPage(page);
> -
> -                       return true;
> +
> +            ReservedPages* pages = GetReservedPage();
> +            pages->Address = (uint)page;
> +            pages->Size = 1;
> +
> +            return true;
>                 }
> 
>                 /// <summary>
> @@ -469,13 +475,13 @@
>                 /// </param>
>                 public static bool ReservePageRange(void *firstPage,
> uint pages, string name)
>                 {
> -                       byte*   page = (byte*)firstPage;
> -                       for (int i = 0; i < pages; i++)
> -                       {
> -                               PushReservedPage(page);
> -                               page += Pager.AtomicPageSize;
> -                       }
> -                       return false;
> +            reservedPagesLeft = true;
> +
> +            ReservedPages* reservePages = GetReservedPage();
> +            reservePages->Address = (uint)firstPage;
> +            reservePages->Size = pages;
> +
> +            return true;
>                 }
> 
>                 #endregion
> @@ -551,20 +557,31 @@
> 
>                 private static void *PopFreePage()
>                 {
> -                       if (fpStackPointer == 0)
> -                               return null;
> -                       return (void*)fpStack[--fpStackPointer];
> +            if (fpStackPointer == 0 && currentPage < (totalPages - 1))
> +            {
> +                while (currentPage < (totalPages - 1))
> +                {
> +                    uint* page = (uint*)(currentPage *
> Pager.AtomicPageSize);
> +                    currentPage++;
> +
> +                    if (IsPageReserved(page))
> +                    {
> +                        continue;
> +                    }
> +
> +                    return (void*)page;
> +                }
> +            }
> +            else if (fpStackPointer == 0)
> +                return null;
> +
> +            return (void*)fpStack[--fpStackPointer];
>                 }
> -
> -               private static void PushReservedPage(void *page)
> -               {
> -                       rpStack[rpStackPointer++] = (uint)page;
> -               }
> 
>                 #endregion
>                 #region Debug
> 
> -               public static void Dump(uint*   stack, uint stackptr,
> int count)
> +               public static void DumpStack(uint*      stack, uint
> stackptr, int count)
>                 {
>                         for (int i = (int)stackptr - 1; i >= 0 && i>=
> stackptr - count; i--)
>                         {
> @@ -575,12 +592,26 @@
>                         }
>                 }
> 
> -               public static void Dump(int count)
> +        private static void DumpReservedStack(ReservedPages*
> pageStack, uint stackPtr, int count)
> +        {
> +            for (int i = (int)stackPtr - 1; i >= 0 && i >=stackPtr -
> count;i--)
> +            {
> +                ADC.TextMode.Write(i);
> +                ADC.TextMode.Write(": Address: ");
> +                ADC.TextMode.Write((int)pageStack->Address);
> +                ADC.TextMode.Write(", Size: ");
> +                ADC.TextMode.Write((int)pageStack->Size);
> +                pageStack++;
> +                ADC.TextMode.WriteLine();
> +            }
> +        }
> +
> +        public static void Dump(int count)
>                 {
>                         ADC.TextMode.WriteLine("Free");
> -                       Dump(fpStack, fpStackPointer, count);
> +                       DumpStack(fpStack, fpStackPointer, count);
>                         ADC.TextMode.WriteLine("Reserved");
> -                       Dump(rpStack, rpStackPointer, count);
> +            DumpReservedStack(rpStack, rpStackPointer, count);
>                 }
> 
>                 #endregion
> 
> 
> -----------------------------------------------------------------------
> --
> This SF.net email is sponsored by: Splunk Inc.
> Still grepping through log files to find problems?  Stop.
> Now Search log events and configuration files using AJAX and a browser.
> Download your FREE copy of Splunk now >> http://get.splunk.com/
> _______________________________________________
> SharpOS-Developers mailing list
> SharpOS-Developers@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sharpos-developers


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
SharpOS-Developers mailing list
SharpOS-Developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sharpos-developers

Reply via email to