Improve debug

Add proxy destroy function and use it to free proxy user_data.
Destroy sources from the poll thread.
Fix format init
This commit is contained in:
Wim Taymans 2017-05-29 10:28:19 +02:00
parent cf94117244
commit f6ca32cdcf
12 changed files with 120 additions and 26 deletions

View file

@ -25,12 +25,17 @@
#include <unistd.h>
#include <sys/socket.h>
#include <spa/lib/debug.h>
#include "pipewire.h"
#include "connection.h"
#include "log.h"
#define MAX_BUFFER_SIZE 4096
#define MAX_FDS 28
static bool debug_messages = 0;
struct buffer {
uint8_t *buffer_data;
size_t buffer_size;
@ -161,6 +166,8 @@ struct pw_connection *pw_connection_new(int fd)
if (impl == NULL)
return NULL;
debug_messages = pw_debug_is_category_enabled("connection");
this = &impl->this;
pw_log_debug("connection %p: new", this);
@ -271,7 +278,11 @@ pw_connection_get_next(struct pw_connection *conn,
*dt = buf->data;
*sz = buf->size;
// spa_debug_pod (data);
if (debug_messages) {
printf("<<<<<<<<< in:\n");
spa_debug_pod((struct spa_pod *)data, NULL);
}
return true;
}
@ -299,6 +310,11 @@ pw_connection_end_write(struct pw_connection *conn, uint32_t dest_id, uint8_t op
buf->buffer_size += 8 + size;
if (debug_messages) {
printf(">>>>>>>>> out:\n");
spa_debug_pod((struct spa_pod *)p, NULL);
}
pw_signal_emit(&conn->need_flush, conn);
}

View file

@ -254,6 +254,26 @@ static const struct pw_link_events link_events = {
&link_event_info
};
static void
destroy_proxy (struct pw_proxy *proxy)
{
if (proxy->user_data == NULL)
return;
if (proxy->type == proxy->context->type.core) {
pw_core_info_free (proxy->user_data);
} else if (proxy->type == proxy->context->type.node) {
pw_node_info_free (proxy->user_data);
} else if (proxy->type == proxy->context->type.module) {
pw_module_info_free (proxy->user_data);
} else if (proxy->type == proxy->context->type.client) {
pw_client_info_free (proxy->user_data);
} else if (proxy->type == proxy->context->type.link) {
pw_link_info_free (proxy->user_data);
}
proxy->user_data = NULL;
}
static void registry_event_global(void *object, uint32_t id, const char *type)
{
struct pw_proxy *registry_proxy = object;
@ -292,6 +312,7 @@ static void registry_event_global(void *object, uint32_t id, const char *type)
proxy->implementation = &link_events;
}
if (proxy) {
proxy->destroy = (pw_destroy_t)destroy_proxy;
pw_registry_do_bind(registry_proxy, id, proxy->id);
}
@ -467,6 +488,7 @@ void pw_context_destroy(struct pw_context *context)
pw_proxy_destroy(proxy);
pw_map_clear(&context->objects);
pw_map_clear(&context->types);
free(context->name);
if (context->properties)
@ -565,6 +587,7 @@ bool pw_context_connect_fd(struct pw_context *context, enum pw_context_flags fla
goto no_proxy;
context->core_proxy->implementation = &core_events;
context->core_proxy->destroy = (pw_destroy_t)destroy_proxy;
pw_core_do_client_update(context->core_proxy, &context->properties->dict);

View file

@ -190,9 +190,6 @@ struct pw_core_info *pw_core_info_update(struct pw_core_info *info,
void pw_core_info_free(struct pw_core_info *info)
{
if (info == NULL)
return;
if (info->user_name)
free((void *) info->user_name);
if (info->host_name)
@ -286,8 +283,6 @@ void pw_node_info_free(struct pw_node_info *info)
{
int i;
if (info == NULL)
return;
if (info->name)
free((void *) info->name);
if (info->input_formats) {
@ -351,9 +346,6 @@ struct pw_module_info *pw_module_info_update(struct pw_module_info *info,
void pw_module_info_free(struct pw_module_info *info)
{
if (info == NULL)
return;
if (info->name)
free((void *) info->name);
if (info->filename)
@ -395,8 +387,6 @@ struct pw_client_info *pw_client_info_update(struct pw_client_info *info,
void pw_client_info_free(struct pw_client_info *info)
{
if (info == NULL)
return;
if (info->props)
pw_spa_dict_destroy(info->props);
free(info);

View file

@ -41,7 +41,11 @@ struct debug_log {
static void
do_logv(struct spa_log *log,
enum spa_log_level level,
const char *file, int line, const char *func, const char *fmt, va_list args)
const char *file,
int line,
const char *func,
const char *fmt,
va_list args)
{
struct debug_log *l = SPA_CONTAINER_OF(log, struct debug_log, log);
char text[1024], location[1024];
@ -73,7 +77,11 @@ do_logv(struct spa_log *log,
static void
do_log(struct spa_log *log,
enum spa_log_level level, const char *file, int line, const char *func, const char *fmt, ...)
enum spa_log_level level,
const char *file,
int line,
const char *func,
const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
@ -139,7 +147,10 @@ void pw_log_set_trace_event(struct spa_source *source)
void
pw_log_log(enum spa_log_level level,
const char *file, int line, const char *func, const char *fmt, ...)
const char *file,
int line,
const char *func,
const char *fmt, ...)
{
if (SPA_UNLIKELY(pw_log_level_enabled(level))) {
va_list args;
@ -151,7 +162,11 @@ pw_log_log(enum spa_log_level level,
void
pw_log_logv(enum spa_log_level level,
const char *file, int line, const char *func, const char *fmt, va_list args)
const char *file,
int line,
const char *func,
const char *fmt,
va_list args)
{
if (SPA_UNLIKELY(pw_log_level_enabled(level))) {
do_logv(&log.log, level, file, line, func, fmt, args);

View file

@ -50,6 +50,7 @@ struct impl {
struct pw_loop this;
struct spa_list source_list;
struct spa_list destroy_list;
spa_loop_hook_t pre_func;
spa_loop_hook_t post_func;
@ -276,6 +277,7 @@ static int loop_iterate(struct spa_loop_control *ctrl, int timeout)
struct pw_loop *loop = &impl->this;
struct epoll_event ep[32];
int i, nfds, save_errno;
struct source_impl *source, *tmp;
pw_signal_emit(&loop->before_iterate, loop);
@ -297,15 +299,20 @@ static int loop_iterate(struct spa_loop_control *ctrl, int timeout)
* some callback might also want to look at other sources it manages and
* can then reset the rmask to suppress the callback */
for (i = 0; i < nfds; i++) {
struct spa_source *source = ep[i].data.ptr;
source->rmask = spa_epoll_to_io(ep[i].events);
struct spa_source *s = ep[i].data.ptr;
s->rmask = spa_epoll_to_io(ep[i].events);
}
for (i = 0; i < nfds; i++) {
struct spa_source *source = ep[i].data.ptr;
if (source->rmask) {
source->func(source);
struct spa_source *s = ep[i].data.ptr;
if (s->rmask) {
s->func(s);
}
}
spa_list_for_each_safe(source, tmp, &impl->destroy_list, link)
free(source);
spa_list_init(&impl->destroy_list);
return SPA_RESULT_OK;
}
@ -555,6 +562,7 @@ static struct spa_source *loop_add_signal(struct spa_loop_utils *utils,
static void loop_destroy_source(struct spa_source *source)
{
struct source_impl *impl = SPA_CONTAINER_OF(source, struct source_impl, source);
struct impl *loop_impl = SPA_CONTAINER_OF(source->loop, struct impl, loop);
spa_list_remove(&impl->link);
@ -562,7 +570,8 @@ static void loop_destroy_source(struct spa_source *source)
if (source->fd != -1 && impl->close)
close(source->fd);
free(impl);
spa_list_insert(&loop_impl->destroy_list, &impl->link);
}
struct pw_loop *pw_loop_new(void)
@ -581,6 +590,7 @@ struct pw_loop *pw_loop_new(void)
goto no_epoll;
spa_list_init(&impl->source_list);
spa_list_init(&impl->destroy_list);
pw_signal_init(&this->before_iterate);
pw_signal_init(&this->destroy_signal);
@ -633,6 +643,8 @@ void pw_loop_destroy(struct pw_loop *loop)
spa_list_for_each_safe(source, tmp, &impl->source_list, link)
loop_destroy_source(&source->source);
spa_list_for_each_safe(source, tmp, &impl->destroy_list, link)
free(source);
close(impl->epoll_fd);
free(impl);

View file

@ -18,12 +18,28 @@
*/
#include <unistd.h>
#include <limits.h>
#include <stdio.h>
#include <sys/prctl.h>
#include <pwd.h>
#include "pipewire/client/pipewire.h"
static char **categories = NULL;
static void configure_debug(const char *str)
{
char **level;
int n_tokens;
level = pw_split_strv(str, ":", INT_MAX, &n_tokens);
if (n_tokens > 0)
pw_log_set_level(atoi(level[0]));
if (n_tokens > 1)
categories = pw_split_strv(level[1], ",", INT_MAX, &n_tokens);
}
/**
* pw_init:
* @argc: pointer to argc
@ -37,7 +53,21 @@ void pw_init(int *argc, char **argv[])
const char *str;
if ((str = getenv("PIPEWIRE_DEBUG")))
pw_log_set_level(atoi(str));
configure_debug(str);
}
bool pw_debug_is_category_enabled(const char *name)
{
int i;
if (categories == NULL)
return false;
for (i = 0; categories[i]; i++) {
if (strcmp (categories[i], name) == 0)
return true;
}
return false;
}
const char *pw_get_application_name(void)

View file

@ -40,6 +40,9 @@ extern "C" {
void
pw_init(int *argc, char **argv[]);
bool
pw_debug_is_category_enabled(const char *name);
const char *
pw_get_application_name(void);

View file

@ -71,5 +71,8 @@ void pw_proxy_destroy(struct pw_proxy *proxy)
pw_map_remove(&proxy->context->objects, proxy->id);
spa_list_remove(&proxy->link);
if (proxy->destroy)
proxy->destroy(proxy);
free(impl);
}

View file

@ -27,6 +27,7 @@ extern "C" {
#include <pipewire/client/connection.h>
#include <pipewire/client/context.h>
#include <pipewire/client/type.h>
#include <pipewire/client/utils.h>
struct pw_proxy {
struct pw_context *context;
@ -39,6 +40,7 @@ struct pw_proxy {
const void *implementation;
void *user_data;
pw_destroy_t destroy;
PW_SIGNAL(destroy_signal, (struct pw_listener *listener, struct pw_proxy *proxy));
};

View file

@ -27,6 +27,8 @@ extern "C" {
#include <spa/defs.h>
#include <spa/pod-utils.h>
typedef void (*pw_destroy_t) (void *object);
const char *
pw_split_walk(const char *str, const char *delimiter, size_t *len, const char **state);

View file

@ -32,8 +32,6 @@ extern "C" {
#include <pipewire/client/sig.h>
#include <pipewire/server/core.h>
typedef void (*pw_destroy_t) (void *object);
struct pw_resource {
struct pw_core *core;
struct spa_list link;

View file

@ -29,7 +29,7 @@ extern "C" {
#include <spa/format.h>
#include <spa/pod-builder.h>
#define SPA_FORMAT_INIT(size,type,media_type,media_subtype,...) \
#define SPA_FORMAT_INIT(size,type,media_type,media_subtype) \
{ { size, SPA_POD_TYPE_OBJECT }, \
{ { 0, type }, \
SPA_POD_ID_INIT(media_type), \
@ -43,7 +43,7 @@ spa_pod_builder_push_format(struct spa_pod_builder *builder,
uint32_t media_subtype)
{
const struct spa_format p = SPA_FORMAT_INIT(sizeof(struct spa_format_body),
0, format_type, media_type, media_subtype);
format_type, media_type, media_subtype);
return spa_pod_builder_push(builder, frame, &p.pod,
spa_pod_builder_raw(builder, &p, sizeof(p)));
}