diff --git a/pinos/client/array.h b/pinos/client/array.h index 96b8f5177..a4fa62b9e 100644 --- a/pinos/client/array.h +++ b/pinos/client/array.h @@ -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)) diff --git a/pinos/client/connection.c b/pinos/client/connection.c index 4eb3f01dc..0fb34564b 100644 --- a/pinos/client/connection.c +++ b/pinos/client/connection.c @@ -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); } diff --git a/pinos/client/context.c b/pinos/client/context.c index f0fcffe99..4de993edc 100644 --- a/pinos/client/context.c +++ b/pinos/client/context.c @@ -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); diff --git a/pinos/client/map.h b/pinos/client/map.h index aff00d82a..8913ddf67 100644 --- a/pinos/client/map.h +++ b/pinos/client/map.h @@ -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; } diff --git a/pinos/client/mapper.c b/pinos/client/mapper.c index 96de7e89f..c9c29289f 100644 --- a/pinos/client/mapper.c +++ b/pinos/client/mapper.c @@ -27,25 +27,31 @@ #include -#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 * diff --git a/pinos/client/properties.c b/pinos/client/properties.c index 668d1f02a..e33e04a6d 100644 --- a/pinos/client/properties.c +++ b/pinos/client/properties.c @@ -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)); diff --git a/pinos/client/stream.c b/pinos/client/stream.c index 1fe7f72bd..57fe249c5 100644 --- a/pinos/client/stream.c +++ b/pinos/client/stream.c @@ -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; diff --git a/pinos/client/utils.c b/pinos/client/utils.c index 2824dd9a8..ec2e38720 100644 --- a/pinos/client/utils.c +++ b/pinos/client/utils.c @@ -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) { diff --git a/pinos/server/client.c b/pinos/server/client.c index 57cc3f421..d649e5fde 100644 --- a/pinos/server/client.c +++ b/pinos/server/client.c @@ -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); diff --git a/pinos/server/core.c b/pinos/server/core.c index 7057f45d6..67ab8ef27 100644 --- a/pinos/server/core.c +++ b/pinos/server/core.c @@ -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;