So things are clear, dw please apply your patch.  It is indeed better
to change flags - if possible - just once.

Thanks,
Kai

2014-10-25 6:01 GMT+02:00 Vadim Chugunov <vadi...@gmail.com>:
> I've tried both patches (fixed conditions in Kai's) and both eliminate
> extraneous calls to VirtualProtect.  However Kai's patch did not seem to
> affect startup performance at all.   DW's patch, on the other hand, also
> gets rid of VirtualQuery', and that cuts down the startup time of my test
> example by 40%.
> Thanks!
>
> Vadim
>
>
> On Fri, Oct 24, 2014 at 5:53 PM, dw <da...@limegreensocks.com> wrote:
>>
>>
>> > Ups, that was unintended to send an empty mail :)
>>
>> I did wonder.  I assumed it was just a ping.
>>
>> > So, here is a patch.
>>
>> Your patch does not look right.  You have added the new checks using "||"?
>>
>> > It would be great if somebody could verify that the reported
>> > issue is solved by it.
>>
>> Yes, this is the hard part.  Vadim seems to be able to produce this with
>> no problem, but I'm having no luck getting it to happen at all.
>>
>> BTW, what is __MINGW64_VERSION_MAJOR for?  Is there a time when it might
>> not be defined in pseudo-reloc?  If it is defined, we end up checking
>> the page attributes twice.
>>
>> FWIW, my patch (which I haven't been able to test either) looks like
>> this (removes the duplicate check):
>>
>> ----------------------- mingw-w64-crt/crt/pseudo-reloc.c
>> -----------------------
>> index 4e7f31b..7709208 100644
>> @@ -206,7 +206,8 @@ mark_section_writable (LPVOID addr)
>>         return;
>>       }
>>
>> -  if (b.Protect != PAGE_EXECUTE_READWRITE && b.Protect != PAGE_READWRITE)
>> +  if (b.Protect != PAGE_EXECUTE_READWRITE && b.Protect != PAGE_READWRITE
>> +      && b.Protect != PAGE_EXECUTE_WRITECOPY && b.Protect !=
>> PAGE_WRITECOPY)
>>       {
>>         if (!VirtualProtect (b.BaseAddress, b.RegionSize,
>>                  PAGE_EXECUTE_READWRITE,
>> @@ -259,16 +260,17 @@ restore_modified_sections (void)
>>   static void
>>   __write_memory (void *addr, const void *src, size_t len)
>>   {
>> -  MEMORY_BASIC_INFORMATION b;
>> -  DWORD oldprot;
>> -  int call_unprotect = 0;
>> -
>>     if (!len)
>>       return;
>>
>>   #ifdef __MINGW64_VERSION_MAJOR
>> +  /* Mark the section writable once, and unset it in
>> +   * restore_modified_sections */
>>     mark_section_writable ((LPVOID) addr);
>> -#endif
>> +#else
>> +  MEMORY_BASIC_INFORMATION b;
>> +  DWORD oldprot = 0;
>> +  int call_unprotect = 0;
>>
>>     if (!VirtualQuery (addr, &b, sizeof(b)))
>>       {
>> @@ -277,18 +279,25 @@ __write_memory (void *addr, const void *src,
>> size_t len)
>>       }
>>
>>     /* Temporarily allow write access to read-only protected memory. */
>> -  if (b.Protect != PAGE_EXECUTE_READWRITE && b.Protect != PAGE_READWRITE)
>> +  if (b.Protect != PAGE_EXECUTE_READWRITE && b.Protect != PAGE_READWRITE
>> +      && b.Protect != PAGE_WRITECOPY && b.Protect !=
>> PAGE_EXECUTE_WRITECOPY)
>>       {
>>         call_unprotect = 1;
>>         VirtualProtect (b.BaseAddress, b.RegionSize,
>> PAGE_EXECUTE_READWRITE,
>>                 &oldprot);
>>       }
>> +#endif
>>
>>     /* write the data. */
>>     memcpy (addr, src, len);
>> +
>> +#ifndef __MINGW64_VERSION_MAJOR
>>     /* Restore original protection. */
>> -  if (call_unprotect && b.Protect != PAGE_EXECUTE_READWRITE &&
>> b.Protect != PAGE_READWRITE)
>> +  if (call_unprotect
>> +      && b.Protect != PAGE_EXECUTE_READWRITE && b.Protect !=
>> PAGE_READWRITE
>> +      && b.Protect != PAGE_WRITECOPY && b.Protect !=
>> PAGE_EXECUTE_WRITECOPY)
>>       VirtualProtect (b.BaseAddress, b.RegionSize, oldprot, &oldprot);
>> +#endif
>>   }
>>
>>   #define RP_VERSION_V1 0
>>
>>
>> ------------------------------------------------------------------------------
>>
>>
>>
>>
>> ------------------------------------------------------------------------------
>> _______________________________________________
>> Mingw-w64-public mailing list
>> Mingw-w64-public@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
>
>
>
> ------------------------------------------------------------------------------
>
> _______________________________________________
> Mingw-w64-public mailing list
> Mingw-w64-public@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
>

------------------------------------------------------------------------------
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to