diff options
author | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2011-06-15 13:23:25 +0200 |
---|---|---|
committer | Jiri Olsa <Jiri Olsa jolsa@redhat.com> | 2011-06-15 13:23:25 +0200 |
commit | 1e797a2b262191a3b96f167c1b99c71442300100 (patch) | |
tree | 1964882fc6e6251d6f2d63ce2a0c15368bd6bb43 /src/symbol.c | |
parent | b32dc7059fe323ed3d2c100e900d9250e31bc0b2 (diff) | |
download | latrace-1e797a2b262191a3b96f167c1b99c71442300100.tar.gz latrace-1e797a2b262191a3b96f167c1b99c71442300100.tar.xz latrace-1e797a2b262191a3b96f167c1b99c71442300100.zip |
global_symbol fix - proper tree management
fix global_symbols tree management
- add only if we care about the symbol
- make bind call dependent on the global_symbols variable
Diffstat (limited to 'src/symbol.c')
-rw-r--r-- | src/symbol.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/src/symbol.c b/src/symbol.c index 6f2e155..df7d169 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -95,6 +95,16 @@ struct lt_symbol* lt_symbol_bind(struct lt_config_shared *cfg, struct lt_symbol *s = NULL; void *val; + PRINT_VERBOSE(cfg, 1, "checking %s(%p)\n", name, ptr); + + /* symbol already added */ + s = lt_symbol_get(cfg, ptr, name); + if (s) { + PRINT_VERBOSE(cfg, 1, "found %s, ptr %p, sym %p\n", + name, sym->ptr, sym); + return s; + } + if (!sym) { sym = malloc(sizeof(*sym)); if (!sym) @@ -105,29 +115,20 @@ struct lt_symbol* lt_symbol_bind(struct lt_config_shared *cfg, sym->ptr = ptr; sym->name = name; - PRINT_VERBOSE(cfg, 1, "checking %s(%p)\n", name, ptr); + /* do we care about this symbol? */ + if (symbol_init(cfg, sym, name)) + return NULL; + /* we do, let's add it */ val = tsearch((void *) sym, &root, compare); if (!val) return NULL; + /* symbol properly added */ s = (*(void**) val); - /* symbol already in */ - if (s != sym) { - PRINT_VERBOSE(cfg, 1, "found %s, ptr %p, sym %p\n", - name, sym->ptr, sym); - return s; - } - PRINT_VERBOSE(cfg, 1, "added %s, ptr %p, sym %p\n", name, sym->ptr, sym); - - /* not interesting symbol */ - if (symbol_init(cfg, sym, name)) - return NULL; - - /* symbol properly added */ sym = NULL; return s; } |