[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