The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

    • RT @nadineswagerman: Iemand mailde me dat een 13-jarig meisje mijn novelle had uitgekozen om te lezen/bespreken op school. Het boek bevat 9… 4 hours ago
    • RT @jilles_com: Afgelopen 10 dagen hebben we door NL gereisd, elke dag een nieuw hotel en op heel veel locaties gegeten. In 60% van de geva… 4 hours ago
    • RT @FTM_nl: Sywert van Lienden plaatste bewust een serie tweets om het ministerie onder druk te zetten om de omstreden mondkapjesdeal met h… 4 hours ago
    • RT @ArmsControlWonk: China just used a rocket to put a space plane in orbit and the space plane glided back to earth. Orbital bombardment i… 4 hours ago
    • RT @shossontwits: O jee. Nu dit weer. 5 hours ago
  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 2,482 other followers

Delphi threadvar: TLS thread local storage

Posted by jpluimers on 2019/02/07

Managing TLS correctly with all kinds of dynamic storage seems to be a nightmare.

From what I think it’s safe to use a TStopWatch [WayBackSystem.Diagnostics.TStopwatch (introduced in Delphi XE2) as threadvar (which gets into TLS: Thread-local storage) because it’s a record type and as a bonus will be zero-initialised in something like this:

threadvar
 ThreadStopwatch: TStopwatch; // threadvars are zero-initialised, like TStopwatch.Reset was called. Ensure TStopwatch.InitStopwatchType called before using this.

... thread code:
var
  lThreadElapsedMilliseconds: string;
begin
...
  if not ThreadStopwatch.IsRunning then
    ThreadStopwatch.Start;
  try
    lThreadElapsedMilliseconds := ThreadStopwatch.ElapsedMilliseconds.ToString();
    // log duration of call-to-call somewhere
... logic
    lThreadElapsedMilliseconds := ThreadStopwatch.ElapsedMilliseconds.ToString();
    // log duration of logic somewhere
  finally
    ThreadStopwatch := TStopwatch.StartNew; // resets new count
  end;

As long as I perform this in the main thread somwehere to pre-initialise the class variable, then no thread should have the penalty for that:

TStopwatch.Create(); // ensures non-public TStopwatch.InitStopwatchType is called, enabling the threadvar ThreadStopwatch get the penalty for that

If I ever need to dig deeper into TLS with Delphi, then these are starters:

–jeroen

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

 
%d bloggers like this: