summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Young <dyoung@hdfgroup.org>2020-02-11 16:52:48 (GMT)
committerDavid Young <dyoung@hdfgroup.org>2020-02-12 19:28:33 (GMT)
commit2b7347d5773fc91475ce6a18e0e96b40f0b8cb94 (patch)
tree5c7bed08103ef343d70f3fecb83f7fe3fe4e109a
parenta3e6c35b2d90864b6a561daf58564ad999daac6f (diff)
downloadhdf5-2b7347d5773fc91475ce6a18e0e96b40f0b8cb94.zip
hdf5-2b7347d5773fc91475ce6a18e0e96b40f0b8cb94.tar.gz
hdf5-2b7347d5773fc91475ce6a18e0e96b40f0b8cb94.tar.bz2
Record the state of a log outlet on first use and reuse that state on
subsequent hlog_fast() calls. While I'm here, add a typedef, hlog_outlet_t, for struct hlog_outlet, and use it.
-rw-r--r--src/hlog.c8
-rw-r--r--src/hlog.h13
2 files changed, 16 insertions, 5 deletions
diff --git a/src/hlog.c b/src/hlog.c
index e27f539..a017843 100644
--- a/src/hlog.c
+++ b/src/hlog.c
@@ -261,8 +261,12 @@ hlog_impl(struct hlog_outlet *ls0, const char *fmt, ...)
struct hlog_outlet *ls;
va_list ap;
- if ((ls = hlog_outlet_find_active(ls0)) == NULL)
- return;
+ if ((ls = hlog_outlet_find_active(ls0)) == NULL) {
+ ls0->ls_resolved = HLOG_OUTLET_S_OFF;
+ return;
+ }
+
+ ls0->ls_resolved = HLOG_OUTLET_S_ON;
va_start(ap, fmt);
vhlog(fmt, ap);
diff --git a/src/hlog.h b/src/hlog.h
index 2ac64d0..921ce64 100644
--- a/src/hlog.h
+++ b/src/hlog.h
@@ -53,6 +53,8 @@ struct hlog_outlet {
TAILQ_ENTRY(hlog_outlet) ls_next;
};
+typedef struct hlog_outlet hlog_outlet_t;
+
#define HLOG_CONSTRUCTOR(__sym) \
void hlog_constructor_##__sym(void) __constructor; \
void \
@@ -94,9 +96,14 @@ HLOG_OUTLET_DECL(all);
#define hlog_fast(_name, ...) \
do { \
- struct hlog_outlet *_ls; \
- if ((_ls = hlog_outlet_find_active((&log_##_name))) != NULL) \
- hlog_always((_ls), __VA_ARGS__); \
+ hlog_outlet_t *_ls0 = &log_##_name; \
+ \
+ if (_ls0->ls_resolved == HLOG_OUTLET_S_OFF) \
+ break; \
+ else if (_ls0->ls_resolved == HLOG_OUTLET_S_ON) \
+ hlog_always(_ls0, __VA_ARGS__); \
+ else \
+ hlog_impl(_ls0, __VA_ARGS__); \
} while (/*CONSTCOND*/0)
struct hlog_outlet *hlog_outlet_find_active(struct hlog_outlet *);