mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-26 07:05:57 -05:00
[cache] Try to fix cache thread blocking the rest of the server
This commit is contained in:
parent
ff2d0b4ab1
commit
2d9200fcdf
37
src/cache.c
37
src/cache.c
@ -41,6 +41,7 @@
|
|||||||
#include "httpd_daap.h"
|
#include "httpd_daap.h"
|
||||||
#include "transcode.h"
|
#include "transcode.h"
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
#include "worker.h"
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
#include "listener.h"
|
#include "listener.h"
|
||||||
#include "commands.h"
|
#include "commands.h"
|
||||||
@ -191,6 +192,7 @@ static sqlite3 *cache_xcode_hdl;
|
|||||||
static struct event *cache_xcode_updateev;
|
static struct event *cache_xcode_updateev;
|
||||||
static struct event *cache_xcode_prepareev;
|
static struct event *cache_xcode_prepareev;
|
||||||
static bool cache_xcode_is_enabled;
|
static bool cache_xcode_is_enabled;
|
||||||
|
static bool cache_xcode_prepare_is_running;
|
||||||
static int cache_xcode_last_file;
|
static int cache_xcode_last_file;
|
||||||
static struct cache_db_def cache_xcode_db_def[] = {
|
static struct cache_db_def cache_xcode_db_def[] = {
|
||||||
DB_DEF_ADMIN,
|
DB_DEF_ADMIN,
|
||||||
@ -899,6 +901,15 @@ xcode_header_get(void *arg, int *retval)
|
|||||||
#undef Q_TMPL
|
#undef Q_TMPL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
xcode_trigger(void)
|
||||||
|
{
|
||||||
|
struct timeval delay_xcode = { 5, 0 };
|
||||||
|
|
||||||
|
if (cache_xcode_is_enabled)
|
||||||
|
event_add(cache_xcode_updateev, &delay_xcode);
|
||||||
|
}
|
||||||
|
|
||||||
static enum command_state
|
static enum command_state
|
||||||
xcode_toggle(void *arg, int *retval)
|
xcode_toggle(void *arg, int *retval)
|
||||||
{
|
{
|
||||||
@ -906,8 +917,7 @@ xcode_toggle(void *arg, int *retval)
|
|||||||
|
|
||||||
cache_xcode_is_enabled = *enable;
|
cache_xcode_is_enabled = *enable;
|
||||||
|
|
||||||
if (cache_xcode_is_enabled)
|
xcode_trigger();
|
||||||
event_active(cache_xcode_updateev, 0, 0);
|
|
||||||
|
|
||||||
*retval = 0;
|
*retval = 0;
|
||||||
return COMMAND_END;
|
return COMMAND_END;
|
||||||
@ -1130,7 +1140,7 @@ xcode_prepare_header(sqlite3 *hdl, const char *format, int id, const char *path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
xcode_prepare_next_header(sqlite3 *hdl, const char *format)
|
xcode_prepare_next_header_impl(sqlite3 *hdl, const char *format)
|
||||||
{
|
{
|
||||||
#define Q_TMPL "SELECT f.id, f.filepath, d.id FROM files f LEFT JOIN data d ON f.id = d.file_id AND d.format = '%q' WHERE d.id IS NULL LIMIT 1;"
|
#define Q_TMPL "SELECT f.id, f.filepath, d.id FROM files f LEFT JOIN data d ON f.id = d.file_id AND d.format = '%q' WHERE d.id IS NULL LIMIT 1;"
|
||||||
sqlite3_stmt *stmt;
|
sqlite3_stmt *stmt;
|
||||||
@ -1170,16 +1180,17 @@ xcode_prepare_next_header(sqlite3 *hdl, const char *format)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cache_xcode_prepare_cb(int fd, short what, void *arg)
|
xcode_prepare_next_header(void *arg)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
// Preparing headers can take very long, so we take one at a time, letting the
|
// Preparing headers can take very long, so we take one at a time, letting the
|
||||||
// event loop run in between
|
// event loop run in between
|
||||||
ret = xcode_prepare_next_header(cache_xcode_hdl, "mp4");
|
ret = xcode_prepare_next_header_impl(cache_xcode_hdl, "mp4");
|
||||||
if (ret < 0 || ret == cache_xcode_last_file)
|
if (ret < 0 || ret == cache_xcode_last_file)
|
||||||
{
|
{
|
||||||
DPRINTF(E_LOG, L_CACHE, "Header generation completed\n");
|
DPRINTF(E_LOG, L_CACHE, "Header generation completed\n");
|
||||||
|
cache_xcode_prepare_is_running = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1192,17 +1203,24 @@ cache_xcode_prepare_cb(int fd, short what, void *arg)
|
|||||||
event_active(cache_xcode_prepareev, 0, 0);
|
event_active(cache_xcode_prepareev, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cache_xcode_prepare_cb(int fd, short what, void *arg)
|
||||||
|
{
|
||||||
|
worker_execute(xcode_prepare_next_header, NULL, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cache_xcode_update_cb(int fd, short what, void *arg)
|
cache_xcode_update_cb(int fd, short what, void *arg)
|
||||||
{
|
{
|
||||||
if (xcode_sync_with_files(cache_xcode_hdl) < 0)
|
if (xcode_sync_with_files(cache_xcode_hdl) < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!cache_is_initialized)
|
if (!cache_is_initialized || cache_xcode_prepare_is_running)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DPRINTF(E_LOG, L_CACHE, "Kicking off header generation\n");
|
DPRINTF(E_LOG, L_CACHE, "Kicking off header generation\n");
|
||||||
|
|
||||||
|
cache_xcode_prepare_is_running = true;
|
||||||
event_active(cache_xcode_prepareev, 0, 0);
|
event_active(cache_xcode_prepareev, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1213,14 +1231,12 @@ static enum command_state
|
|||||||
cache_database_update(void *arg, int *retval)
|
cache_database_update(void *arg, int *retval)
|
||||||
{
|
{
|
||||||
struct timeval delay_daap = { 10, 0 };
|
struct timeval delay_daap = { 10, 0 };
|
||||||
struct timeval delay_xcode = { 5, 0 };
|
|
||||||
|
|
||||||
event_add(cache_daap_updateev, &delay_daap);
|
event_add(cache_daap_updateev, &delay_daap);
|
||||||
|
|
||||||
// TODO unlink or rename cache.db
|
// TODO unlink or rename cache.db
|
||||||
|
|
||||||
if (cache_xcode_is_enabled)
|
xcode_trigger();
|
||||||
event_add(cache_xcode_updateev, &delay_xcode);
|
|
||||||
|
|
||||||
*retval = 0;
|
*retval = 0;
|
||||||
return COMMAND_END;
|
return COMMAND_END;
|
||||||
@ -1631,6 +1647,7 @@ cache(void *arg)
|
|||||||
CHECK_NULL(L_CACHE, cache_daap_updateev = evtimer_new(evbase_cache, cache_daap_update_cb, NULL));
|
CHECK_NULL(L_CACHE, cache_daap_updateev = evtimer_new(evbase_cache, cache_daap_update_cb, NULL));
|
||||||
CHECK_NULL(L_CACHE, cache_xcode_updateev = evtimer_new(evbase_cache, cache_xcode_update_cb, NULL));
|
CHECK_NULL(L_CACHE, cache_xcode_updateev = evtimer_new(evbase_cache, cache_xcode_update_cb, NULL));
|
||||||
CHECK_NULL(L_CACHE, cache_xcode_prepareev = evtimer_new(evbase_cache, cache_xcode_prepare_cb, NULL));
|
CHECK_NULL(L_CACHE, cache_xcode_prepareev = evtimer_new(evbase_cache, cache_xcode_prepare_cb, NULL));
|
||||||
|
CHECK_ERR(L_CACHE, event_priority_set(cache_xcode_prepareev, 0));
|
||||||
|
|
||||||
CHECK_ERR(L_CACHE, listener_add(cache_daap_listener_cb, LISTENER_DATABASE));
|
CHECK_ERR(L_CACHE, listener_add(cache_daap_listener_cb, LISTENER_DATABASE));
|
||||||
|
|
||||||
@ -1973,7 +1990,9 @@ cache_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CHECK_NULL(L_CACHE, evbase_cache = event_base_new());
|
CHECK_NULL(L_CACHE, evbase_cache = event_base_new());
|
||||||
|
CHECK_ERR(L_CACHE, event_base_priority_init(evbase_cache, 8));
|
||||||
CHECK_NULL(L_CACHE, cmdbase = commands_base_new(evbase_cache, NULL));
|
CHECK_NULL(L_CACHE, cmdbase = commands_base_new(evbase_cache, NULL));
|
||||||
|
|
||||||
CHECK_ERR(L_CACHE, pthread_create(&tid_cache, NULL, cache, NULL));
|
CHECK_ERR(L_CACHE, pthread_create(&tid_cache, NULL, cache, NULL));
|
||||||
thread_setname(tid_cache, "cache");
|
thread_setname(tid_cache, "cache");
|
||||||
|
|
||||||
|
@ -1201,6 +1201,8 @@ httpd_xcode_profile_get(const char *user_agent, const char *address, const char
|
|||||||
if (profile == XCODE_NONE)
|
if (profile == XCODE_NONE)
|
||||||
return profile;
|
return profile;
|
||||||
|
|
||||||
|
DPRINTF(E_DBG, L_HTTPD, "Checking if client '%s' is a speaker\n", address);
|
||||||
|
|
||||||
// A Roku Soundbridge may also be RCP device/speaker for which the user may
|
// A Roku Soundbridge may also be RCP device/speaker for which the user may
|
||||||
// have set a prefered streaming format
|
// have set a prefered streaming format
|
||||||
ret = player_speaker_get_byaddress(&spk, address);
|
ret = player_speaker_get_byaddress(&spk, address);
|
||||||
|
Loading…
Reference in New Issue
Block a user