mirror of
https://github.com/vale981/ray
synced 2025-03-06 10:31:39 -05:00
Fix offset in get_malloc_mapinfo. (#24)
* Fix offset in get_malloc_mapinfo. * Don't add offset inside mmap_record * make clang-format happy
This commit is contained in:
parent
28c19a38c9
commit
13560bdb6b
3 changed files with 19 additions and 11 deletions
24
src/malloc.c
24
src/malloc.c
|
@ -36,6 +36,7 @@ struct mmap_record {
|
||||||
UT_hash_handle hh_pointer;
|
UT_hash_handle hh_pointer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* TODO(rshin): Don't have two hash tables. */
|
||||||
struct mmap_record *records_by_fd = NULL;
|
struct mmap_record *records_by_fd = NULL;
|
||||||
struct mmap_record *records_by_pointer = NULL;
|
struct mmap_record *records_by_pointer = NULL;
|
||||||
|
|
||||||
|
@ -65,16 +66,16 @@ int create_buffer(int64_t size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void *fake_mmap(size_t size) {
|
void *fake_mmap(size_t size) {
|
||||||
// Add sizeof(size_t) so that the returned pointer is deliberately not
|
/* Add sizeof(size_t) so that the returned pointer is deliberately not
|
||||||
// page-aligned. This ensures that the segments of memory returned by
|
* page-aligned. This ensures that the segments of memory returned by
|
||||||
// fake_mmap are never contiguous.
|
* fake_mmap are never contiguous. */
|
||||||
int fd = create_buffer(size + sizeof(size_t));
|
size += sizeof(size_t);
|
||||||
void *pointer = mmap(NULL, size + sizeof(size_t), PROT_READ | PROT_WRITE,
|
|
||||||
MAP_SHARED, fd, 0);
|
int fd = create_buffer(size);
|
||||||
|
void *pointer = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||||
if (pointer == MAP_FAILED) {
|
if (pointer == MAP_FAILED) {
|
||||||
return pointer;
|
return pointer;
|
||||||
}
|
}
|
||||||
pointer += sizeof(size_t);
|
|
||||||
|
|
||||||
struct mmap_record *record = malloc(sizeof(struct mmap_record));
|
struct mmap_record *record = malloc(sizeof(struct mmap_record));
|
||||||
record->fd = fd;
|
record->fd = fd;
|
||||||
|
@ -83,16 +84,19 @@ void *fake_mmap(size_t size) {
|
||||||
HASH_ADD(hh_fd, records_by_fd, fd, sizeof(fd), record);
|
HASH_ADD(hh_fd, records_by_fd, fd, sizeof(fd), record);
|
||||||
HASH_ADD(hh_pointer, records_by_pointer, pointer, sizeof(pointer), record);
|
HASH_ADD(hh_pointer, records_by_pointer, pointer, sizeof(pointer), record);
|
||||||
|
|
||||||
|
/* We lie to dlmalloc about where mapped memory actually lives. */
|
||||||
|
pointer += sizeof(size_t);
|
||||||
LOG_DEBUG("%p = fake_mmap(%lu)", pointer, size);
|
LOG_DEBUG("%p = fake_mmap(%lu)", pointer, size);
|
||||||
return pointer;
|
return pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fake_munmap(void *addr, size_t size) {
|
int fake_munmap(void *addr, size_t size) {
|
||||||
LOG_DEBUG("fake_munmap(%p, %lu)", addr, size);
|
LOG_DEBUG("fake_munmap(%p, %lu)", addr, size);
|
||||||
|
addr -= sizeof(size_t);
|
||||||
|
size += sizeof(size_t);
|
||||||
|
|
||||||
struct mmap_record *record;
|
struct mmap_record *record;
|
||||||
|
|
||||||
addr -= sizeof(size_t);
|
|
||||||
HASH_FIND(hh_pointer, records_by_pointer, &addr, sizeof(addr), record);
|
HASH_FIND(hh_pointer, records_by_pointer, &addr, sizeof(addr), record);
|
||||||
assert(record != NULL);
|
assert(record != NULL);
|
||||||
close(record->fd);
|
close(record->fd);
|
||||||
|
@ -100,7 +104,7 @@ int fake_munmap(void *addr, size_t size) {
|
||||||
HASH_DELETE(hh_fd, records_by_fd, record);
|
HASH_DELETE(hh_fd, records_by_fd, record);
|
||||||
HASH_DELETE(hh_pointer, records_by_pointer, record);
|
HASH_DELETE(hh_pointer, records_by_pointer, record);
|
||||||
|
|
||||||
return munmap(addr, size + sizeof(size_t));
|
return munmap(addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void get_malloc_mapinfo(void *addr,
|
void get_malloc_mapinfo(void *addr,
|
||||||
|
@ -108,7 +112,7 @@ void get_malloc_mapinfo(void *addr,
|
||||||
int64_t *map_size,
|
int64_t *map_size,
|
||||||
ptrdiff_t *offset) {
|
ptrdiff_t *offset) {
|
||||||
struct mmap_record *record;
|
struct mmap_record *record;
|
||||||
// TODO(rshin): Implement a more efficient search through records_by_fd.
|
/* TODO(rshin): Implement a more efficient search through records_by_fd. */
|
||||||
for (record = records_by_fd; record != NULL; record = record->hh_fd.next) {
|
for (record = records_by_fd; record != NULL; record = record->hh_fd.next) {
|
||||||
if (addr >= record->pointer && addr < record->pointer + record->size) {
|
if (addr >= record->pointer && addr < record->pointer + record->size) {
|
||||||
*fd = record->fd;
|
*fd = record->fd;
|
||||||
|
|
|
@ -6,4 +6,4 @@ void get_malloc_mapinfo(void *addr,
|
||||||
int64_t *map_length,
|
int64_t *map_length,
|
||||||
ptrdiff_t *offset);
|
ptrdiff_t *offset);
|
||||||
|
|
||||||
#endif // MALLOC_H
|
#endif /* MALLOC_H */
|
||||||
|
|
|
@ -44,6 +44,8 @@ void plasma_create(int conn,
|
||||||
assert(reply.metadata_size == metadata_size);
|
assert(reply.metadata_size == metadata_size);
|
||||||
/* The metadata should come right after the data. */
|
/* The metadata should come right after the data. */
|
||||||
assert(reply.metadata_offset == reply.data_offset + data_size);
|
assert(reply.metadata_offset == reply.data_offset + data_size);
|
||||||
|
|
||||||
|
// TOOD(rshin): Don't call mmap if this fd has already been mapepd.
|
||||||
*data = ((uint8_t *) mmap(NULL, reply.map_size, PROT_READ | PROT_WRITE,
|
*data = ((uint8_t *) mmap(NULL, reply.map_size, PROT_READ | PROT_WRITE,
|
||||||
MAP_SHARED, fd, 0)) +
|
MAP_SHARED, fd, 0)) +
|
||||||
reply.data_offset;
|
reply.data_offset;
|
||||||
|
@ -73,6 +75,8 @@ void plasma_get(int conn,
|
||||||
plasma_reply reply;
|
plasma_reply reply;
|
||||||
/* The following loop is run at most twice. */
|
/* The following loop is run at most twice. */
|
||||||
int fd = recv_fd(conn, (char *) &reply, sizeof(plasma_reply));
|
int fd = recv_fd(conn, (char *) &reply, sizeof(plasma_reply));
|
||||||
|
|
||||||
|
// TOOD(rshin): Don't call mmap if this fd has already been mapepd.
|
||||||
*data =
|
*data =
|
||||||
((uint8_t *) mmap(NULL, reply.map_size, PROT_READ, MAP_SHARED, fd, 0)) +
|
((uint8_t *) mmap(NULL, reply.map_size, PROT_READ, MAP_SHARED, fd, 0)) +
|
||||||
reply.data_offset;
|
reply.data_offset;
|
||||||
|
|
Loading…
Add table
Reference in a new issue