|
|
@ -3,7 +3,7 @@
|
|
|
|
#include "stdlib.h"
|
|
|
|
#include "stdlib.h"
|
|
|
|
#include <sys/mman.h>
|
|
|
|
#include <sys/mman.h>
|
|
|
|
|
|
|
|
|
|
|
|
#define MAX_CHUNK_SIZE 2048
|
|
|
|
#define MAX_CHUNK_SIZE 2048*2048
|
|
|
|
#define N_BUFFERS 3
|
|
|
|
#define N_BUFFERS 3
|
|
|
|
|
|
|
|
|
|
|
|
int min(int value1, int value2) {
|
|
|
|
int min(int value1, int value2) {
|
|
|
@ -30,7 +30,7 @@ bool inside_buffer(chunk_array_t* chunk_array,int init_pos, size_t pos) {
|
|
|
|
|
|
|
|
|
|
|
|
void chunk_array_free(chunk_array_t* chunk_array) {
|
|
|
|
void chunk_array_free(chunk_array_t* chunk_array) {
|
|
|
|
if (chunk_array->mmap_array) munmap(chunk_array->mmap_array, chunk_array->total_size * sizeof(double));
|
|
|
|
if (chunk_array->mmap_array) munmap(chunk_array->mmap_array, chunk_array->total_size * sizeof(double));
|
|
|
|
for (int i = 0; i < N_BUFFERS; i++) {
|
|
|
|
for (int i = 0; i < chunk_array->n_buffers; i++) {
|
|
|
|
buffer_free(chunk_array->buffers[i]);
|
|
|
|
buffer_free(chunk_array->buffers[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(chunk_array->buffers);
|
|
|
|
free(chunk_array->buffers);
|
|
|
@ -38,7 +38,7 @@ void chunk_array_free(chunk_array_t* chunk_array) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void buffer_flush(chunk_array_t* chunk_array, buffer_t* buffer) {
|
|
|
|
void buffer_flush(chunk_array_t* chunk_array, buffer_t* buffer) {
|
|
|
|
if (buffer->dirty) {
|
|
|
|
if (buffer->dirty && chunk_array->mmap_array) {
|
|
|
|
int mod = get_mod(chunk_array, buffer->init_pos);
|
|
|
|
int mod = get_mod(chunk_array, buffer->init_pos);
|
|
|
|
memcpy(&chunk_array->mmap_array[buffer->init_pos], buffer->data, mod * sizeof(double));
|
|
|
|
memcpy(&chunk_array->mmap_array[buffer->init_pos], buffer->data, mod * sizeof(double));
|
|
|
|
|
|
|
|
|
|
|
@ -53,8 +53,9 @@ void buffer_update(chunk_array_t* chunk_array, buffer_t* buffer, size_t pos) {
|
|
|
|
int new_init = pos/chunk_array->chunk_size;
|
|
|
|
int new_init = pos/chunk_array->chunk_size;
|
|
|
|
buffer->init_pos = new_init * chunk_array->chunk_size;
|
|
|
|
buffer->init_pos = new_init * chunk_array->chunk_size;
|
|
|
|
int mod = get_mod(chunk_array, buffer->init_pos);
|
|
|
|
int mod = get_mod(chunk_array, buffer->init_pos);
|
|
|
|
|
|
|
|
if (chunk_array->mmap_array) {
|
|
|
|
memcpy(buffer->data, &chunk_array->mmap_array[buffer->init_pos], mod * sizeof(double));
|
|
|
|
memcpy(buffer->data, &chunk_array->mmap_array[buffer->init_pos], mod * sizeof(double));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
buffer_t* buffer_create(int size) {
|
|
|
|
buffer_t* buffer_create(int size) {
|
|
|
@ -105,8 +106,11 @@ chunk_array_t* chunk_array_create(char* filename, size_t total_size) {
|
|
|
|
|
|
|
|
|
|
|
|
chunk_array->buffers[0]->init_pos = 0;
|
|
|
|
chunk_array->buffers[0]->init_pos = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chunk_array->n_buffers = 1;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 1; i<N_BUFFERS; i++) {
|
|
|
|
for (int i = 1; i<N_BUFFERS; i++) {
|
|
|
|
if (total_size > i*chunk_array->chunk_size) {
|
|
|
|
if (total_size > i*chunk_array->chunk_size) {
|
|
|
|
|
|
|
|
chunk_array->n_buffers++;
|
|
|
|
chunk_array->buffers[i] = buffer_create(chunk_array->chunk_size);
|
|
|
|
chunk_array->buffers[i] = buffer_create(chunk_array->chunk_size);
|
|
|
|
chunk_array->buffers[i]->init_pos = chunk_array->chunk_size;
|
|
|
|
chunk_array->buffers[i]->init_pos = chunk_array->chunk_size;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
@ -124,20 +128,15 @@ buffer_t* chunk_array_update(chunk_array_t* chunk_array, size_t pos) {
|
|
|
|
buffer_t* buffer = chunk_array->buffers[0];
|
|
|
|
buffer_t* buffer = chunk_array->buffers[0];
|
|
|
|
int distance = abs(buffer->init_pos - pos);
|
|
|
|
int distance = abs(buffer->init_pos - pos);
|
|
|
|
|
|
|
|
|
|
|
|
printf("[CHUNK UPDATE][%s] pos: %d \n",chunk_array->filename, pos);
|
|
|
|
for(int i=1; i<chunk_array->n_buffers; i++) {
|
|
|
|
|
|
|
|
|
|
|
|
for(int i=1; i<N_BUFFERS; i++) {
|
|
|
|
|
|
|
|
int new_distance = abs(chunk_array->buffers[i]->init_pos - pos);
|
|
|
|
int new_distance = abs(chunk_array->buffers[i]->init_pos - pos);
|
|
|
|
if (new_distance < distance) {
|
|
|
|
if (new_distance < distance) {
|
|
|
|
distance = new_distance;
|
|
|
|
distance = new_distance;
|
|
|
|
buffer = chunk_array->buffers[i];
|
|
|
|
buffer = chunk_array->buffers[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
buffer_update(chunk_array, buffer, pos);
|
|
|
|
buffer_update(chunk_array, buffer, pos);
|
|
|
|
return buffer;
|
|
|
|
return buffer;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) {
|
|
|
|
bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) {
|
|
|
@ -149,7 +148,7 @@ bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) {
|
|
|
|
|
|
|
|
|
|
|
|
// mmap
|
|
|
|
// mmap
|
|
|
|
buffer_t* buffer = NULL;
|
|
|
|
buffer_t* buffer = NULL;
|
|
|
|
for (int i = 0; i<N_BUFFERS; i++) {
|
|
|
|
for (int i = 0; i<chunk_array->n_buffers; i++) {
|
|
|
|
if (inside_buffer(chunk_array, chunk_array->buffers[i]->init_pos, pos)) {
|
|
|
|
if (inside_buffer(chunk_array, chunk_array->buffers[i]->init_pos, pos)) {
|
|
|
|
buffer = chunk_array->buffers[i];
|
|
|
|
buffer = chunk_array->buffers[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -176,7 +175,7 @@ bool chunk_array_save(chunk_array_t* chunk_array, size_t pos, double valor) {
|
|
|
|
// mmap
|
|
|
|
// mmap
|
|
|
|
buffer_t* buffer = NULL;
|
|
|
|
buffer_t* buffer = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i<N_BUFFERS; i++) {
|
|
|
|
for (int i = 0; i<chunk_array->n_buffers; i++) {
|
|
|
|
if (inside_buffer(chunk_array, chunk_array->buffers[i]->init_pos, pos)) {
|
|
|
|
if (inside_buffer(chunk_array, chunk_array->buffers[i]->init_pos, pos)) {
|
|
|
|
buffer = chunk_array->buffers[i];
|
|
|
|
buffer = chunk_array->buffers[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|