1 #include <stdlib.h>
2 #define CANVAS_PATH "CANVAS_PATH"
3 
4 class SkFile {
5   FILE* file;
6   bool busted;
7   char* sz;
8   mutable int i;
9 
10 public:
SkFile(unsigned long id)11   SkFile(unsigned long id) {
12     file = NULL;
13     busted = false;
14     sz = new char[100000];
15     set(id);
16     i = 100;
17   }
18 
~SkFile()19   ~SkFile() {
20     delete sz;
21     if (file) {
22       fclose(file);
23     }
24   }
25 
set(unsigned long id)26   void set(unsigned long id) {
27     if (busted) {
28       return;
29     }
30 
31     if (file == NULL) {
32       char sz[10000];
33       sprintf(sz, "%s\\%ul.callstacks.txt", getenv(CANVAS_PATH), id);
34       file = fopen(sz, "a");
35       if (file == NULL) {
36         busted = true;
37       }
38       fprintf(file, "\n\n\nNEW SESSION, just coliding ids ... should generate a new file ideally ...  \n\n\n");
39     }
40   }
41 
appendLine(const char * sz)42   void appendLine(const char* sz) const {
43     if (busted) {
44       return;
45     }
46 
47     fprintf(file, "%s\n", sz);
48   }
49 
50   void dump(bool flush = false) const {
51     if (busted) {
52       return;
53     }
54 
55     LightSymbol::GetCallStack(sz, 100000, " >- ");
56     appendLine(sz);
57 
58     i--;
59 
60     if (i < 0 || flush) {
61       i = 100;
62       fflush(file);
63     }
64   }
65 };
66