[ros-dev] Re: [ros-svn] [ion] 13832: - FreeLdr Part II (ntoskrnl is now relocated, removes 3GB compiler flag). Note that there is a bug in LD which Filip and I are examining, so do not try this yet.

Hartmut Birr hartmut.birr at gmx.de
Sun Mar 6 09:24:39 CET 2005


Alex Ionescu schrieb:

> James Tabor wrote:
>
>> BugCheck Alert!
>>
>>
> Hmm...looks like after reverting Thomas's patch and using Hartmut's,
> the problems are happening again.
> So, it would seem that Thomas' patch is more correct? Or perhaps both
> should be used?
> T/H: Let me know!
>
Hi,  

I've written a little test program which does always crash ros with my
patch on the smp machine (up not tested). The program does create 10
threads which try to open a non existing registry key in an endless
loop. It does not crash with Thomas' patch. His patch adds one reference
to much to the first parsed/opened key. This makes it impossible to
delete a key and to unload the registry at shut down. I think we have a
problem outside from the registry. It seems there is a gap between the
deleting of an object after the last dereference operation and the next
create operation for a new object with the same name. One thread has
reopend the object and use it and the other delete the same object. I
see very often values of 0xcccccxxx on bug checks and the wrong
reference value -858993460 is also 0xcccccccc.   

- Hartmut

-------------- next part --------------
#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <windows.h>

ULONG Count = 0;
volatile ULONG Terminate = 0;

DWORD WINAPI
RegTest(LPVOID param)
{
   HKEY hKey;
   LONG Result;

   while(!Terminate)
   {
#if 0
      Result = RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\SysFontSubstitutes", &hKey);
      if (Result == ERROR_SUCCESS)
      {
         InterlockedIncrement(&Count);
         RegCloseKey(hKey);
      }
#endif
      Result = RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes", &hKey);
      if (Result == ERROR_SUCCESS)
      {
         InterlockedIncrement(&Count);
         RegCloseKey(hKey);
      }
   }
   return 0;
}


int main(int argc, char* argv[])
{
   int i;

   printf("RegTest\n");

   for (i = 0; i < 10; i++)
   {
      CreateThread(NULL, 0, RegTest, NULL, 0, NULL);
   }

   Sleep(5000);

   Terminate = 1;

   Sleep(200);

   printf("Done (%ld)\n", Count);


   return 0;


}


More information about the Ros-dev mailing list