mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
mem: use MemId to pass buffer memory
Track memory on buffers in the server and simplify some memory tracking on the client. Don't send internal memblock flags to client. Add read/write flags to memblock.
This commit is contained in:
parent
2caf81c97c
commit
bae1426615
6 changed files with 30 additions and 29 deletions
|
|
@ -74,6 +74,7 @@ struct buffer {
|
|||
struct spa_buffer buffer;
|
||||
struct spa_meta metas[4];
|
||||
struct spa_data datas[4];
|
||||
struct pw_memblock *mem;
|
||||
};
|
||||
|
||||
struct mix {
|
||||
|
|
@ -235,9 +236,6 @@ static int clear_buffers(struct node *this, struct mix *mix)
|
|||
uint32_t i, j;
|
||||
struct impl *impl = this->impl;
|
||||
|
||||
if (this->resource == NULL)
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < mix->n_buffers; i++) {
|
||||
struct buffer *b = &mix->buffers[i];
|
||||
struct pw_memblock *m;
|
||||
|
|
@ -247,16 +245,18 @@ static int clear_buffers(struct node *this, struct mix *mix)
|
|||
for (j = 0; j < b->buffer.n_datas; j++) {
|
||||
struct spa_data *d = &b->datas[j];
|
||||
|
||||
if (d->type == SPA_DATA_DmaBuf ||
|
||||
d->type == SPA_DATA_MemFd) {
|
||||
if (d->type == SPA_DATA_MemId) {
|
||||
uint32_t id;
|
||||
|
||||
id = SPA_PTR_TO_UINT32(b->buffer.datas[j].data);
|
||||
m = pw_mempool_find_id(this->resource->client->pool, id);
|
||||
if (m)
|
||||
if (m) {
|
||||
pw_log_debug(NAME " %p: mem %d", impl, m->id);
|
||||
pw_memblock_unref(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
pw_memblock_unref(b->mem);
|
||||
}
|
||||
mix->n_buffers = 0;
|
||||
return 0;
|
||||
|
|
@ -766,6 +766,8 @@ do_port_use_buffers(struct impl *impl,
|
|||
if (m == NULL)
|
||||
return -errno;
|
||||
|
||||
b->mem = m;
|
||||
|
||||
mb[i].buffer = &b->buffer;
|
||||
mb[i].mem_id = m->id;
|
||||
mb[i].offset = SPA_PTRDIFF(baseptr, SPA_MEMBER(mem->map->ptr, 0, void));
|
||||
|
|
@ -788,6 +790,7 @@ do_port_use_buffers(struct impl *impl,
|
|||
d->type, d->fd, d->flags);
|
||||
if (m == NULL)
|
||||
return -errno;
|
||||
b->buffer.datas[j].type = SPA_DATA_MemId;
|
||||
b->buffer.datas[j].data = SPA_UINT32_TO_PTR(m->id);
|
||||
} else if (d->type == SPA_DATA_MemPtr) {
|
||||
spa_log_debug(this->log, "mem %d %zd", j, SPA_PTRDIFF(d->data, baseptr));
|
||||
|
|
|
|||
|
|
@ -48,8 +48,7 @@
|
|||
struct buffer {
|
||||
uint32_t id;
|
||||
struct spa_buffer *buf;
|
||||
struct pw_memmap **mem;
|
||||
uint32_t n_mem;
|
||||
struct pw_memmap *mem;
|
||||
};
|
||||
|
||||
struct io {
|
||||
|
|
@ -534,7 +533,6 @@ static int clear_buffers(struct node_data *data, struct mix *mix)
|
|||
{
|
||||
struct pw_port *port = mix->port;
|
||||
struct buffer *b;
|
||||
uint32_t i;
|
||||
int res;
|
||||
|
||||
pw_log_debug("port %p: clear buffers %d", port, mix->mix_id);
|
||||
|
|
@ -544,12 +542,9 @@ static int clear_buffers(struct node_data *data, struct mix *mix)
|
|||
}
|
||||
|
||||
pw_array_for_each(b, &mix->buffers) {
|
||||
for (i = 0; i < b->n_mem; i++) {
|
||||
pw_log_debug("port %p: clear buffer %d map %p",
|
||||
port, b->id, b->mem[i]);
|
||||
pw_memmap_free(b->mem[i]);
|
||||
}
|
||||
b->n_mem = 0;
|
||||
pw_log_debug("port %p: clear buffer %d map %p",
|
||||
port, b->id, b->mem);
|
||||
pw_memmap_free(b->mem);
|
||||
free(b->buf);
|
||||
}
|
||||
mix->buffers.size = 0;
|
||||
|
|
@ -639,19 +634,17 @@ client_node_port_use_buffers(void *object,
|
|||
goto error_exit_cleanup;
|
||||
}
|
||||
bid->id = i;
|
||||
bid->mem = mm;
|
||||
|
||||
if (mlock(mm->ptr, mm->size) < 0)
|
||||
pw_log_warn("Failed to mlock memory %p %u: %m",
|
||||
mm->ptr, mm->size);
|
||||
|
||||
size = sizeof(struct spa_buffer);
|
||||
size += sizeof(struct pw_memmap *);
|
||||
for (j = 0; j < buffers[i].buffer->n_metas; j++)
|
||||
size += sizeof(struct spa_meta);
|
||||
for (j = 0; j < buffers[i].buffer->n_datas; j++) {
|
||||
for (j = 0; j < buffers[i].buffer->n_datas; j++)
|
||||
size += sizeof(struct spa_data);
|
||||
size += sizeof(struct pw_memmap *);
|
||||
}
|
||||
|
||||
b = bid->buf = malloc(size);
|
||||
if (b == NULL) {
|
||||
|
|
@ -663,10 +656,6 @@ client_node_port_use_buffers(void *object,
|
|||
b->metas = SPA_MEMBER(b, sizeof(struct spa_buffer), struct spa_meta);
|
||||
b->datas = SPA_MEMBER(b->metas, sizeof(struct spa_meta) * b->n_metas,
|
||||
struct spa_data);
|
||||
bid->mem = SPA_MEMBER(b->datas, sizeof(struct spa_data) * b->n_datas,
|
||||
struct pw_memmap *);
|
||||
bid->n_mem = 0;
|
||||
bid->mem[bid->n_mem++] = mm;
|
||||
|
||||
pw_log_debug("add buffer %d %d %u %u", mm->block->id,
|
||||
bid->id, buffers[i].offset, buffers[i].size);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue