Revert "add chunk_alloc to playlist.c"

This reverts commit 89c021fbfa.

Reason for revert: crash when playing on disk playlist then playing a directory as an in-ram playlist

Change-Id: Ia5cf5da9f46f8c10c5c0f3707e7978c05664b8a4
This commit is contained in:
William Wilgus 2023-01-11 01:14:22 -05:00
parent 89c021fbfa
commit 746fd7f2db
2 changed files with 34 additions and 51 deletions

View file

@ -507,8 +507,10 @@ static void empty_playlist_unlocked(struct playlist_info* playlist, bool resume)
playlist->filename[0] = '\0'; playlist->filename[0] = '\0';
chunk_alloc_free(&playlist->name_chunk_buffer); if (playlist->buffer)
playlist->buffer[0] = 0;
playlist->buffer_end_pos = 0;
playlist->seed = 0; playlist->seed = 0;
playlist->num_cached = 0; playlist->num_cached = 0;
@ -1182,19 +1184,12 @@ static int get_track_filename(struct playlist_info* playlist, int index, int see
{ {
max = dircache_get_fileref_path(&playlist->dcfrefs[index], max = dircache_get_fileref_path(&playlist->dcfrefs[index],
tmp_buf, sizeof(tmp_buf)); tmp_buf, sizeof(tmp_buf));
NOTEF("%s [in DCache]: 0x%x %s", __func__,
playlist->dcfrefs[index], tmp_buf);
} }
#endif /* HAVE_DIRCACHE */ #endif /* HAVE_DIRCACHE */
if (playlist->in_ram && !control_file && max < 0) if (playlist->in_ram && !control_file && max < 0)
{ {
char *namebuf = chunk_get_data(&playlist->name_chunk_buffer, seek); strmemccpy(tmp_buf, (char*)&playlist->buffer[seek], sizeof(tmp_buf));
strmemccpy(tmp_buf, namebuf, sizeof(tmp_buf));
chunk_put_data(&playlist->name_chunk_buffer, seek);
NOTEF("%s [in Ram]: 0x%x %s", __func__, seek, tmp_buf);
} }
else if (max < 0) else if (max < 0)
{ {
@ -1233,7 +1228,6 @@ static int get_track_filename(struct playlist_info* playlist, int index, int see
max = convert_m3u_name(tmp_buf, max, max = convert_m3u_name(tmp_buf, max,
sizeof(tmp_buf), dir_buf); sizeof(tmp_buf), dir_buf);
} }
NOTEF("%s [in File]: 0x%x %s", __func__, seek, tmp_buf);
} }
} }
@ -1975,25 +1969,6 @@ static void dc_thread_playlist(void)
} }
#endif #endif
/*
* Allocate name chunk buffer header for in-ram playlists
*/
static void alloc_namebuffer(void)
{
#if MEMORYSIZE >= 16
# define NAME_CHUNK_SZ (200 << 10) /*200K*/
#elif MEMORYSIZE >= 8
# define NAME_CHUNK_SZ (100 << 10) /*100K*/
#else
# define NAME_CHUNK_SZ (50 << 10) /*50K*/
#endif
struct playlist_info* playlist = &current_playlist;
size_t namebufsz = (AVERAGE_FILENAME_LENGTH * global_settings.max_files_in_dir);
size_t name_chunks = (namebufsz + NAME_CHUNK_SZ - 1) / NAME_CHUNK_SZ;
core_chunk_alloc_init(&playlist->name_chunk_buffer, NAME_CHUNK_SZ, name_chunks);
#undef NAME_CHUNK_SZ
}
/* /*
* Allocate a temporary buffer for loading playlists * Allocate a temporary buffer for loading playlists
*/ */
@ -2021,6 +1996,8 @@ static int move_callback(int handle, void* current, void* new)
struct playlist_info* playlist = &current_playlist; struct playlist_info* playlist = &current_playlist;
if (current == playlist->indices) if (current == playlist->indices)
playlist->indices = new; playlist->indices = new;
else if (current == playlist->buffer)
playlist->buffer = new;
#ifdef HAVE_DIRCACHE #ifdef HAVE_DIRCACHE
else if (current == playlist->dcfrefs) else if (current == playlist->dcfrefs)
playlist->dcfrefs = new; playlist->dcfrefs = new;
@ -2059,6 +2036,13 @@ void playlist_init(void)
playlist->max_playlist_size * sizeof(*playlist->indices), &ops); playlist->max_playlist_size * sizeof(*playlist->indices), &ops);
playlist->indices = core_get_data(handle); playlist->indices = core_get_data(handle);
playlist->buffer_size =
AVERAGE_FILENAME_LENGTH * global_settings.max_files_in_dir;
handle = core_alloc_ex("playlist buf",
playlist->buffer_size, &ops);
playlist->buffer = core_get_data(handle);
playlist->buffer_handle = handle;
initalize_new_playlist(playlist, true); initalize_new_playlist(playlist, true);
@ -2095,21 +2079,15 @@ void playlist_shutdown(void)
*/ */
int playlist_add(const char *filename) int playlist_add(const char *filename)
{ {
size_t indice = CHUNK_ALLOC_INVALID;
struct playlist_info* playlist = &current_playlist; struct playlist_info* playlist = &current_playlist;
int len = strlen(filename); int len = strlen(filename);
if (!chunk_alloc_is_initialized(&playlist->name_chunk_buffer)) if(len+1 > playlist->buffer_size - playlist->buffer_end_pos)
alloc_namebuffer();
if (chunk_alloc_is_initialized(&playlist->name_chunk_buffer))
indice = chunk_alloc(&playlist->name_chunk_buffer, len + 1);
if(indice == CHUNK_ALLOC_INVALID)
{ {
notify_buffer_full(); notify_buffer_full();
return -2; return -2;
} }
if(playlist->amount >= playlist->max_playlist_size) if(playlist->amount >= playlist->max_playlist_size)
{ {
notify_buffer_full(); notify_buffer_full();
@ -2118,18 +2096,16 @@ int playlist_add(const char *filename)
playlist_mutex_lock(&(playlist->mutex)); playlist_mutex_lock(&(playlist->mutex));
playlist->indices[playlist->amount] = indice; playlist->indices[playlist->amount] = playlist->buffer_end_pos;
#ifdef HAVE_DIRCACHE #ifdef HAVE_DIRCACHE
dc_copy_filerefs(&playlist->dcfrefs[playlist->amount], NULL, 1); dc_copy_filerefs(&playlist->dcfrefs[playlist->amount], NULL, 1);
#endif #endif
playlist->amount++; playlist->amount++;
char *namebuf = (char*)chunk_get_data(&playlist->name_chunk_buffer, indice); strcpy((char*)&playlist->buffer[playlist->buffer_end_pos], filename);
strcpy(namebuf, filename); playlist->buffer_end_pos += len;
namebuf += len; playlist->buffer[playlist->buffer_end_pos++] = '\0';
namebuf[0] = '\0';
chunk_put_data(&playlist->name_chunk_buffer, indice);
playlist_mutex_unlock(&(playlist->mutex)); playlist_mutex_unlock(&(playlist->mutex));
@ -2204,7 +2180,9 @@ int playlist_create_ex(struct playlist_info* playlist,
#endif #endif
} }
chunk_alloc_free(&playlist->name_chunk_buffer); playlist->buffer_size = 0;
playlist->buffer_handle = -1;
playlist->buffer = NULL;
} }
new_playlist_unlocked(playlist, dir, file); new_playlist_unlocked(playlist, dir, file);
@ -3684,7 +3662,9 @@ int playlist_save(struct playlist_info* playlist, char *filename,
if (strlcat(path, "_temp", sizeof(path)) >= sizeof (path)) if (strlcat(path, "_temp", sizeof(path)) >= sizeof (path))
return -1; return -1;
struct chunk_alloc_header old_name_chunk_buffer = playlist->name_chunk_buffer; /* can ignore volatile here, because core_get_data() is called later */
char* old_buffer = (char*)playlist->buffer;
size_t old_buffer_size = playlist->buffer_size;
if (is_m3u8_name(path)) if (is_m3u8_name(path))
{ {
@ -3819,7 +3799,11 @@ int playlist_save(struct playlist_info* playlist, char *filename,
cpu_boost(false); cpu_boost(false);
reset_old_buffer: reset_old_buffer:
playlist->name_chunk_buffer = old_name_chunk_buffer; if (playlist->buffer_handle > 0)
old_buffer = core_get_data(playlist->buffer_handle);
playlist->buffer = old_buffer;
playlist->buffer_size = old_buffer_size;
return result; return result;
} }

View file

@ -28,7 +28,6 @@
#include "kernel.h" #include "kernel.h"
#include "metadata.h" #include "metadata.h"
#include "rbpaths.h" #include "rbpaths.h"
#include "chunk_alloc.h"
#define PLAYLIST_ATTR_QUEUED 0x01 #define PLAYLIST_ATTR_QUEUED 0x01
#define PLAYLIST_ATTR_INSERTED 0x02 #define PLAYLIST_ATTR_INSERTED 0x02
@ -85,10 +84,10 @@ struct playlist_info
global_settings.max_files_in_playlist */ global_settings.max_files_in_playlist */
int num_inserted_tracks; /* number of tracks inserted */ int num_inserted_tracks; /* number of tracks inserted */
volatile unsigned long *indices; /* array of indices */ volatile unsigned long *indices; /* array of indices */
int buffer_handle; /* handle to the below buffer (-1 if non-buflib) */
struct chunk_alloc_header name_chunk_buffer; /* chunk buffer for volatile char *buffer;/* buffer for in-ram playlists */
in-ram playlist */ int buffer_size; /* size of buffer */
int buffer_end_pos; /* last position where buffer was written */
int index; /* index of current playing track */ int index; /* index of current playing track */
int first_index; /* index of first song in playlist */ int first_index; /* index of first song in playlist */
int amount; /* number of tracks in the index */ int amount; /* number of tracks in the index */