summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2006-11-04 05:20:01 +0000
committerAkira TAGOH <akira@tagoh.org>2006-11-04 05:20:01 +0000
commit9717851f69f0ceae508e162768b098d6f58d6c4b (patch)
tree9f3bf30d807de45833eea38653870e235b0e42a0
parent01dab26bc877a730a7ab8a4bbc7f328a2260367a (diff)
2006-11-04 Akira TAGOH <at@gclab.org>
* hieroglyph/vm.c (hg_vm_init): initialize logger facility. (hg_vm_finalize): finalize logger. * hieroglyph/hglog.c (hg_log_set_flag): new function. (hg_logv): allow to output a message without initialization.
-rw-r--r--ChangeLog8
-rw-r--r--hieroglyph/hglog.c133
-rw-r--r--hieroglyph/hglog.h11
-rw-r--r--hieroglyph/version.h.in2
-rw-r--r--hieroglyph/vm.c2
5 files changed, 83 insertions, 73 deletions
diff --git a/ChangeLog b/ChangeLog
index cf3d5c0..d415bcf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-11-04 Akira TAGOH <at@gclab.org>
+
+ * hieroglyph/vm.c (hg_vm_init): initialize logger facility.
+ (hg_vm_finalize): finalize logger.
+
+ * hieroglyph/hglog.c (hg_log_set_flag): new function.
+ (hg_logv): allow to output a message without initialization.
+
2006-10-22 Akira TAGOH <at@gclab.org>
* hieroglyph/Makefile.am (libhieroglyph_la_SOURCES): added hglog.c.
diff --git a/hieroglyph/hglog.c b/hieroglyph/hglog.c
index 3a44c58..5cc8fbe 100644
--- a/hieroglyph/hglog.c
+++ b/hieroglyph/hglog.c
@@ -26,22 +26,26 @@
#endif
#include "hglog.h"
+#include "hgallocator-bfit.h"
#include "hgdict.h"
#include "hgfile.h"
#include "hgmem.h"
#include "hgstring.h"
#include "hgvaluenode.h"
-#include "vm.h"
+#define HG_LOG_POOL_SIZE 3000000
+
static void _hg_log_default_handler(HgLogType log_type,
const gchar *domain,
const gchar *subtype,
- const gchar *message);
+ const gchar *message,
+ gpointer data);
static gboolean __hg_log_initialized = FALSE;
static HgDict *__hg_log_options_dict = NULL;
-static HgVM *__hg_log_vm = NULL;
+static HgMemPool *__hg_log_mem_pool = NULL;
+static HgAllocator *__hg_log_allocator = NULL;
static gchar const *log_type_to_string[] = {
"Info",
"Debug",
@@ -49,6 +53,7 @@ static gchar const *log_type_to_string[] = {
"Error",
};
static HgLogFunc __hg_log_handler = _hg_log_default_handler;
+static gpointer __hg_log_handler_data = NULL;
/*
* Private Functions
@@ -57,25 +62,28 @@ static void
_hg_log_default_handler(HgLogType log_type,
const gchar *domain,
const gchar *subtype,
- const gchar *message)
+ const gchar *message,
+ gpointer data)
{
- HgFileObject *file;
gchar *header;
- if (__hg_log_vm) {
- file = hg_vm_get_io(__hg_log_vm, VM_IO_STDERR);
+ header = hg_log_get_log_type_header(log_type, domain);
+ if (!hg_file_is_initialized()) {
+ g_printerr("%s ***%s%s%s %s\n",
+ header,
+ (subtype ? " " : ""),
+ (subtype ? subtype : ""),
+ (subtype ? ":" : ""),
+ message);
} else {
- if (!hg_file_is_initialized())
- hg_file_init();
- file = __hg_file_stderr;
+ hg_stderr_printf("%s ***%s%s%s %s\n",
+ header,
+ (subtype ? " " : ""),
+ (subtype ? subtype : ""),
+ (subtype ? ":" : ""),
+ message);
}
- header = hg_log_get_log_type_header(log_type, domain);
- hg_file_object_printf(file, "%s ***%s%s%s %s\n",
- header,
- (subtype ? " " : ""),
- (subtype ? subtype : ""),
- (subtype ? ":" : ""),
- message);
+ g_free(header);
}
/*
@@ -83,30 +91,16 @@ _hg_log_default_handler(HgLogType log_type,
*/
/* initializer */
gboolean
-hg_log_init(HgVM *vm,
- HgDict *dict)
+hg_log_init(void)
{
- HgMemObject *obj;
-
- g_return_val_if_fail (vm != NULL, FALSE);
- g_return_val_if_fail (dict != NULL, FALSE);
-
- if (__hg_log_options_dict == NULL) {
- hg_mem_get_object__inline(dict, obj);
- if (obj == NULL) {
- hg_log_warning("Invalid object %p to be set as Log Dict.", dict);
- return FALSE;
- }
- hg_mem_set_lock(obj);
- __hg_log_options_dict = dict;
-
- hg_mem_get_object__inline(vm, obj);
- if (obj == NULL) {
- hg_log_warning("Invalid object %p to be set as Log VM.", vm);
- return FALSE;
- }
- hg_mem_set_lock(obj);
- __hg_log_vm = vm;
+ if (!__hg_log_initialized) {
+ __hg_log_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable());
+ __hg_log_mem_pool = hg_mem_pool_new(__hg_log_allocator,
+ "Memory pool for HgLog",
+ HG_LOG_POOL_SIZE,
+ HG_MEM_GLOBAL);
+ __hg_log_options_dict = hg_dict_new(__hg_log_mem_pool,
+ 65535);
__hg_log_handler = _hg_log_default_handler;
__hg_log_initialized = TRUE;
@@ -118,30 +112,39 @@ hg_log_init(HgVM *vm,
void
hg_log_finalize(void)
{
- HgMemObject *obj;
-
if (__hg_log_initialized) {
- hg_mem_get_object__inline(__hg_log_options_dict, obj);
- if (obj != NULL) {
- hg_mem_set_unlock(obj);
- }
- __hg_log_options_dict = NULL;
- hg_mem_get_object__inline(__hg_log_vm, obj);
- if (obj != NULL) {
- hg_mem_set_unlock(obj);
- }
- __hg_log_vm = NULL;
__hg_log_initialized = FALSE;
+ __hg_log_options_dict = NULL;
+ hg_mem_pool_destroy(__hg_log_mem_pool);
+ hg_allocator_destroy(__hg_log_allocator);
+ __hg_log_mem_pool = NULL;
+ __hg_log_allocator = NULL;
}
}
/* utilities */
void
-hg_log_set_default_handler(HgLogFunc func)
+hg_log_set_default_handler(HgLogFunc func,
+ gpointer user_data)
{
g_return_if_fail (func);
__hg_log_handler = func;
+ __hg_log_handler_data = user_data;
+}
+
+void
+hg_log_set_flag(const gchar *key,
+ gboolean val)
+{
+ HgValueNode *k, *v;
+
+ g_return_if_fail (__hg_log_initialized);
+ g_return_if_fail (key != NULL);
+
+ HG_VALUE_MAKE_NAME_STATIC (__hg_log_mem_pool, k, key);
+ HG_VALUE_MAKE_BOOLEAN (__hg_log_mem_pool, v, val);
+ hg_dict_insert(__hg_log_mem_pool, __hg_log_options_dict, k, v);
}
gchar *
@@ -185,37 +188,31 @@ hg_logv(HgLogType log_type,
g_return_if_fail (format != NULL);
if (subtype == NULL) {
+ default_logger:;
gchar *buffer = g_strdup_vprintf(format, va_args);
/* just invoke a default handler */
- __hg_log_handler(log_type, domain, subtype, buffer);
+ __hg_log_handler(log_type, domain, subtype, buffer, __hg_log_handler_data);
g_free(buffer);
return;
}
- g_return_if_fail (__hg_log_initialized);
-
- if ((node = hg_dict_lookup_with_string(__hg_log_options_dict, subtype)) != NULL) {
- HgMemPool *pool = hg_vm_get_current_pool(__hg_log_vm);
-
- string = hg_string_new(pool, -1);
+ if (!__hg_log_initialized) {
+#ifdef DEBUG
+ goto default_logger;
+#endif /* DEBUG */
+ } else if ((node = hg_dict_lookup_with_string(__hg_log_options_dict, subtype)) != NULL) {
+ string = hg_string_new(__hg_log_mem_pool, -1);
hg_string_append_vprintf(string, format, va_args);
if (HG_IS_VALUE_BOOLEAN (node)) {
if (HG_VALUE_GET_BOOLEAN (node)) {
/* just invoke a default handler */
- __hg_log_handler(log_type, domain, subtype, hg_string_get_string(string));
+ __hg_log_handler(log_type, domain, subtype, hg_string_get_string(string), __hg_log_handler_data);
}
} else if (HG_IS_VALUE_OPERATOR (node) ||
(HG_IS_VALUE_ARRAY (node) && hg_object_is_executable((HgObject *)node))) {
- HgValueNode *strnode = NULL, *subnode, *lognode;
- HG_VALUE_MAKE_STRING (strnode, string);
- lognode = hg_vm_get_name_node(__hg_log_vm, log_type_to_string[log_type]);
- subnode = hg_vm_get_name_node(__hg_log_vm, subtype);
hg_log_warning("FIXME: not yet supported.");
-
- if (strnode)
- hg_mem_free(strnode);
} else {
hg_log_warning("Invalid object specified for logger.");
}
diff --git a/hieroglyph/hglog.h b/hieroglyph/hglog.h
index b9b42d8..9a6b868 100644
--- a/hieroglyph/hglog.h
+++ b/hieroglyph/hglog.h
@@ -32,7 +32,8 @@ G_BEGIN_DECLS
typedef void (*HgLogFunc)(HgLogType log_type,
const gchar *domain,
const gchar *subtype,
- const gchar *message);
+ const gchar *message,
+ gpointer user_data);
#define hg_log_info(...) \
hg_log(HG_LOG_TYPE_INFO, HG_LOG_DOMAIN, NULL, __VA_ARGS__)
@@ -48,10 +49,12 @@ typedef void (*HgLogFunc)(HgLogType log_type,
hg_log(HG_LOG_TYPE_ERROR, HG_LOG_DOMAIN, NULL, __VA_ARGS__)
-gboolean hg_log_init (HgVM *vm,
- HgDict *dict);
+gboolean hg_log_init (void);
void hg_log_finalize (void);
-void hg_log_set_default_handler(HgLogFunc func);
+void hg_log_set_default_handler(HgLogFunc func,
+ gpointer user_data);
+void hg_log_set_flag (const gchar *key,
+ gboolean val);
gchar *hg_log_get_log_type_header(HgLogType log_type,
const gchar *domain) G_GNUC_MALLOC;
void hg_log (HgLogType log_type,
diff --git a/hieroglyph/version.h.in b/hieroglyph/version.h.in
index 8924588..4dbad8d 100644
--- a/hieroglyph/version.h.in
+++ b/hieroglyph/version.h.in
@@ -29,7 +29,7 @@
G_BEGIN_DECLS
#define HIEROGLYPH_VERSION "@VERSION@"
-#define HIEROGLYPH_UUID "cf4ff615-1777-464f-b68c-99ffdf8c3341"
+#define HIEROGLYPH_UUID "7f4b1b31-6cd2-41b5-8ec2-f27bf6615dac"
const char *__hg_rcsid G_GNUC_UNUSED = "$Rev$";
diff --git a/hieroglyph/vm.c b/hieroglyph/vm.c
index 516e593..658b809 100644
--- a/hieroglyph/vm.c
+++ b/hieroglyph/vm.c
@@ -378,6 +378,7 @@ hg_vm_init(void)
hg_mem_init();
hg_value_node_init();
hg_file_init();
+ hg_log_init();
hg_list_init();
__hg_vm_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable());
@@ -408,6 +409,7 @@ hg_vm_finalize(void)
hg_list_finalize();
hg_file_finalize();
hg_value_node_finalize();
+ hg_log_finalize();
hg_mem_finalize();
__hg_vm_is_initialized = FALSE;