mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
context: drop RT when freewheeling
When we are freewheeling, drop the RT priority so that we don't lock up the system too much.
This commit is contained in:
parent
9ceb728dec
commit
5e0c9199bd
2 changed files with 35 additions and 0 deletions
|
|
@ -41,6 +41,7 @@
|
||||||
|
|
||||||
#include <pipewire/impl.h>
|
#include <pipewire/impl.h>
|
||||||
#include <pipewire/private.h>
|
#include <pipewire/private.h>
|
||||||
|
#include <pipewire/thread.h>
|
||||||
#include <pipewire/conf.h>
|
#include <pipewire/conf.h>
|
||||||
|
|
||||||
#include <pipewire/extensions/protocol-native.h>
|
#include <pipewire/extensions/protocol-native.h>
|
||||||
|
|
@ -183,6 +184,30 @@ static int try_load_conf(struct pw_context *this, const char *conf_prefix,
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int context_set_freewheel(struct pw_context *context, bool freewheel)
|
||||||
|
{
|
||||||
|
struct pw_thread *thr;
|
||||||
|
int res;
|
||||||
|
|
||||||
|
if ((thr = pw_data_loop_get_thread(context->data_loop_impl)) == NULL)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
if (freewheel) {
|
||||||
|
pw_log_info(NAME" %p: enter freewheel", context);
|
||||||
|
res = pw_thread_utils_drop_rt(thr);
|
||||||
|
} else {
|
||||||
|
pw_log_info(NAME" %p: exit freewheel", context);
|
||||||
|
res = pw_thread_utils_acquire_rt(thr, 88);
|
||||||
|
}
|
||||||
|
if (res < 0)
|
||||||
|
pw_log_info(NAME" %p: freewheel error:%s", context, spa_strerror(res));
|
||||||
|
|
||||||
|
context->freewheeling = freewheel;
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Create a new context object
|
/** Create a new context object
|
||||||
*
|
*
|
||||||
* \param main_loop the main loop to use
|
* \param main_loop the main loop to use
|
||||||
|
|
@ -385,6 +410,8 @@ struct pw_context *pw_context_new(struct pw_loop *main_loop,
|
||||||
if ((res = pw_data_loop_start(this->data_loop_impl)) < 0)
|
if ((res = pw_data_loop_start(this->data_loop_impl)) < 0)
|
||||||
goto error_free;
|
goto error_free;
|
||||||
|
|
||||||
|
context_set_freewheel(this, false);
|
||||||
|
|
||||||
pw_settings_init(this);
|
pw_settings_init(this);
|
||||||
|
|
||||||
pw_log_debug(NAME" %p: created", this);
|
pw_log_debug(NAME" %p: created", this);
|
||||||
|
|
@ -982,6 +1009,7 @@ int pw_context_recalc_graph(struct pw_context *context, const char *reason)
|
||||||
struct impl *impl = SPA_CONTAINER_OF(context, struct impl, this);
|
struct impl *impl = SPA_CONTAINER_OF(context, struct impl, this);
|
||||||
struct pw_impl_node *n, *s, *target, *fallback;
|
struct pw_impl_node *n, *s, *target, *fallback;
|
||||||
uint32_t max_quantum, min_quantum, def_quantum, def_rate;
|
uint32_t max_quantum, min_quantum, def_quantum, def_rate;
|
||||||
|
bool freewheel = false;
|
||||||
|
|
||||||
pw_log_info(NAME" %p: busy:%d reason:%s", context, impl->recalc, reason);
|
pw_log_info(NAME" %p: busy:%d reason:%s", context, impl->recalc, reason);
|
||||||
|
|
||||||
|
|
@ -1029,6 +1057,8 @@ again:
|
||||||
* is a target for our unassigned nodes */
|
* is a target for our unassigned nodes */
|
||||||
if (target == NULL)
|
if (target == NULL)
|
||||||
target = n;
|
target = n;
|
||||||
|
if (n->freewheel)
|
||||||
|
freewheel = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1037,6 +1067,10 @@ again:
|
||||||
if (target == NULL)
|
if (target == NULL)
|
||||||
target = fallback;
|
target = fallback;
|
||||||
|
|
||||||
|
/* update the freewheel status */
|
||||||
|
if (context->freewheeling != freewheel)
|
||||||
|
context_set_freewheel(context, freewheel);
|
||||||
|
|
||||||
/* now go through all available nodes. The ones we didn't visit
|
/* now go through all available nodes. The ones we didn't visit
|
||||||
* in collect_nodes() are not linked to any driver. We assign them
|
* in collect_nodes() are not linked to any driver. We assign them
|
||||||
* to either an active driver of the first driver */
|
* to either an active driver of the first driver */
|
||||||
|
|
|
||||||
|
|
@ -450,6 +450,7 @@ struct pw_context {
|
||||||
struct pw_impl_client *current_client; /**< client currently executing code in mainloop */
|
struct pw_impl_client *current_client; /**< client currently executing code in mainloop */
|
||||||
|
|
||||||
long sc_pagesize;
|
long sc_pagesize;
|
||||||
|
unsigned int freewheeling:1;
|
||||||
|
|
||||||
void *user_data; /**< extra user data */
|
void *user_data; /**< extra user data */
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue