On 24/06/11 09:57, d coder wrote:
Hello List

I am working on an application where I would normally be using
multithreading. But sometimes, depending on how much data sharing is
being shared, I might want to invoke the same application in
single-threaded mode.

Now when I invoke it in single-threaded mode, I would not like to have
all the overhead incurred due to mutex/monitor locking. Does DMD have
some compile time flags to achieve that.

One way I can think about achieving this is by enclosing all the
'synchronized' declarations inside small version blocks. But I am afraid
this would make the code quite unwieldy.
Is there a recommended way of achieving this end?

Regards
- Puneet

Yes, there is a flag .. in the source code! Just download the source and apply this patch:

diff -r 2c283d0f3a2c dmd/func.c
--- a/dmd/func.c        Fri Jun 24 10:26:15 2011 +0100
+++ b/dmd/func.c        Fri Jun 24 10:26:31 2011 +0100
@@ -183,7 +183,7 @@
             stc |= STCimmutable;
         if (type->isConst())
             stc |= STCconst;
-        if (type->isShared() || storage_class & STCsynchronized)
+        if (type->isShared())
             stc |= STCshared;
         if (type->isWild())
             stc |= STCwild;

Then compile and keep both on standby for when you need it!

Doing the above removes the following stuff from the object file, which is not present with unsynchronized methods.

                sub     ESP,8
                mov     -4[EBP],EAX
                mov     -8[EBP],EAX
                push    EAX
                call      _d_monitorenter@PC32
                mov     EAX,-4[EBP]
86a94,96
                push    dword ptr -8[EBP]
                call      _d_monitorexit@PC32
                add     ESP,8

Reply via email to