X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fcompat%2Fmman.c;h=1a7638c98381e0d6511a3a78f597e43015d90df7;hb=5084732e40a7925d22f741e4ed08f19d36078fbe;hp=edc59edabed37025722d231872cf573234221a63;hpb=350ad6c1c5f45a4e90c33e3c1354125c209bbf02;p=babeltrace.git diff --git a/src/compat/mman.c b/src/compat/mman.c index edc59eda..1a7638c9 100644 --- a/src/compat/mman.c +++ b/src/compat/mman.c @@ -26,8 +26,9 @@ * SOFTWARE. */ +#define BT_LOG_OUTPUT_LEVEL (mapping->log_level) #define BT_LOG_TAG "COMPAT/MMAN" -#include "logging.h" +#include "logging/log.h" #include "common/macros.h" @@ -52,6 +53,8 @@ int bt_mman_dummy_symbol; #include "compat/mman.h" struct mmap_mapping { + int log_level; + /* The duplicated handle. */ HANDLE file_handle; /* Handle returned by CreateFileMapping. */ @@ -67,14 +70,15 @@ GHashTable *mmap_mappings = NULL; static pthread_mutex_t mmap_mutex = PTHREAD_MUTEX_INITIALIZER; static -struct mmap_mapping *mapping_create(void) +struct mmap_mapping *mapping_create(int log_level) { struct mmap_mapping *mapping; mapping = malloc(sizeof(struct mmap_mapping)); - if (mapping != NULL) { + if (mapping) { mapping->file_handle = NULL; mapping->map_handle = NULL; + mapping->log_level = log_level; } return mapping; @@ -102,25 +106,30 @@ void addr_clean(void *addr) { /* Cleanup of handles should never fail. */ if (!UnmapViewOfFile(addr)) { - BT_LOGF_STR("Failed to unmap mmap mapping."); + /* + * FIXME: We don't have access to the mapping's log + * level here, so force a FATAL level. + */ + BT_LOG_WRITE_CUR_LVL(BT_LOG_FATAL, BT_LOG_FATAL, BT_LOG_TAG, + "Failed to unmap mmap mapping."); abort(); } } static -void mmap_lock(void) +void mmap_lock(int log_level) { if (pthread_mutex_lock(&mmap_mutex)) { - BT_LOGF_STR("Failed to acquire mmap_mutex."); + BT_LOG_WRITE_CUR_LVL(BT_LOG_FATAL, log_level, BT_LOG_TAG, "Failed to acquire mmap_mutex."); abort(); } } static -void mmap_unlock(void) +void mmap_unlock(int log_level) { if (pthread_mutex_unlock(&mmap_mutex)) { - BT_LOGF_STR("Failed to release mmap_mutex."); + BT_LOG_WRITE_CUR_LVL(BT_LOG_FATAL, log_level, BT_LOG_TAG, "Failed to release mmap_mutex."); abort(); } } @@ -163,7 +172,7 @@ DWORD map_prot_flags(int prot, DWORD *dwDesiredAccess) BT_HIDDEN void *bt_mmap(void *addr, size_t length, int prot, int flags, int fd, - off_t offset) + off_t offset, int log_level) { struct mmap_mapping *mapping = NULL; void *mapping_addr; @@ -191,9 +200,10 @@ void *bt_mmap(void *addr, size_t length, int prot, int flags, int fd, } /* Allocate the mapping struct. */ - mapping = mapping_create(); + mapping = mapping_create(log_level); if (!mapping) { - BT_LOGE_STR("Failed to allocate mmap mapping."); + BT_LOG_WRITE_CUR_LVL(BT_LOG_ERROR, log_level, BT_LOG_TAG, + "Failed to allocate mmap mapping."); _set_errno(ENOMEM); goto error; } @@ -233,7 +243,7 @@ void *bt_mmap(void *addr, size_t length, int prot, int flags, int fd, goto error; } - mmap_lock(); + mmap_lock(log_level); /* If we have never done any mappings, allocate the hashtable. */ if (!mmap_mappings) { @@ -250,12 +260,12 @@ void *bt_mmap(void *addr, size_t length, int prot, int flags, int fd, /* Add the new mapping to the hashtable. */ g_hash_table_insert(mmap_mappings, mapping_addr, mapping); - mmap_unlock(); + mmap_unlock(log_level); return mapping_addr; error_mutex_unlock: - mmap_unlock(); + mmap_unlock(log_level); error: mapping_clean(mapping); return MAP_FAILED; @@ -265,11 +275,15 @@ BT_HIDDEN int bt_munmap(void *addr, size_t length) { int ret = 0; + struct mmap_mapping *mapping = addr; + int log_level; - mmap_lock(); + BT_ASSERT(mapping); + log_level = mapping->log_level; + mmap_lock(log_level); /* Check if the mapping exists in the hashtable. */ - if (g_hash_table_lookup(mmap_mappings, addr) == NULL) { + if (!g_hash_table_lookup(mmap_mappings, addr)) { _set_errno(EINVAL); ret = -1; goto end; @@ -282,7 +296,7 @@ int bt_munmap(void *addr, size_t length) } end: - mmap_unlock(); + mmap_unlock(log_level); return ret; }