Merge pull request #22 from il-steffen/page_cache_racing
Page cache racing
This commit is contained in:
commit
4df041cd8e
@ -262,6 +262,30 @@ static bool verify_workdir_state(nyx_interface_state *s, Error **errp){
|
|||||||
}
|
}
|
||||||
free(tmp);
|
free(tmp);
|
||||||
|
|
||||||
|
assert(asprintf(&tmp, "%s/page_cache.lock", workdir) != -1);
|
||||||
|
if (!file_exits(tmp)){
|
||||||
|
fprintf(stderr, "%s does not exist...", tmp);
|
||||||
|
free(tmp);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
free(tmp);
|
||||||
|
|
||||||
|
assert(asprintf(&tmp, "%s/page_cache.addr", workdir) != -1);
|
||||||
|
if (!file_exits(tmp)){
|
||||||
|
fprintf(stderr, "%s does not exist...\n", tmp);
|
||||||
|
free(tmp);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
free(tmp);
|
||||||
|
|
||||||
|
assert(asprintf(&tmp, "%s/page_cache.dump", workdir) != -1);
|
||||||
|
if (!file_exits(tmp)){
|
||||||
|
fprintf(stderr, "%s does not exist...\n", tmp);
|
||||||
|
free(tmp);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
free(tmp);
|
||||||
|
|
||||||
assert(asprintf(&tmp, "%s/page_cache", workdir) != -1);
|
assert(asprintf(&tmp, "%s/page_cache", workdir) != -1);
|
||||||
init_page_cache(tmp);
|
init_page_cache(tmp);
|
||||||
|
|
||||||
|
@ -25,9 +25,6 @@
|
|||||||
|
|
||||||
#define UNMAPPED_PAGE 0xFFFFFFFFFFFFFFFFULL
|
#define UNMAPPED_PAGE 0xFFFFFFFFFFFFFFFFULL
|
||||||
|
|
||||||
static void page_cache_unlock(page_cache_t* self);
|
|
||||||
static void page_cache_lock(page_cache_t* self);
|
|
||||||
|
|
||||||
#ifndef STANDALONE_DECODER
|
#ifndef STANDALONE_DECODER
|
||||||
static bool reload_addresses(page_cache_t* self){
|
static bool reload_addresses(page_cache_t* self){
|
||||||
#else
|
#else
|
||||||
@ -43,8 +40,6 @@ bool reload_addresses(page_cache_t* self){
|
|||||||
if(self_offset != self->num_pages*PAGE_CACHE_ADDR_LINE_SIZE){
|
if(self_offset != self->num_pages*PAGE_CACHE_ADDR_LINE_SIZE){
|
||||||
//fprintf(stderr, "Reloading files ...\n");
|
//fprintf(stderr, "Reloading files ...\n");
|
||||||
|
|
||||||
page_cache_lock(self); // don't read while someone else is writing?
|
|
||||||
|
|
||||||
lseek(self->fd_address_file, self->num_pages*PAGE_CACHE_ADDR_LINE_SIZE, SEEK_SET);
|
lseek(self->fd_address_file, self->num_pages*PAGE_CACHE_ADDR_LINE_SIZE, SEEK_SET);
|
||||||
offset = self->num_pages;
|
offset = self->num_pages;
|
||||||
while(read(self->fd_address_file, &value, PAGE_CACHE_ADDR_LINE_SIZE)){
|
while(read(self->fd_address_file, &value, PAGE_CACHE_ADDR_LINE_SIZE)){
|
||||||
@ -85,8 +80,6 @@ bool reload_addresses(page_cache_t* self){
|
|||||||
self->num_pages = self_offset/PAGE_CACHE_ADDR_LINE_SIZE;
|
self->num_pages = self_offset/PAGE_CACHE_ADDR_LINE_SIZE;
|
||||||
self->page_data = mmap(NULL, (self->num_pages)*PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, self->fd_page_file, 0);
|
self->page_data = mmap(NULL, (self->num_pages)*PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, self->fd_page_file, 0);
|
||||||
|
|
||||||
page_cache_unlock(self);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,12 +359,12 @@ page_cache_t* page_cache_new(const char* cache_file, uint8_t disassembler_word_w
|
|||||||
|
|
||||||
|
|
||||||
self->lookup = kh_init(PC_CACHE);
|
self->lookup = kh_init(PC_CACHE);
|
||||||
self->fd_page_file = open(tmp1, O_CLOEXEC | O_CREAT | O_RDWR, 0644);
|
self->fd_page_file = open(tmp1, O_CLOEXEC | O_RDWR, S_IRWXU);
|
||||||
self->fd_address_file = open(tmp2, O_CLOEXEC | O_CREAT | O_RDWR, 0644);
|
self->fd_address_file = open(tmp2, O_CLOEXEC | O_RDWR, S_IRWXU);
|
||||||
|
|
||||||
#ifndef STANDALONE_DECODER
|
#ifndef STANDALONE_DECODER
|
||||||
self->cpu = cpu;
|
self->cpu = cpu;
|
||||||
self->fd_lock = open(tmp3, O_CLOEXEC | O_CREAT, 0644);
|
self->fd_lock = open(tmp3, O_CLOEXEC);
|
||||||
assert(self->fd_lock > 0);
|
assert(self->fd_lock > 0);
|
||||||
#else
|
#else
|
||||||
if(self->fd_page_file == -1 || self->fd_address_file == -1){
|
if(self->fd_page_file == -1 || self->fd_address_file == -1){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user