gallium: ddebug: Add missing fence related wrappers
[mesa.git] / src / gallium / auxiliary / driver_ddebug / dd_util.h
1 /**************************************************************************
2 *
3 * Copyright 2015 Advanced Micro Devices, Inc.
4 * Copyright 2008 VMware, Inc.
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * on the rights to use, copy, modify, merge, publish, distribute, sub
11 * license, and/or sell copies of the Software, and to permit persons to whom
12 * the Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the
16 * Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 * USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #ifndef DD_UTIL_H
29 #define DD_UTIL_H
30
31 #include <stdio.h>
32 #include <errno.h>
33
34 #include "c99_alloca.h"
35 #include "os/os_process.h"
36 #include "util/u_atomic.h"
37 #include "util/u_debug.h"
38 #include "util/u_string.h"
39
40 #include "pipe/p_config.h"
41 #if defined(PIPE_OS_UNIX)
42 #include <unistd.h>
43 #include <sys/stat.h>
44 #elif defined(PIPE_OS_WINDOWS)
45 #include <direct.h>
46 #include <process.h>
47 #define mkdir(dir, mode) _mkdir(dir)
48 #endif
49
50
51 /* name of the directory in home */
52 #define DD_DIR "ddebug_dumps"
53
54 static inline void
55 dd_get_debug_filename_and_mkdir(char *buf, size_t buflen, bool verbose)
56 {
57 static unsigned index;
58 char proc_name[128], dir[256];
59
60 if (!os_get_process_name(proc_name, sizeof(proc_name))) {
61 fprintf(stderr, "dd: can't get the process name\n");
62 strcpy(proc_name, "unknown");
63 }
64
65 util_snprintf(dir, sizeof(dir), "%s/"DD_DIR, debug_get_option("HOME", "."));
66
67 if (mkdir(dir, 0774) && errno != EEXIST)
68 fprintf(stderr, "dd: can't create a directory (%i)\n", errno);
69
70 util_snprintf(buf, buflen, "%s/%s_%u_%08u", dir, proc_name, getpid(),
71 p_atomic_inc_return(&index) - 1);
72
73 if (verbose)
74 fprintf(stderr, "dd: dumping to file %s\n", buf);
75 }
76
77 static inline FILE *
78 dd_get_debug_file(bool verbose)
79 {
80 char name[512];
81 FILE *f;
82
83 dd_get_debug_filename_and_mkdir(name, sizeof(name), verbose);
84 f = fopen(name, "w");
85 if (!f) {
86 fprintf(stderr, "dd: can't open file %s\n", name);
87 return NULL;
88 }
89
90 return f;
91 }
92
93 static inline void
94 dd_parse_apitrace_marker(const char *string, int len, unsigned *call_number)
95 {
96 unsigned num;
97 char *s;
98
99 if (len <= 0)
100 return;
101
102 /* Make it zero-terminated. */
103 s = alloca(len + 1);
104 memcpy(s, string, len);
105 s[len] = 0;
106
107 /* Parse the number. */
108 errno = 0;
109 num = strtol(s, NULL, 10);
110 if (errno)
111 return;
112
113 *call_number = num;
114 }
115
116 #endif /* DD_UTIL_H */