diff options
author | Ted Lemon <source@isc.org> | 2001-02-17 21:19:55 +0000 |
---|---|---|
committer | Ted Lemon <source@isc.org> | 2001-02-17 21:19:55 +0000 |
commit | 7a563fb8bfe0463a7fce317aa1773f90d0f9a1b6 (patch) | |
tree | 412e89791138780852a87a022eee1b4258f65805 /omapip/trace.c | |
parent | 7980a66ed5f0f3167f0e905dfa80d32554bc66f6 (diff) | |
download | isc-dhcp-7a563fb8bfe0463a7fce317aa1773f90d0f9a1b6.tar.gz |
- Get rid of the requirement that trace types be declared after trace_init()
is called.
Diffstat (limited to 'omapip/trace.c')
-rw-r--r-- | omapip/trace.c | 84 |
1 files changed, 52 insertions, 32 deletions
diff --git a/omapip/trace.c b/omapip/trace.c index 23760b01..7328cc27 100644 --- a/omapip/trace.c +++ b/omapip/trace.c @@ -57,6 +57,9 @@ static tracefile_header_t tracefile_header; static int trace_playback_flag; trace_type_t trace_time_marker; +static isc_result_t trace_type_record (trace_type_t *, + unsigned, const char *, int); + int trace_playback () { return trace_playback_flag; @@ -97,6 +100,8 @@ isc_result_t trace_begin (const char *filename, { tracefile_header_t tfh; int status; + trace_type_t *tptr, *next; + isc_result_t result; if (traceoutfile) { log_error ("%s(%d): trace_begin called twice", @@ -128,7 +133,25 @@ isc_result_t trace_begin (const char *filename, log_error ("%s(%d): trace_begin: short write (%d:%d)", file, line, status, sizeof tfh); trace_stop (); + return ISC_R_UNEXPECTED; } + + /* Stash all the types that have already been set up. */ + if (new_trace_types) { + next = new_trace_types; + new_trace_types = (trace_type_t *)0; + for (tptr = next; tptr; tptr = next) { + next = tptr -> next; + if (tptr -> index != 0) { + result = (trace_type_record + (tptr, + strlen (tptr -> name), file, line)); + if (result != ISC_R_SUCCESS) + return status; + } + } + } + return ISC_R_SUCCESS; } @@ -258,24 +281,13 @@ trace_type_t *trace_type_register (const char *name, const char *file, int line) { trace_type_t *ttmp, *tptr; - trace_index_mapping_t *tim; unsigned slen = strlen (name); - - if (traceoutfile) { - tim = dmalloc (slen + TRACE_INDEX_MAPPING_SIZE, file, line); - if (!tim) - return (trace_type_t *)0; - } + isc_result_t status; ttmp = dmalloc (sizeof *ttmp, file, line); - if (!ttmp) { - dfree (tim, file, line); + if (!ttmp) return ttmp; - } - if (traceoutfile) - ttmp -> index = ++traceindex; - else - ttmp -> index = -1; + ttmp -> index = -1; ttmp -> name = dmalloc (slen + 1, file, line); if (!ttmp -> name) { dfree (ttmp, file, line); @@ -285,33 +297,41 @@ trace_type_t *trace_type_register (const char *name, ttmp -> have_packet = have_packet; ttmp -> stop_tracing = stop_tracing; - if (ttmp) { - if (ttmp -> index != -1) - trace_type_stash (ttmp); - else { - ttmp -> next = new_trace_types; - new_trace_types = ttmp; - } - } - - /* Assemble the trace mapping to be written out to the trace file. */ if (traceoutfile) { - tim -> index = htonl (ttmp -> index); - memcpy (tim -> name, name, slen); - if (trace_write_packet (trace_types [0], - slen + TRACE_INDEX_MAPPING_SIZE, - (char *)tim, file, line) != - ISC_R_SUCCESS) { + status = trace_type_record (ttmp, slen, file, line); + if (status != ISC_R_SUCCESS) { dfree (ttmp -> name, file, line); dfree (ttmp, file, line); - ttmp = (trace_type_t *)0; + return (trace_type_t *)0; } - dfree (tim, file, line); + } else { + ttmp -> next = new_trace_types; + new_trace_types = ttmp; } return ttmp; } +static isc_result_t trace_type_record (trace_type_t *ttmp, unsigned slen, + const char *file, int line) +{ + trace_index_mapping_t *tim; + isc_result_t status; + + tim = dmalloc (slen + TRACE_INDEX_MAPPING_SIZE, file, line); + if (!tim) + return ISC_R_NOMEMORY; + ttmp -> index = ++traceindex; + trace_type_stash (ttmp); + tim -> index = htonl (ttmp -> index); + memcpy (tim -> name, ttmp -> name, slen); + status = trace_write_packet (trace_types [0], + slen + TRACE_INDEX_MAPPING_SIZE, + (char *)tim, file, line); + dfree (tim, file, line); + return status; +} + /* Stop all registered trace types from trying to trace. */ void trace_stop (void) |