On Wednesday, 3 September 2014 at 03:05:42 UTC, Kevin Lamonte wrote:
On Tuesday, 2 September 2014 at 14:53:17 UTC, Dicebot wrote:
This is exactly what I call theoretical speculations. Please provide specific list like this:

1) some method signature needs to be changed

I propose the following API changes (+ changes on default implementation):

protected LogEntry beginLogMsg(string file, int line, string funcName, string prettyFuncName, string moduleName, LogLevel logLevel,
        Tid threadId, SysTime timestamp, Logger logger)
        @trusted
    {
        static if (isLoggingActive())
        {
return LogEntry(file, line, funcName, prettyFuncName, moduleName, logLevel, threadId, timestamp, null, logger);
        }
    }

    /** Logs a part of the log message. */
protected void logMsgPart(MsgRange msgAppender, const(char)[] msg)
    {
        static if (isLoggingActive())
        {
            msgAppender.put(msg);
        }
    }

/** Signals that the message has been written and no more calls to
    $(D logMsgPart) follow. */
protected void finishLogMsg(ref LogEntry entry, MsgRange msgAppender)
    {
        static if (isLoggingActive())
        {
            entry.msg = msgAppender.data;
            this.writeLogMsg(entry);
        }
    }

...with the corresponding changes to logImpl/logImplf to create msgAppender as a local function variable, and the elimination of header and msgAppender as Logger class variables.

The benefit to this change is that Logger (including stdlog) becomes thread-safe, as well as any subclass of Logger that only implements writeLogMsg().

The only problem with that change is that it will always require a buffer. FileLogger currently doesn't require a buffer and is already thread-safe.

stdlog will not be thread-safe by default by this change only syncing the writeLogMsg function will.

Reply via email to