Drop main() prototype. Syncs with NetBSD-8
[minix.git] / minix / lib / libvassert / vassert.h
blob0eca9533d392d77dfd7eb315883e5d9896287287
1 #ifndef _VASSERT_H_
2 #define _VASSERT_H_
4 #ifdef __cplusplus
5 extern "C"
7 #endif /*__cplusplus*/
9 #define ALIGNED(n) __attribute__((__aligned__(n)))
10 #define VASSERT_TRIGGER_OFFSET 1221
11 #define VASSERT_PAGE_SIZE 4096
13 /* Need to align at 4K. */
14 /* Ensure the inReplay flag is on its own page. */
15 #pragma pack(1)
16 typedef struct VAssert_StateWrapper {
17 char space1[VASSERT_TRIGGER_OFFSET];
18 volatile char inReplay;
19 char space[VASSERT_PAGE_SIZE - VASSERT_TRIGGER_OFFSET - sizeof(char)];
20 } VAssert_StateWrapper;
21 #pragma pack()
23 extern VAssert_StateWrapper vassert_state;
26 * User-selectable standard functions.
27 * XXX: Document these, in coordination with the SDK docs.
30 #if defined(__KERNEL__)
31 # define KERNEL_VASSERT
32 #endif
34 #ifdef KERNEL_VASSERT
36 # ifndef VASSERT_CUSTOM_ASSERT
37 # define VASSERT_CUSTOM_ASSERT(expr)
38 # endif
40 # ifndef VASSERT_CUSTOM_ABORT
41 # include <linux/kernel.h>
42 # define VASSERT_CUSTOM_ABORT() ((void)0) // printk(KERN_ALERT"VAssert abort at %s: %d", __FILE__, __LINE__)
43 # endif
45 # ifndef VASSERT_CUSTOM_LOG
46 # include <linux/kernel.h>
47 # define VASSERT_CUSTOM_LOG printk
48 # endif
50 #else
51 # ifndef VASSERT_CUSTOM_ASSERT
52 # include <assert.h>
53 # define VASSERT_CUSTOM_ASSERT assert
54 # endif
56 # ifndef VASSERT_CUSTOM_ABORT
57 # include <stdlib.h>
58 # define VASSERT_CUSTOM_ABORT abort
59 # endif
61 # ifndef VASSERT_CUSTOM_LOG
62 # include <stdio.h>
63 # define VASSERT_CUSTOM_LOG printf
64 # endif
65 #endif
67 /* Results: 0 if successful, -1 if not. */
68 // XXX need to automatic de-register trigger page when the program quits
69 extern char VAssert_Init(void);
70 extern char VAssert_Uninit(void);
73 * These functions should not be called directly; they need to be wrapped.
75 extern void VAssert_LogMain(const char *format, ...)
76 __attribute__((__format__(__printf__, 1, 2)));
77 extern void VAssert_GoLiveMain(void);
78 extern void VAssert_ReturnToReplayMain(void);
79 extern char VAssert_Trace(size_t max_size);
81 #ifdef VASSERT_ALWAYS_EXECUTE
83 #define VAssert_Assert(expr) \
84 do { \
85 VASSERT_CUSTOM_ASSERT(expr); \
86 } while (0)
88 #define VAssert_Log(args) \
89 do { \
90 VASSERT_CUSTOM_LOG args; \
91 } while (0)
93 #define VAssert_BeginBlock
94 #define VAssert_EndBlock
96 #else /* VASSERT_ALWAYS_EXECUTE */
98 #define VAssert_Assert(expr) \
99 do { \
100 if (vassert_state.inReplay) { \
101 if (!(expr)) { \
102 VAssert_GoLiveMain(); \
103 VASSERT_CUSTOM_ABORT(); \
104 } else { \
105 VAssert_ReturnToReplayMain(); \
108 } while (0)
110 #define VAssert_Log(args) \
111 do { \
112 if (vassert_state.inReplay) { \
113 VAssert_LogMain args; \
114 VAssert_ReturnToReplayMain(); \
116 } while (0)
118 #define VAssert_BeginBlock if (vassert_state.inReplay)
119 #define VAssert_EndBlock VAssert_ReturnToReplayMain()
121 #endif /* VASSERT_ALWAYS_EXECUTE */
124 * Record/Replay functionality
127 * Results: True if successful, false if not.
128 * Input: True to start recording, false to stop.
130 extern char VAssert_SetRecordingMain(char start);
132 #define VAssert_StartRecording() VAssert_SetRecordingMain(1)
133 #define VAssert_StopRecording() VAssert_SetRecordingMain(0)
135 #ifdef __cplusplus
137 #endif /*__cplusplus*/
139 #endif /*_VASSERT_H_*/