NOTE : the entire code we are talking about is in the tiny url in my previous post.

On Thursday, 7 January 2021 at 01:55:07 UTC, SealabJaster wrote:
On Wednesday, 6 January 2021 at 17:05:02 UTC, ludo wrote:
...

Using a static class like this seems to mostly be a design decision. So in otherwords, this class is essentially being used as a unique namespace for all of the other functions. Another way to look at it is just a singleton without a `.instance` getter.

Ok, I agree that ends up being a kind of strange singleton. But yes it was D v1 code. Do we agree that the following multi-threaded singleton pattern is the proper way as of today, instead of this static functions in a non static class (in multithreaded environment)?
----
shared(T) singleton()
{
 static shared T instance;

 if(!instance)
 {
   synchronized
   {
     if(!instance)
     instance = new shared(T)();
   }
 }

 return instance;
}
---


As for some of the other stuff, Associative Array literals in D can't actually be used at compile-time (at least, last time I tried), so they have to be created inside of the static constructor.

OK, I found https://dlang.org/spec/hash-map.html#static_initialization
Quote from that doc:
"Static Initialization of AAs
 NOTE: Not yet implemented. "
If I understand, as of today an AA init depends on a runtime function for historical reasons. A bit weird for an array indeed perfectly known at compile time, but someday some core language contributor will have a look at it, I guess.


Next is the mutex. `Object` is the base class that every class in D will implicitly inherit from, like in C# for example. Object has a `.monitor` field which is basically just a mutex, so is used with multi-threading synchronisation. I find it a bit odd that they're just returning an object instead of a Mutex (module core.sync.mutex), but I'm sure there's a reason why.

If we consider the class from my first post, the comment coming with the getMutex func is following in the original code that I am "cleaning-up": "Get an OpenAL mutex to ensure that no two threads ever execute OpenAL functionality simultaneously."

But the OpenAL class only has one function (anotherFunc), and as you say SealabJaster, it looks odd to use this Object mutex. I see two options to replace this mutex thing: * make the entire class synchronized (writing "synchronized class OpenAL") * make the anotherFunc function synchronized. So just one keyword to add! If I understand well, this will accomplish the goal quoted with no further comestics needed! Only one keyword over explicitely using object mutex. Am I right?

Thanks

Reply via email to