mapper: place strings in array

mapper: place strings in a big array.
Make it possible to configure array and map extend size.
This commit is contained in:
Wim Taymans 2017-03-23 17:57:03 +01:00
parent f613240b66
commit d9a51b5d14
10 changed files with 41 additions and 25 deletions

View file

@ -32,8 +32,11 @@ struct _PinosArray {
void *data;
size_t size;
size_t alloc;
size_t extend;
};
#define PINOS_ARRAY_INIT(extend) { NULL, 0, 0, extend }
#define pinos_array_get_len_s(a,s) ((a)->size / (s))
#define pinos_array_get_unchecked_s(a,idx,s,t) SPA_MEMBER ((a)->data,(idx)*(s),t)
#define pinos_array_check_index_s(a,idx,s) ((idx) < pinos_array_get_len(a,s))
@ -48,10 +51,11 @@ struct _PinosArray {
(pos)++)
static inline void
pinos_array_init (PinosArray *arr)
pinos_array_init (PinosArray *arr, size_t extend)
{
arr->data = NULL;
arr->size = arr->alloc = 0;
arr->extend = extend;
}
static inline void
@ -71,7 +75,7 @@ pinos_array_ensure_size (PinosArray *arr,
if (SPA_UNLIKELY (alloc < need)) {
void *data;
alloc = SPA_MAX (alloc, 16);
alloc = SPA_MAX (alloc, arr->extend);
while (alloc < need)
alloc *= 2;
if (SPA_UNLIKELY ((data = realloc (arr->data, alloc)) == NULL))

View file

@ -277,7 +277,7 @@ again:
*dt = buf->data;
*sz = buf->size;
spa_debug_pod (data);
// spa_debug_pod (data);
return true;
}
@ -310,7 +310,7 @@ pinos_connection_end_write (PinosConnection *conn,
buf->buffer_size += 8 + size;
spa_debug_pod (p);
// spa_debug_pod (p);
pinos_signal_emit (&conn->need_flush, conn);
}

View file

@ -486,8 +486,8 @@ pinos_context_new (PinosLoop *loop,
this->state = PINOS_CONTEXT_STATE_UNCONNECTED;
pinos_map_init (&this->objects, 64);
pinos_map_init (&this->uris, 64);
pinos_map_init (&this->objects, 64, 32);
pinos_map_init (&this->uris, 64, 32);
spa_list_init (&this->stream_list);
spa_list_init (&this->global_list);

View file

@ -43,6 +43,8 @@ struct _PinosMap {
uint32_t free_list;
};
#define PINOS_MAP_INIT(extend) { PINOS_ARRAY_INIT(extend), 0 }
#define pinos_map_get_size(m) pinos_array_get_len (&(m)->items, PinosMapItem)
#define pinos_map_get_item(m,id) pinos_array_get_unchecked(&(m)->items,id,PinosMapItem)
#define pinos_map_item_is_free(item) ((item)->next & 0x1)
@ -53,9 +55,10 @@ struct _PinosMap {
static inline void
pinos_map_init (PinosMap *map,
size_t size)
size_t size,
size_t extend)
{
pinos_array_init (&map->items);
pinos_array_init (&map->items, extend);
pinos_array_ensure_size (&map->items, size * sizeof (PinosMapItem));
map->free_list = 0;
}

View file

@ -27,25 +27,31 @@
#include <pinos/client/map.h>
#define MAX_URIS 4096
typedef struct {
SpaIDMap map;
PinosMap uris;
PinosArray strings;
} IDMap;
static uint32_t
id_map_get_id (SpaIDMap *map, const char *uri)
{
IDMap *this = SPA_CONTAINER_OF (map, IDMap, map);
uint32_t i = 0;
uint32_t i = 0, len;
void *p;
off_t o;
if (uri != NULL) {
for (i = 0; i < pinos_map_get_size (&this->uris); i++) {
if (strcmp (pinos_map_lookup_unchecked (&this->uris, i), uri) == 0)
o = (off_t) pinos_map_lookup_unchecked (&this->uris, i);
if (strcmp (SPA_MEMBER (this->strings.data, o, char), uri) == 0)
return i;
}
i = pinos_map_insert_new (&this->uris, strdup (uri));
len = strlen (uri);
p = pinos_array_add (&this->strings, SPA_ROUND_UP_N (len+1, 2));
memcpy (p, uri, len+1);
o = (p - this->strings.data);
i = pinos_map_insert_new (&this->uris, (void *)o);
}
return i;
}
@ -54,12 +60,14 @@ static const char *
id_map_get_uri (SpaIDMap *map, uint32_t id)
{
IDMap *this = SPA_CONTAINER_OF (map, IDMap, map);
if (id == SPA_ID_INVALID)
return NULL;
if (SPA_LIKELY (pinos_map_check_id (&this->uris, id)))
return pinos_map_lookup_unchecked (&this->uris, id);
if (SPA_LIKELY (pinos_map_check_id (&this->uris, id))) {
off_t o = (off_t) pinos_map_lookup_unchecked (&this->uris, id);
return SPA_MEMBER (this->strings.data, o, char);
}
return NULL;
}
@ -77,7 +85,8 @@ static IDMap default_id_map = {
id_map_get_uri,
id_map_get_size,
},
{ { NULL, } },
PINOS_MAP_INIT(128),
PINOS_ARRAY_INIT (4096)
};
SpaIDMap *

View file

@ -81,7 +81,7 @@ pinos_properties_new (const char *key, ...)
if (impl == NULL)
return NULL;
pinos_array_init (&impl->items);
pinos_array_init (&impl->items, 16);
va_start (varargs, key);
while (key != NULL) {
@ -112,7 +112,7 @@ pinos_properties_new_dict (const SpaDict *dict)
if (impl == NULL)
return NULL;
pinos_array_init (&impl->items);
pinos_array_init (&impl->items, 16);
for (i = 0; i < dict->n_items; i++)
add_func (&impl->this, strdup (dict->items[i].key), strdup (dict->items[i].value));

View file

@ -225,9 +225,9 @@ pinos_stream_new (PinosContext *context,
this->state = PINOS_STREAM_STATE_UNCONNECTED;
impl->node_state = SPA_NODE_STATE_INIT;
pinos_array_init (&impl->mem_ids);
pinos_array_init (&impl->mem_ids, 64);
pinos_array_ensure_size (&impl->mem_ids, sizeof (MemId) * 64);
pinos_array_init (&impl->buffer_ids);
pinos_array_init (&impl->buffer_ids, 32);
pinos_array_ensure_size (&impl->buffer_ids, sizeof (BufferId) * 64);
impl->pending_seq = SPA_ID_INVALID;

View file

@ -53,7 +53,7 @@ pinos_split_strv (const char *str,
size_t len;
int n = 0;
pinos_array_init (&arr);
pinos_array_init (&arr, 16);
s = pinos_split_walk (str, delimiter, &len, &state);
while (s && n + 1 < max_tokens) {

View file

@ -105,8 +105,8 @@ pinos_client_new (PinosCore *core,
pinos_signal_init (&this->resource_added);
pinos_signal_init (&this->resource_removed);
pinos_map_init (&this->objects, 0);
pinos_map_init (&this->uris, 0);
pinos_map_init (&this->objects, 0, 32);
pinos_map_init (&this->uris, 0, 32);
pinos_signal_init (&this->destroy_signal);
spa_list_insert (core->client_list.prev, &this->link);

View file

@ -293,7 +293,7 @@ pinos_core_new (PinosMainLoop *main_loop,
pinos_uri_init (&this->uri);
pinos_access_init (&this->access);
pinos_map_init (&this->objects, 512);
pinos_map_init (&this->objects, 128, 32);
impl->support[0].uri = SPA_ID_MAP_URI;
impl->support[0].data = this->uri.map;