From 267b2cd6e668fb380a53b1377143a5cc7ce949ea Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 6 Oct 2008 18:46:52 +0200 Subject: 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. --- src/directory.c | 2 +- src/song.c | 22 +++++++++++++++------- src/song.h | 8 ++++++-- src/song_save.c | 10 +++------- 4 files changed, 25 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/directory.c b/src/directory.c index cb3eb451a..0ce533966 100644 --- a/src/directory.c +++ b/src/directory.c @@ -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) diff --git a/src/song.c b/src/song.c index 75dd0257f..3081dec4e 100644 --- a/src/song.c +++ b/src/song.c @@ -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); diff --git a/src/song.h b/src/song.h index f7466e24c..e2e74928b 100644 --- a/src/song.h +++ b/src/song.h @@ -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); diff --git a/src/song_save.c b/src/song_save.c index 3cb17f97b..1daf2fe32 100644 --- a/src/song_save.c +++ b/src/song_save.c @@ -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(); -- cgit v1.2.3