size_t cserve2_shm_size_get(const Shm_Handle *shm);
void *cserve2_shm_map(Shm_Handle *shm);
void cserve2_shm_unmap(Shm_Handle *shm);
-size_t cserve2_shm_size_normalize(size_t size);
+size_t cserve2_shm_size_normalize(size_t size, size_t align);
void cserve2_command_run(Client *client, Message_Type type);
static int font_mem_usage = 0;
#define MAX_PREEMPTIVE_LOAD_SIZE (320*320*4)
+#define ARRAY_REPACK_TRIGGER_PERCENT 25 // repack when array conains 25% holes
#ifdef DEBUG_LOAD_TIME
static int
count = cserve2_shared_array_size_get(_file_data_array);
if ((count > 0) && (_freed_file_entry_count > 100 ||
- ((_freed_file_entry_count * 100) / count >= 10)))
+ ((_freed_file_entry_count * 100) / count >= ARRAY_REPACK_TRIGGER_PERCENT)))
{
DBG("Repacking file data array: %s",
cserve2_shared_array_name_get(_file_data_array));
count = cserve2_shared_array_size_get(_image_data_array);
if ((count > 0) && (_freed_image_entry_count > 100 ||
- ((_freed_image_entry_count * 100) / count >= 10)))
+ ((_freed_image_entry_count * 100) / count >= ARRAY_REPACK_TRIGGER_PERCENT)))
{
DBG("Repacking image data array: %s",
cserve2_shared_array_name_get(_image_data_array));
count = cserve2_shared_array_size_get(_font_data_array);
if ((count > 0) && (_freed_font_entry_count > 100 ||
- ((_freed_font_entry_count * 100) / count >= 10)))
+ ((_freed_font_entry_count * 100) / count >= ARRAY_REPACK_TRIGGER_PERCENT)))
{
DBG("Repacking font data array: %s",
cserve2_shared_array_name_get(_font_data_array));
cserve2_shared_string_del(fd->key);
cserve2_shared_string_del(fd->path);
cserve2_shared_string_del(fd->loader_data);
- memset((char *) fd + sizeof(fd->id), 0, sizeof(*fd) - sizeof(fd->id));
}
}
#define _EVAS_FONT_SLANT_TAN 0.221694663
#define CHECK_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
-#define MIN_GLYPHS 50
+#define MIN_GLYPHS 100 // 26*2 + a nice margin :)
#define MAX_CACHE_SIZE 1 * 1024 * 1024 // 1MB
#define EVAS_FONT_ROUND_26_6_TO_INT(x) \
}
static unsigned int
-_font_slave_int_shm_prev_calculate(unsigned int size, unsigned int nglyphs)
-{
- unsigned int average;
- unsigned int newsize;
-
- if (!nglyphs) return cserve2_shm_size_normalize(1);
- average = size / nglyphs;
-
- newsize = MIN_GLYPHS * average;
- newsize = cserve2_shm_size_normalize(newsize);
-
- if (newsize > MAX_CACHE_SIZE)
- return MAX_CACHE_SIZE;
-
- return newsize;
-}
-
-static unsigned int
_font_slave_int_shm_calculate(Font_Info *fi, unsigned int hint)
{
const char *c;
average = size / i; // average glyph size
size = MIN_GLYPHS * average;
- size = cserve2_shm_size_normalize(size);
+ size = cserve2_shm_size_normalize(size, 0);
if (size > MAX_CACHE_SIZE)
return MAX_CACHE_SIZE; // Assumes no glyph will be bigger than this
// fragmentation (after del). 16 is convenient for debugging with hd :)
#define DATA_BLOCKSIZE 8
+// Recommended minimum size for arrays and mempools
+#define ARRAY_MINSIZE (32 * 1024)
+
static inline int
_data_blocksize_roundup(int len)
{
ds = calloc(1, sizeof(Data_Shm));
if (!ds) return NULL;
- mapping_size = cserve2_shm_size_normalize((size_t) size);
+ mapping_size = cserve2_shm_size_normalize((size_t) size, 0);
ds->shm = cserve2_shm_request(infix, mapping_size);
if (!ds->shm)
if (newsize <= 0)
return -1;
- mapping_size = cserve2_shm_size_normalize(newsize);
+ mapping_size = cserve2_shm_size_normalize(newsize, ARRAY_MINSIZE);
cserve2_shm_unmap(ds->shm);
ds->data = NULL;
if (!initcount) initcount = 1;
mapping_size = cserve2_shm_size_normalize(elemsize * initcount
- + sizeof(Shared_Array_Header));
+ + sizeof(Shared_Array_Header),
+ ARRAY_MINSIZE);
ds = _shared_data_shm_new("array", mapping_size);
if (!ds)
{
if (!sa) return -1;
mapping_size = cserve2_shm_size_normalize(sa->header->elemsize * newcount
- + sizeof(Shared_Array_Header));
+ + sizeof(Shared_Array_Header),
+ ARRAY_MINSIZE);
if (_shared_data_shm_resize(sa->ds, mapping_size) < 0)
{
sa->header = NULL;
if (!sm) return NULL;
if (!initsize) initsize = 1;
- mapping_size = cserve2_shm_size_normalize((size_t) initsize);
+ mapping_size = cserve2_shm_size_normalize((size_t) initsize, ARRAY_MINSIZE);
sm->ds = _shared_data_shm_new("mempool", mapping_size);
if (!sm->ds)
static int id = 0;
size_t
-cserve2_shm_size_normalize(size_t size)
+cserve2_shm_size_normalize(size_t size, size_t align)
{
long pagesize;
size_t normalized;
pagesize = 4096;
}
- normalized = ((size + pagesize - 1) / pagesize) * pagesize;
+ if (align)
+ align = ((align + pagesize - 1) / pagesize) * pagesize;
+ else
+ align = pagesize;
+ normalized = ((size + align - 1) / align) * align;
return normalized;
}
}
} while (fd == -1);
- map_size = cserve2_shm_size_normalize(size);
+ map_size = cserve2_shm_size_normalize(size, 0);
if (ftruncate(fd, map_size) == -1)
{
return NULL;
}
- map_size = cserve2_shm_size_normalize(size);
+ map_size = cserve2_shm_size_normalize(size, 0);
map_size += map->length;
if (ftruncate(fd, map_size) == -1)
return NULL;
}
- map_size = cserve2_shm_size_normalize(newsize);
+ map_size = cserve2_shm_size_normalize(newsize, 0);
if (ftruncate(fd, map_size))
{
ERR("Could not set the size of the shm: %m");