www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 16232] New: std.experimental.logger.core.sharedLog isn't

https://issues.dlang.org/show_bug.cgi?id=16232

          Issue ID: 16232
           Summary: std.experimental.logger.core.sharedLog isn't
                    thread-safe
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: phobos
          Assignee: nobody puremagic.com
          Reporter: ag0aep6g gmail.com

std.experimental.logger.core.sharedLog effectively casts a Logger to/from
shared. So you get a Logger that's shared among threads but it's not typed as
shared.

The predefined loggers may have all their operations properly synchronized, but
a user-defined logger doesn't necessarily.

----
import core.thread: Thread;
import core.time: seconds;
import std.experimental.logger: Logger, LogLevel, sharedLog;

class MyLogger : Logger
{
    this() { super(LogLevel.info); }

    int x = 0;

    override void writeLogMsg(ref LogEntry payload)  safe
    {
        // exaggerated ++x
        int y = x;
        ()  trusted { Thread.sleep(1.seconds); } ();
        x = y + 1;
    }
}

void main()
{
    auto myLogger = new MyLogger;
    sharedLog = myLogger;

    auto t = new Thread({ sharedLog.log(""); });
    t.start();

    // exaggerated ++myLogger.x
    int y = myLogger.x;
    Thread.sleep(2.seconds);
    myLogger.x = y + 1;

    t.join();
    assert(myLogger.x == 2); /* fails */
}
----

--
Jul 03 2016