diff options
author | Petr Machata <pmachata@redhat.com> | 2013-10-16 14:46:24 +0200 |
---|---|---|
committer | Petr Machata <pmachata@redhat.com> | 2013-10-23 01:00:02 +0200 |
commit | 9f819d5747dc2b8e0f7ac54b38dc321115de6dda (patch) | |
tree | 452c7753ef06db25fa7e0fdba5b2dd620ae171da /breakpoints.c | |
parent | 8fdd09b028426f92df614d6ebe5c56d99877febf (diff) | |
download | ltrace-9f819d5747dc2b8e0f7ac54b38dc321115de6dda.tar.gz |
Allow per-OS configuration hooks for struct breakpoint
Diffstat (limited to 'breakpoints.c')
-rw-r--r-- | breakpoints.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/breakpoints.c b/breakpoints.c index 4b3cdd3..f0dd5b6 100644 --- a/breakpoints.c +++ b/breakpoints.c @@ -101,6 +101,25 @@ address2bpstruct(struct process *proc, arch_addr_t addr) return found; } +#ifndef OS_HAVE_BREAKPOINT_DATA +int +os_breakpoint_init(struct process *proc, struct breakpoint *sbp) +{ + return 0; +} + +void +os_breakpoint_destroy(struct breakpoint *sbp) +{ +} + +int +os_breakpoint_clone(struct breakpoint *retp, struct breakpoint *sbp) +{ + return 0; +} +#endif + #ifndef ARCH_HAVE_BREAKPOINT_DATA int arch_breakpoint_init(struct process *proc, struct breakpoint *sbp) @@ -140,7 +159,13 @@ breakpoint_init(struct breakpoint *bp, struct process *proc, arch_addr_t addr, struct library_symbol *libsym) { breakpoint_init_base(bp, addr, libsym); - return arch_breakpoint_init(proc, bp); + if (os_breakpoint_init(proc, bp) < 0) + return -1; + if (arch_breakpoint_init(proc, bp) < 0) { + os_breakpoint_destroy(bp); + return -1; + } + return 0; } void @@ -157,6 +182,7 @@ breakpoint_destroy(struct breakpoint *bp) if (bp == NULL) return; arch_breakpoint_destroy(bp); + os_breakpoint_destroy(bp); } int @@ -172,8 +198,12 @@ breakpoint_clone(struct breakpoint *retp, struct process *new_proc, breakpoint_init_base(retp, bp->addr, libsym); memcpy(retp->orig_value, bp->orig_value, sizeof(bp->orig_value)); retp->enabled = bp->enabled; - if (arch_breakpoint_clone(retp, bp) < 0) + if (os_breakpoint_clone(retp, bp) < 0) return -1; + if (arch_breakpoint_clone(retp, bp) < 0) { + os_breakpoint_destroy(retp); + return -1; + } breakpoint_set_callbacks(retp, bp->cbs); return 0; } |