diff options
Diffstat (limited to 'libelf/gelf_getehdr.c')
-rw-r--r-- | libelf/gelf_getehdr.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/libelf/gelf_getehdr.c b/libelf/gelf_getehdr.c index f56d65a9..ddc77072 100644 --- a/libelf/gelf_getehdr.c +++ b/libelf/gelf_getehdr.c @@ -61,9 +61,10 @@ GElf_Ehdr * -gelf_getehdr (elf, dest) +__gelf_getehdr_internal (elf, dest, locked) Elf *elf; GElf_Ehdr *dest; + lockstat_t locked; { GElf_Ehdr *result = NULL; @@ -76,7 +77,8 @@ gelf_getehdr (elf, dest) return NULL; } - rwlock_rdlock (elf->lock); + if (locked == LS_UNLOCKED) + RWLOCK_RDLOCK (elf->lock); /* The following is an optimization: the ehdr element is at the same position in both the elf32 and elf64 structure. */ @@ -114,8 +116,19 @@ gelf_getehdr (elf, dest) else result = memcpy (dest, elf->state.elf64.ehdr, sizeof (*dest)); - rwlock_unlock (elf->lock); + if (locked == LS_UNLOCKED) + RWLOCK_UNLOCK (elf->lock); return result; } -INTDEF(gelf_getehdr) + +GElf_Ehdr * +gelf_getehdr (elf, dest) + Elf *elf; + GElf_Ehdr *dest; +{ + if (elf == NULL) + return NULL; + + return __gelf_getehdr_internal (elf, dest, LS_UNLOCKED); +} |