]> Shamusworld >> Repos - virtualjaguar/blob - src/log.cpp
Fix to M68K core vs. DSP thread sync problem.
[virtualjaguar] / src / log.cpp
1 //
2 // Log handler
3 //
4 // Originally by David Raingeard (Cal2)
5 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
6 // Cleanups/new stuff by James Hammons
7 // (C) 2010 Underground Software
8 //
9 // JLH = James Hammons <jlhamm@acm.org>
10 //
11 // Who  When        What
12 // ---  ----------  -------------------------------------------------------------
13 // JLH  01/16/2010  Created this log ;-)
14 // JLH  07/11/2011  Instead of dumping out on max log file size being reached, we
15 //                  now just silently ignore any more output. 10 megs ought to be
16 //                  enough for anybody. ;-) Except when it isn't. :-P
17 //
18
19 #include "log.h"
20
21 #include <stdlib.h>
22 #include <stdarg.h>
23 #include "types.h"
24
25 //#define MAX_LOG_SIZE          10000000                                // Maximum size of log file (10 MB)
26 #define MAX_LOG_SIZE            100000000                               // Maximum size of log file (100 MB)
27
28 static FILE * log_stream = NULL;
29 static uint32 logSize = 0;
30
31 int LogInit(const char * path)
32 {
33         log_stream = fopen(path, "w");
34
35         if (log_stream == NULL)
36                 return 0;
37
38         return 1;
39 }
40
41 FILE * LogGet(void)
42 {
43         return log_stream;
44 }
45
46 void LogDone(void)
47 {
48         if (log_stream != NULL)
49                 fclose(log_stream);
50 }
51
52 //
53 // This logger is used mainly to ensure that text gets written to the log file
54 // even if the program crashes. The performance hit is acceptable in this case!
55 //
56 void WriteLog(const char * text, ...)
57 {
58         va_list arg;
59         va_start(arg, text);
60
61         if (log_stream == NULL)
62         {
63                 va_end(arg);
64                 return;
65         }
66
67         logSize += vfprintf(log_stream, text, arg);
68
69         if (logSize > MAX_LOG_SIZE)
70         {
71                 // Instead of dumping out, we just close the file and ignore any more output.
72                 fflush(log_stream);
73                 fclose(log_stream);
74                 log_stream = NULL;
75         }
76
77         va_end(arg);
78         fflush(log_stream);                                     // Make sure that text is written!
79 }