digitalmars.D.bugs - [Issue 16232] New: std.experimental.logger.core.sharedLog isn't
- via Digitalmars-d-bugs (50/50) Jul 03 2016 https://issues.dlang.org/show_bug.cgi?id=16232
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