mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
pulse-server: limit the amount of connections
Set to 64, like pulseaudio. We might want to configure this. See #1305
This commit is contained in:
parent
4aa80c7a71
commit
38c721993f
2 changed files with 27 additions and 18 deletions
|
|
@ -197,6 +197,7 @@ struct server {
|
||||||
|
|
||||||
struct spa_source *source;
|
struct spa_source *source;
|
||||||
struct spa_list clients;
|
struct spa_list clients;
|
||||||
|
uint32_t n_clients;
|
||||||
unsigned int activated:1;
|
unsigned int activated:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@
|
||||||
#define LISTEN_BACKLOG 32
|
#define LISTEN_BACKLOG 32
|
||||||
|
|
||||||
#define MAX_FORMATS 32
|
#define MAX_FORMATS 32
|
||||||
|
#define MAX_CLIENTS 64
|
||||||
|
|
||||||
#include "format.c"
|
#include "format.c"
|
||||||
#include "volume.c"
|
#include "volume.c"
|
||||||
|
|
@ -1675,6 +1676,7 @@ static void stream_process(void *data)
|
||||||
pd.missing = size;
|
pd.missing = size;
|
||||||
pd.underrun = false;
|
pd.underrun = false;
|
||||||
}
|
}
|
||||||
|
pw_log_debug("produce %d", size);
|
||||||
buf->datas[0].chunk->offset = 0;
|
buf->datas[0].chunk->offset = 0;
|
||||||
buf->datas[0].chunk->stride = stream->frame_size;
|
buf->datas[0].chunk->stride = stream->frame_size;
|
||||||
buf->datas[0].chunk->size = size;
|
buf->datas[0].chunk->size = size;
|
||||||
|
|
@ -5355,6 +5357,7 @@ static bool client_detach(struct client *client)
|
||||||
|
|
||||||
/* remove from the `server->clients` list */
|
/* remove from the `server->clients` list */
|
||||||
spa_list_remove(&client->link);
|
spa_list_remove(&client->link);
|
||||||
|
client->server->n_clients--;
|
||||||
client->server = NULL;
|
client->server = NULL;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -5770,7 +5773,18 @@ on_connect(void *data, int fd, uint32_t mask)
|
||||||
struct sockaddr_storage name;
|
struct sockaddr_storage name;
|
||||||
socklen_t length;
|
socklen_t length;
|
||||||
int client_fd, val, pid;
|
int client_fd, val, pid;
|
||||||
struct client *client;
|
struct client *client = NULL;
|
||||||
|
|
||||||
|
length = sizeof(name);
|
||||||
|
client_fd = accept4(fd, (struct sockaddr *) &name, &length, SOCK_CLOEXEC);
|
||||||
|
if (client_fd < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
if (server->n_clients >= MAX_CLIENTS) {
|
||||||
|
close(client_fd);
|
||||||
|
errno = ECONNREFUSED;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
client = calloc(1, sizeof(struct client));
|
client = calloc(1, sizeof(struct client));
|
||||||
if (client == NULL)
|
if (client == NULL)
|
||||||
|
|
@ -5778,14 +5792,24 @@ on_connect(void *data, int fd, uint32_t mask)
|
||||||
|
|
||||||
client->impl = impl;
|
client->impl = impl;
|
||||||
client->ref = 1;
|
client->ref = 1;
|
||||||
client->server = server;
|
|
||||||
client->connect_tag = SPA_ID_INVALID;
|
client->connect_tag = SPA_ID_INVALID;
|
||||||
|
client->server = server;
|
||||||
spa_list_append(&server->clients, &client->link);
|
spa_list_append(&server->clients, &client->link);
|
||||||
|
server->n_clients++;
|
||||||
pw_map_init(&client->streams, 16, 16);
|
pw_map_init(&client->streams, 16, 16);
|
||||||
spa_list_init(&client->out_messages);
|
spa_list_init(&client->out_messages);
|
||||||
spa_list_init(&client->operations);
|
spa_list_init(&client->operations);
|
||||||
spa_list_init(&client->pending_samples);
|
spa_list_init(&client->pending_samples);
|
||||||
|
|
||||||
|
pw_log_debug(NAME": client %p fd:%d", client, client_fd);
|
||||||
|
|
||||||
|
client->source = pw_loop_add_io(impl->loop,
|
||||||
|
client_fd,
|
||||||
|
SPA_IO_ERR | SPA_IO_HUP | SPA_IO_IN,
|
||||||
|
true, on_client_data, client);
|
||||||
|
if (client->source == NULL)
|
||||||
|
goto error;
|
||||||
|
|
||||||
client->props = pw_properties_new(
|
client->props = pw_properties_new(
|
||||||
PW_KEY_CLIENT_API, "pipewire-pulse",
|
PW_KEY_CLIENT_API, "pipewire-pulse",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
@ -5800,13 +5824,6 @@ on_connect(void *data, int fd, uint32_t mask)
|
||||||
if (client->routes == NULL)
|
if (client->routes == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
length = sizeof(name);
|
|
||||||
client_fd = accept4(fd, (struct sockaddr *) &name, &length, SOCK_CLOEXEC);
|
|
||||||
if (client_fd < 0)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
pw_log_debug(NAME": client %p fd:%d", client, client_fd);
|
|
||||||
|
|
||||||
if (server->addr.ss_family == AF_UNIX) {
|
if (server->addr.ss_family == AF_UNIX) {
|
||||||
#ifdef SO_PRIORITY
|
#ifdef SO_PRIORITY
|
||||||
val = 6;
|
val = 6;
|
||||||
|
|
@ -5827,17 +5844,8 @@ on_connect(void *data, int fd, uint32_t mask)
|
||||||
if (setsockopt(client_fd, IPPROTO_IP, IP_TOS, &val, sizeof(val)) < 0)
|
if (setsockopt(client_fd, IPPROTO_IP, IP_TOS, &val, sizeof(val)) < 0)
|
||||||
pw_log_warn("setsockopt(IP_TOS) failed: %m");
|
pw_log_warn("setsockopt(IP_TOS) failed: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
pw_properties_set(client->props, PW_KEY_CLIENT_ACCESS, "restricted");
|
pw_properties_set(client->props, PW_KEY_CLIENT_ACCESS, "restricted");
|
||||||
}
|
}
|
||||||
|
|
||||||
client->source = pw_loop_add_io(impl->loop,
|
|
||||||
client_fd,
|
|
||||||
SPA_IO_ERR | SPA_IO_HUP | SPA_IO_IN,
|
|
||||||
true, on_client_data, client);
|
|
||||||
if (client->source == NULL)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
error:
|
error:
|
||||||
pw_log_error(NAME" %p: failed to create client: %m", impl);
|
pw_log_error(NAME" %p: failed to create client: %m", impl);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue