Jump to content

dummzeuch

Members
  • Content Count

    2977
  • Joined

  • Last visited

  • Days Won

    106

Everything posted by dummzeuch

  1. No, it's a (actually the only) field in an object, so it should always be 32 bits aligned. Also, the assertion in the code checks for that condition and was active in all my tests and never failed.
  2. I am reinventing the wheel again (yes, I like doing that). Can you see anything wrong with these SpinLock functions? (for Win32 only) ///<summary> /// simple spin lock function, Lk must have been initialized with 0 before first use </summary> procedure doLock(var _Lk: Integer); asm mov edx, eax mov ecx, 1 @Loop: mov eax, 0 lock cmpxchg dword ptr [edx], ecx jnz @Loop end; ///<summary> /// simple spin unlock function, Lk must have been initialized with 0 before first use </summary> procedure doUnLock(var _Lk: Integer); asm lock dec dword ptr[eax]; end; ///<summary> /// simple spin trylock function, Lk must have been initialized with 0 before first use /// @returns True if the lock could be acquired, False otherwise </summary> function doTryLock(var _Lk: Integer): Boolean; asm mov edx, eax mov ecx, 1 mov eax, 0 lock cmpxchg dword ptr [edx], ecx setz al end; doLock and doUnlock are taken from https://vitaliburkov.wordpress.com/2011/10/28/parallel-programming-with-delphi-part-ii-resolving-race-conditions/ doTryLock is based on doLock and uses the setz opcode to return a boolean rather than looping. I have done tests and they seem to work, but it's always difficult to actually test multi threaded code.
  3. dummzeuch

    spinlock primitives

    Since I just wrote one myself, here you go: program AlignedOn32BitBoundaryTest; {$APPTYPE CONSOLE} uses SysUtils; {$IF not declared(UIntPtr)} type {$IF SizeOf(Pointer)=4} UIntPtr = UInt32; {$ELSE} UIntPtr = UInt64; {$IFEND} {$IFEND} function IsAlignedOn32bitBoundary(_Ptr: Pointer): Boolean; begin Result := ((UIntPtr(_Ptr) and $3) = 0); end; procedure CheckAlignedOn32BitBoundary(const _s: string; _Ptr: Pointer); begin if IsAlignedOn32bitBoundary(_Ptr) then WriteLn(_s + ' is aligned on a 32 bit boundary') else WriteLn(_s + ' is not aligned on a 32 bit boundary') end; type TSomeRect = packed record SomeByte: byte; SomeCardinal: Cardinal; end; var SomeRect: TSomeRect; begin CheckAlignedOn32BitBoundary('SomeByte', @SomeRect.SomeByte); CheckAlignedOn32BitBoundary('SomeCardinal', @SomeRect.SomeCardinal); WriteLn('press enter'); ReadLn; end.
  4. Thanks. I understood what the bug report said. I just can't reproduce it on my computer. That doesn't mean that I will ignore it. @merijnbs workaround, while it probably works, is not really one I would like to implement.
  5. Odd, this doesn't happen on my 10.4.2 test installation (and also not on my 10.4.1 installation). What does happen, is that the editor window loses focus. No idea where it goes. But that's not limited to GExpert's Open File and Delphi 10.4., it also happens without GExperts and e.g. on Delphi 10.2.
  6. dummzeuch

    JEDI files cannot find windows files

    Damn, I never get the name of that setting right.
  7. dummzeuch

    Restore Dock Window after IDE restart?

    How long do you want to argue about this? Until I cede that it's useless? Ok: it's useless. You win.
  8. dummzeuch

    JEDI files cannot find windows files

    You either need to add those prefixes to all units or alternatively add them to the name space prefixes list of the packages. I'd probably go for the latter. But on the other hand I wonder why those packages don't already contain them. These prefixes have been around for ages.
  9. dummzeuch

    Restore Dock Window after IDE restart?

    I don't quite agree that it's useless, but it could definitely be much more useful if it did get restored on an IDE restart.
  10. dummzeuch

    Restore Dock Window after IDE restart?

    Because I could. It started out as a simple test whether it was possible to create additional dock windows which were themselves not docked in the IDE. When it turned out that it's possible, I added it as an expert in the hope that it might be useful to somebody.
  11. dummzeuch

    Restore Dock Window after IDE restart?

    It's not very high on my to-do list, as I only know of only two people who use this feature, and I'm not one of them. But as always, I'll accept patches.
  12. dummzeuch

    Restore Dock Window after IDE restart?

    Yes, but the IDE doesn't know anything about these additional docking windows and there seems to be no way to make it aware of them.
  13. dummzeuch

    Google Authenticator

    There are also several firewall apps for Android which should allow checking for this, but I have never actually used one. Given, that Google knows about everything about me due to me using an Android phone, GMail and being constantly logged into my Google account while surfing the web, I don't really see a need to check whether any of the other Google tools submits any more information. If I ever find a usable replacement for GMail, I might make an effort though.
  14. dummzeuch

    Restore Dock Window after IDE restart?

    The additional Dock Window implementation does not support saving and restoring for now.
  15. dummzeuch

    Google Authenticator

    Google Authenticator is a One Time Password Generator. There are several alternatives that work the same way and are open source, e.g. FreeOTP is the one I use. These apps use the current time and a shared secret (with the server) to generate a 6 digit number. They all generate the same number given the same input, so you could use it to authenticate with your own app. The number is only valid for login for about 30 seconds. Of course Google Authenticator could use the data you add into it and the information about when you use it to log into which service for Googles purposes. But since it does not need an internet connection to fulfill its purpose, you could simply check whether it phones home or not. If it does, it's doing something it doesn't need to do and probably shouldn't do. Or, if you want to be 100% sure, use an open source solution and compile it yourself. (There are other methods to generate One Time Passwords, see e.g. Wikipedia for that.)
  16. I offered to help out and even submitted pull requests with updates for them, but they were ignored for several months. Then I gave up.
  17. If I remember correctly, it was added in Delphi 10.4, so it won't help much if you develop for multiple Delphi versions.
  18. dummzeuch

    spinlock primitives

    re 1: Then I probably need to repeat these tests on a system where the Delphi IDE hasn't run (yet), because I am not sure whether it had been running before the tests or not. re 2/3: There are lots of discussions on the web about Sleep(0) vs. Sleep(1) vs. SwitchToThread and there seems to be no definite answer which one to use in a spin lock. It all depends on the circumstances. re 4: Again, this depends on the circumstances. With a small protected section and low contention a spin lock might be way faster than a critical section. I was trying to find out whether that might solve some issues I had with a particular program. It turned out that it didn't (but again, I need to repeat the test taking into account what I have learned in the meantime), but this had started me into the topic.
  19. dummzeuch

    spinlock primitives

    Hm, shouldn't the assertion go into a constructor?
  20. dummzeuch

    spinlock primitives

    I read somewhere (when I was searching for 'Yield'), that Yield doesn't exist on Arm processors and there simply translates to NOP. Not sure whether I understood that correctly because at the time I wasn't really interested in Arm.
  21. dummzeuch

    spinlock primitives

    Yeah, right. Think again, Thomas. I did some tests and it turned out that in these tests(!) on my computer(!) Sleep(1) increased the throughput by more than 50% over Sleep(0), even though all threads were running in the same application and with the same priority: Sleep(0) 5 Writers 5 Readers Run1: Writes: 5738 Reads: 4683 [avg. per ms] Run2: Writes: 5662 Reads: 4716 [avg. per ms] Sleep(1) 5 Writers 5 Readers Run1: Writes: 10444 Reads: 7528 [avg. per ms] Run2: Writes: 8587 Reads: 9411 [avg. per ms] Note that it is quite possible that I bungled the tests. They are not as consistent as I would have expected.
  22. Actually I did less than a year ago: Compiling TeeChart 2020 for Delphi 2007 It won't help, of course.
  23. Unfortunately many well known commercial and open source libraries don't adhere to these. It's a major pain in the lower back every time I want to install Delphi on a new computer (which happens quite regularly, at least several times per year).
  24. dummzeuch

    spinlock primitives

    ... or simply assume a multi core system. When was the last time you saw a single core (Windows-) system in the wild? OK, a program could be restricted to a single core by the user or the OS, so there is that. And there are VMs which can also be configured to run on a single core even on a multi core system.
×