* SOFTWARE.
*/
-#define BT_LOG_TAG "COMPAT-MMAN"
-#include "logging.h"
+#define BT_LOG_OUTPUT_LEVEL (mapping->log_level)
+#define BT_LOG_TAG "COMPAT/MMAN"
+#include "logging/log.h"
#include "common/macros.h"
+#include "common/common.h"
#ifdef __APPLE__
/*
#include "compat/mman.h"
struct mmap_mapping {
+ int log_level;
+
/* The duplicated handle. */
HANDLE file_handle;
/* Handle returned by CreateFileMapping. */
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;
if (mapping) {
if (!CloseHandle(mapping->map_handle)) {
BT_LOGF_STR("Failed to close mmap map_handle.");
- abort();
+ bt_common_abort();
}
if (!CloseHandle(mapping->file_handle)) {
BT_LOGF_STR("Failed to close mmap file_handle.");
- abort();
+ bt_common_abort();
}
free(mapping);
mapping = NULL;
{
/* Cleanup of handles should never fail. */
if (!UnmapViewOfFile(addr)) {
- BT_LOGF_STR("Failed to unmap mmap mapping.");
- abort();
+ /*
+ * 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.");
+ bt_common_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.");
- abort();
+ BT_LOG_WRITE_CUR_LVL(BT_LOG_FATAL, log_level, BT_LOG_TAG, "Failed to acquire mmap_mutex.");
+ bt_common_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.");
- abort();
+ BT_LOG_WRITE_CUR_LVL(BT_LOG_FATAL, log_level, BT_LOG_TAG, "Failed to release mmap_mutex.");
+ bt_common_abort();
}
}
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;
}
/* 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;
}
goto error;
}
- mmap_lock();
+ mmap_lock(log_level);
/* If we have never done any mappings, allocate the hashtable. */
if (!mmap_mappings) {
/* 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;
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;
/* Remove it. */
if (!g_hash_table_remove(mmap_mappings, addr)) {
BT_LOGF_STR("Failed to remove mapping from hashtable.");
- abort();
+ bt_common_abort();
}
end:
- mmap_unlock();
+ mmap_unlock(log_level);
return ret;
}
+BT_HIDDEN
+size_t bt_mmap_get_offset_align_size(int log_level)
+{
+ SYSTEM_INFO sysinfo;
+
+ GetNativeSystemInfo(&sysinfo);
+ BT_LOG_WRITE_CUR_LVL(BT_LOG_DEBUG, log_level, BT_LOG_TAG,
+ "Allocator granularity is %lu.",
+ sysinfo.dwAllocationGranularity);
+
+ return sysinfo.dwAllocationGranularity;
+}
+
#endif