song: use flex arrays to store song->url

Reduce the number of allocations we make, so there's less
pressure on the allocator and less overhead to keep track
of the allocations in.
This commit is contained in:
Eric Wong 2008-10-06 18:46:52 +02:00 committed by Max Kellermann
parent 43761441c9
commit 267b2cd6e6
4 changed files with 25 additions and 17 deletions

View File

@ -298,7 +298,7 @@ removeDeletedFromDirectory(char *path_max_tmp, Directory * directory)
for (i = sv->nr; --i >= 0; ) { /* cleaner deletes if we go backwards */
Song *song = sv->base[i];
if (!song || !song->url)
if (!song || !*song->url)
continue; /* does this happen?, perhaps assert() */
if (dirname)

View File

@ -28,6 +28,19 @@
#include "os_compat.h"
Song *
song_alloc(const char *url, enum song_type type, struct _Directory *parent)
{
size_t urllen = strlen(url);
Song *song = xmalloc(sizeof(Song) + urllen);
song->tag = NULL;
memcpy(song->url, url, urllen + 1);
song->type = type;
song->parentDir = parent;
return song;
}
Song *newSong(const char *url, enum song_type type, Directory * parentDir)
{
@ -38,11 +51,7 @@ Song *newSong(const char *url, enum song_type type, Directory * parentDir)
return NULL;
}
song = xmalloc(sizeof(*song));
song->tag = NULL;
song->url = xstrdup(url);
song->type = type;
song->parentDir = parentDir;
song = song_alloc(url, type, parentDir);
assert(type == SONG_TYPE_URL || parentDir);
@ -75,7 +84,6 @@ void freeSong(Song * song)
void freeJustSong(Song * song)
{
free(song->url);
if (song->tag)
tag_free(song->tag);
free(song);
@ -114,7 +122,7 @@ char *get_song_url(char *path_max_tmp, Song *song)
if (!song)
return NULL;
assert(song->url != NULL);
assert(*song->url);
if (!song->parentDir || !song->parentDir->path)
strcpy(path_max_tmp, song->url);

View File

@ -20,6 +20,7 @@
#define SONG_H
#include "os_compat.h"
#include "gcc.h"
#define SONG_BEGIN "songList begin"
#define SONG_END "songList end"
@ -35,12 +36,15 @@ enum song_type {
struct client;
typedef struct _Song {
char *url;
enum song_type type;
struct tag *tag;
struct _Directory *parentDir;
time_t mtime;
} Song;
char url[1];
} mpd_packed Song;
Song *
song_alloc(const char *url, enum song_type type, struct _Directory *parent);
Song *newSong(const char *url, enum song_type type,
struct _Directory *parentDir);

View File

@ -111,18 +111,14 @@ void readSongInfoIntoList(FILE *fp, struct songvec *sv,
if (song)
insertSongIntoList(sv, song);
song = xmalloc(sizeof(*song));
song->url = xstrdup(buffer + strlen(SONG_KEY));
song->type = SONG_TYPE_FILE;
song->parentDir = parentDir;
song = song_alloc(buffer + strlen(SONG_KEY),
SONG_TYPE_FILE, parentDir);
} else if (*buffer == 0) {
/* ignore empty lines (starting with '\0') */
} else if (song == NULL) {
FATAL("Problems reading song info\n");
} else if (0 == strncmp(SONG_FILE, buffer, strlen(SONG_FILE))) {
/* we don't need this info anymore
song->url = xstrdup(&(buffer[strlen(SONG_FILE)]));
*/
/* we don't need this info anymore */
} else if (matchesAnMpdTagItemKey(buffer, &itemType)) {
if (!song->tag) {
song->tag = tag_new();