JackError.cpp 3.47 KB
Newer Older
1
/*
sletz's avatar
sletz committed
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 Copyright (C) 2001 Paul Davis
 Copyright (C) 2004-2008 Grame
 Copyright (C) 2008 Nedko Arnaudov
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
 the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU Lesser General Public License for more details.
 
 You should have received a copy of the GNU Lesser General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 */
21
22
23
24
25
26
27

#include <stdarg.h>
#include <stdio.h>
#include "JackError.h"
#include "JackGlobals.h"
#include "JackMessageBuffer.h"

28
29
using namespace Jack;

sletz's avatar
sletz committed
30
static bool change_thread_log_function(jack_log_function_t log_function)
31
{
sletz's avatar
sletz committed
32
33
    return (jack_tls_get(JackGlobals::fKeyLogFunction) == NULL 
            && jack_tls_set(JackGlobals::fKeyLogFunction, (void*)log_function));
34
35
}

sletz's avatar
sletz committed
36
SERVER_EXPORT int set_threaded_log_function()
sletz's avatar
sletz committed
37
{
sletz's avatar
sletz committed
38
    return change_thread_log_function(JackMessageBufferAdd);
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
}

void jack_log_function(int level, const char *message)
{
    void (* log_callback)(const char *);

    switch (level)
    {
    case LOG_LEVEL_INFO:
        log_callback = jack_info_callback;
        break;
    case LOG_LEVEL_ERROR:
        log_callback = jack_error_callback;
        break;
    default:
        return;
    }

    log_callback(message);
}

60
static void jack_format_and_log(int level, const char *prefix, const char *fmt, va_list ap)
61
62
63
64
{
    char buffer[300];
    size_t len;
    jack_log_function_t log_function;
sletz's avatar
sletz committed
65

66
67
68
69
70
71
72
73
74
    if (prefix != NULL) {
        len = strlen(prefix);
        memcpy(buffer, prefix, len);
    } else {
        len = 0;
    }

    vsnprintf(buffer + len, sizeof(buffer) - len, fmt, ap);

75
    log_function = (jack_log_function_t)jack_tls_get(JackGlobals::fKeyLogFunction);
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

    /* if log function is not overriden for thread, use default one */
    if (log_function == NULL)
    {
        log_function = jack_log_function;
        //log_function(LOG_LEVEL_INFO, "------ Using default log function");
    }
    else
    {
        //log_function(LOG_LEVEL_INFO, "++++++ Using thread-specific log function");
    }

    log_function(level, buffer);
}

91
SERVER_EXPORT void jack_error(const char *fmt, ...)
92
93
94
95
96
97
98
{
	va_list ap;
	va_start(ap, fmt);
	jack_format_and_log(LOG_LEVEL_ERROR, NULL, fmt, ap);
	va_end(ap);
}

99
SERVER_EXPORT void jack_info(const char *fmt, ...)
100
101
102
103
104
105
106
{
	va_list ap;
	va_start(ap, fmt);
	jack_format_and_log(LOG_LEVEL_INFO, NULL, fmt, ap);
	va_end(ap);
}

107
SERVER_EXPORT void jack_log(const char *fmt,...)
108
{
sletz's avatar
sletz committed
109
	if (JackGlobals::fVerbose) {
110
111
112
113
114
115
116
		va_list ap;
		va_start(ap, fmt);
        jack_format_and_log(LOG_LEVEL_INFO, "Jack: ", fmt, ap);
		va_end(ap);
	}
}

sletz's avatar
sletz committed
117
SERVER_EXPORT void default_jack_error_callback(const char *desc)
118
119
120
121
122
{
    fprintf(stderr, "%s\n", desc);
    fflush(stderr);
}

sletz's avatar
sletz committed
123
SERVER_EXPORT void default_jack_info_callback(const char *desc)
124
125
126
127
128
{
    fprintf(stdout, "%s\n", desc);
    fflush(stdout);
}

sletz's avatar
sletz committed
129
130
131
132
133
134
SERVER_EXPORT void silent_jack_error_callback(const char *desc)
{}

SERVER_EXPORT void silent_jack_info_callback(const char *desc)
{}

135
136
SERVER_EXPORT void (*jack_error_callback)(const char *desc) = &default_jack_error_callback;
SERVER_EXPORT void (*jack_info_callback)(const char *desc) = &default_jack_info_callback;