libroot: Name mmap areas by the name of the image that allocated them.
This adds an average overhead of 10-15 us, which seems acceptable (without the previous patch it adds 200-250 us, which is less so), and it makes "listarea" output much more enlightening for applications like app_server or WebKit which use a lot of them. Change-Id: I48a4148e6e9fb0d1a8bbf67294deeafad9372f44 Reviewed-on: https://review.haiku-os.org/c/1462 Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
dee722ce4f
commit
ba390da3b4
@@ -8,11 +8,13 @@
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
|
|
||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
|
|
||||||
|
#include <runtime_loader/runtime_loader.h>
|
||||||
#include <errno_private.h>
|
#include <errno_private.h>
|
||||||
#include <syscall_utils.h>
|
#include <syscall_utils.h>
|
||||||
#include <syscalls.h>
|
#include <syscalls.h>
|
||||||
@@ -130,8 +132,19 @@ mmap(void* address, size_t length, int protection, int flags, int fd,
|
|||||||
if ((protection & PROT_EXEC) != 0)
|
if ((protection & PROT_EXEC) != 0)
|
||||||
areaProtection |= B_EXECUTE_AREA;
|
areaProtection |= B_EXECUTE_AREA;
|
||||||
|
|
||||||
|
// create a name for this area based on calling image
|
||||||
|
void* addr = __builtin_return_address(0);
|
||||||
|
char* imageName;
|
||||||
|
char areaName[B_OS_NAME_LENGTH];
|
||||||
|
status_t status = __gRuntimeLoader->get_nearest_symbol_at_address(
|
||||||
|
addr, NULL, NULL, &imageName, NULL, NULL, NULL, NULL);
|
||||||
|
if (status == B_OK)
|
||||||
|
snprintf(areaName, sizeof(areaName), "%s mmap area", imageName);
|
||||||
|
else
|
||||||
|
strlcpy(areaName, "mmap area", sizeof(areaName));
|
||||||
|
|
||||||
// ask the kernel to map
|
// ask the kernel to map
|
||||||
area_id area = _kern_map_file("mmap area", &address, addressSpec,
|
area_id area = _kern_map_file(areaName, &address, addressSpec,
|
||||||
length, areaProtection, mapping, true, fd, offset);
|
length, areaProtection, mapping, true, fd, offset);
|
||||||
if (area < 0) {
|
if (area < 0) {
|
||||||
__set_errno(area);
|
__set_errno(area);
|
||||||
|
|||||||
Reference in New Issue
Block a user