1 /**
2 Copyright: Copyright (c) 2016-2018 Andrey Penechko.
3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6 module voxelman.log.binlog;
7 
8 import core.sync.mutex;
9 import std.stdio : File;
10 
11 import voxelman.utils.filewriter;
12 import cbor;
13 
14 void binlog(T...)(T args) {
15 	logger.log(args);
16 }
17 
18 void initBinLog(string filename) {
19 	logger.open(filename);
20 }
21 
22 void closeBinLog() {
23 	logger.close();
24 }
25 
26 private __gshared BinLogger logger;
27 
28 private struct BinLogger
29 {
30 	Mutex mutex;
31 	File file;
32 	FileWriter writer;
33 
34 	void open(string filename)
35 	{
36 		file.open(filename, "wb+");
37 		writer = FileWriter(file);
38 		mutex = new Mutex;
39 	}
40 
41 	void log(T...)(T args)
42 	{
43 		synchronized(mutex)
44 		{
45 			encodeCborArrayHeader(writer, args.length);
46 			foreach(arg; args)
47 			{
48 				encodeCbor(writer, arg);
49 			}
50 		}
51 	}
52 
53 	void close()
54 	{
55 		synchronized(mutex)
56 		{
57 			writer.flush();
58 			file.close();
59 		}
60 		destroy(mutex);
61 	}
62 }