1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
/* tabulators */
char tabs[1024];
#ifdef DBG_THREADS
#include <pthread.h>
static pthread_key_t align_key;
static pthread_once_t align_key_once = PTHREAD_ONCE_INIT;
static void
align_destroy(void *align)
{
free(align);
}
static void
align_key_create()
{
pthread_key_create(&align_key, align_destroy);
}
void
debug_init_threads()
{
int *new_align;
memset(tabs, 9, 1024);
if (!(new_align = malloc(sizeof(int))))
abort();
*new_align = 1;
pthread_once(&align_key_once, align_key_create);
pthread_setspecific(align_key, new_align);
}
#endif
/*
* no threads
*/
static int main_align = 1;
void
debug_init_nothreads()
{
memset(tabs, 9, 1024);
}
void
fn_begin(char *format, ...)
{
va_list args;
char msg_buf[1024];
char final_msg[2048];
int *align;
#ifdef DBG_THREADS
align = pthread_getspecific(align_key);
#else
align = &main_align;
#endif
va_start(args, format);
vsprintf(msg_buf, format, args);
va_end(args);
strcat(msg_buf, " {\n");
sprintf(final_msg, "%d: %.*s%s", getpid(), *align, tabs, msg_buf);
fprintf(stderr, "%s", final_msg);
(*align)++;
}
void
fn_end()
{
int *align;
#ifdef DBG_THREADS
align = pthread_getspecific(align_key);
#else
align = &main_align;
#endif
(*align)--;
fprintf(stderr, "%d: %.*s}\n", getpid(), *align, tabs);
}
/*
void
fn2(int i)
{
_D(fn_begin("fn2(i = %d)", i));
return_void();
}
int
fn1()
{
_D(fn_begin("fn1"));
fn2(1);
return_val(0);
}
int
main()
{
_D(fn_begin("main"));
fn1();
fn2(2);
return_val(0);
}
*/
|