diff --git a/src/engine/e_log.pas b/src/engine/e_log.pas
index 523c27f068de6ab6392058a12714edf8bda543ed..ed4cfe525f4479957cca8754c690a99be9f64b4c 100644 (file)
--- a/src/engine/e_log.pas
+++ b/src/engine/e_log.pas
procedure e_InitLog (fFileName: String; fWriteMode: TWriteMode);
procedure e_DeinitLog ();
+procedure e_SetSafeSlowLog (slowAndSafe: Boolean);
+
procedure e_WriteLog (TextLine: String; RecordCategory: TRecordCategory; WriteTime: Boolean=True);
function DecodeIPV4 (ip: LongWord): string;
procedure e_InitWritelnDriver ();
procedure e_LogWritefln (const fmt: AnsiString; args: array of const; category: TRecordCategory=MSG_NOTIFY; writeTime: Boolean=true);
+procedure e_LogWriteln (const s: AnsiString; category: TRecordCategory=MSG_NOTIFY; writeTime: Boolean=true);
+
+
+procedure e_WriteStackTrace (const msg: AnsiString);
var
@@ -66,54 +72,12 @@ procedure e_WriteLog (TextLine: String; RecordCategory: TRecordCategory; WriteTi
begin
e_LogWritefln('%s', [TextLine], RecordCategory, WriteTime);
end;
-(*
-var
- LogFile: TextFile;
- Prefix: ShortString = '';
- OutStr: String;
-begin
- if driverInited and (length(TextLine) > 0) then
- begin
- case RecordCategory of
- MSG_FATALERROR: write('FATAL: ');
- MSG_WARNING: write('WARNING: ');
- end;
- writeln(TextLine);
- end;
- if FileName = '' then Exit;
- Assign(LogFile, FileName);
- try
- if FileExists(FileName) then
- Append(LogFile)
- else
- Rewrite(LogFile);
- try
- if FirstRecord then
- begin
- Writeln(LogFile, '--- Log started at '+TimeToStr(Time)+' ---');
- FirstRecord := False;
- end;
- case RecordCategory of
- MSG_FATALERROR: Prefix := '!!!';
- MSG_WARNING: Prefix := '! ';
- MSG_NOTIFY: Prefix := '***';
- end;
- if WriteTime then
- OutStr := '['+TimeToStr(Time)+'] '+Prefix+' '+TextLine
- else
- OutStr := Prefix+' '+TextLine;
- Writeln(LogFile, OutStr);
- if e_WriteToStdOut then
- Writeln(OutStr);
- finally
- Close(LogFile);
- end;
- except // sorry
- end;
+procedure e_LogWriteln (const s: AnsiString; category: TRecordCategory=MSG_NOTIFY; writeTime: Boolean=true);
+begin
+ e_LogWritefln('%s', [s], category, writeTime);
end;
-*)
// returns formatted string if `writerCB` is `nil`, empty string otherwise
while (len > 0) do
begin
if (len > 255) then slen := 255 else slen := Integer(len);
- Move(b^, ss[1], len);
+ Move(b^, ss[1], slen);
ss[0] := AnsiChar(slen);
write(ss);
b += slen;
xlogPrefix: AnsiString;
xlogLastWasEOL: Boolean = false;
xlogWantSpace: Boolean = false;
+ xlogSlowAndSafe: Boolean = false;
+
+
+procedure e_SetSafeSlowLog (slowAndSafe: Boolean);
+begin
+ xlogSlowAndSafe := slowAndSafe;
+ if xlogSlowAndSafe and xlogFileOpened then
+ begin
+ CloseFile(xlogFile);
+ xlogFileOpened := false;
+ end;
+end;
+
procedure logwriter (constref buf; len: SizeUInt);
var
while (len > 0) do
begin
slen := 0;
- while (slen < len) and (slen < 255) and (b[slen] <> 13) and (b[slen] <> 10) do Inc(slen);
+ while (slen < len) and (b[slen] <> 13) and (b[slen] <> 10) do Inc(slen);
+ if (slen > 255) then slen := 255;
// print string
if (slen > 0) then
begin
if xlogWantSpace then begin write(xlogFile, ' '); xlogWantSpace := false; end;
- Move(b^, ss[1], len);
+ Move(b^, ss[1], slen);
ss[0] := AnsiChar(slen);
write(xlogFile, ss);
b += slen;
// process newline
if (len > 0) and ((b[0] = 13) or (b[0] = 10)) then
begin
- if (len > 1) and (b[0] = 13) and (b[1] = 10) then
- begin
- len -= 2;
- b += 2;
- end
- else
- begin
- len -= 1;
- b += 1;
- end;
+ if (b[0] = 13) then begin len -= 1; b += 1; end;
+ if (len > 0) and (b[0] = 10) then begin len -= 1; b += 1; end;
xlogLastWasEOL := false;
writeln(xlogFile, '');
write(xlogFile, xlogPrefix);
formatstrf(fmt, args, logwriter);
if not xlogLastWasEOL then writeln(xlogFile, '') else writeln(xlogFile, xlogPrefix);
+ if xlogSlowAndSafe and xlogFileOpened then
+ begin
+ CloseFile(xlogFile);
+ xlogFileOpened := false;
+ end;
+
//if fopened then CloseFile(xlogFile);
end;
end;
+{$I-}
+procedure e_WriteStackTrace (const msg: AnsiString);
+var
+ tfo: TextFile;
+begin
+ e_LogWriteln(msg, MSG_FATALERROR);
+ if (Length(FileName) > 0) then
+ begin
+ if xlogFileOpened then CloseFile(xlogFile);
+ xlogFileOpened := false;
+ AssignFile(tfo, FileName);
+ Append(tfo);
+ if (IOResult <> 0) then Rewrite(tfo);
+ if (IOResult = 0) then begin writeln(tfo, '====================='); DumpExceptionBackTrace(tfo); CloseFile(tfo); end;
+ end;
+end;
+
+
procedure e_DeinitLog ();
begin
if xlogFileOpened then CloseFile(xlogFile);