1. 07 Sep, 2008 16 commits
    • Max Kellermann's avatar
      directory: printDirectoryInfo() does not call commandError() · 17b6491b
      Max Kellermann authored
      Move another ocurrence of error handling over to command.c.
      17b6491b
    • Max Kellermann's avatar
      directory: don't pass fd to traverseAllIn() · f320c9fa
      Max Kellermann authored
      This patch continues the work of the previous patch: don't pass a file
      descriptor at all to traverseAllIn().  Since this fd was only used to
      report "directory not found" errors, we can easily move that check to
      the caller.  This is a great relief, since it removes the dependency
      on a client connection from a lot of enumeration functions.
      f320c9fa
    • Max Kellermann's avatar
      directory: don't pass fd to traverseAllIn() callbacks · 528be8a0
      Max Kellermann authored
      Database traversal should be generic, and not bound to a client
      connection.  This is the first step: no file descriptor for the
      callback functions forEachSong() and forEachDir().  If a callback
      needs the file descriptor, it has to be passed in the void*data
      pointer somehow; some callbacks might need a new struct for passing
      more than one parameter.  This might look a bit cumbersome right now,
      but our goal is to have a clean API.
      528be8a0
    • Max Kellermann's avatar
      playlist: PlaylistInfo() does not call commandError() · d8ef33b7
      Max Kellermann authored
      Continuing the effort of removing protocol specific calls from the
      core libraries: let the command.c code call commandError() based on
      PlaylistInfo's return value.
      d8ef33b7
    • Max Kellermann's avatar
      playlist: don't pass "fd" to storedPlaylist.c functions · a8b225f9
      Max Kellermann authored
      Return an "enum playlist_result" value instead of calling
      commandError() in storedPlaylist.c.
      a8b225f9
    • Max Kellermann's avatar
      playlist: don't pass "fd" to playlist.c functions · 8d2830b3
      Max Kellermann authored
      The playlist library shouldn't talk to the client if possible.
      Introduce the "enum playlist_result" type which the caller
      (i.e. command.c) may use to generate an error message.
      8d2830b3
    • Max Kellermann's avatar
      playlist: showPlaylist() and shufflePlaylist() cannot fail · 20feb0cb
      Max Kellermann authored
      Make them both return void.
      20feb0cb
    • Max Kellermann's avatar
      playlist: moved "repeat" and "random" value checks to command.c · e1bf9667
      Max Kellermann authored
      Client's input values should be validated by the command
      implementation, and the core libraries shouldn't talk to the client
      directly if possible.  Thus, setPlaylistRepeatStatus() and
      setPlaylistRandomStatus() don't get the file descriptor, and cannot
      fail (return void).
      e1bf9667
    • Max Kellermann's avatar
      playlist: fix FILE* leak in appendSongToStoredPlaylistByPath() · d1df71eb
      Max Kellermann authored
      When an error occurs after the file has been opened, the function will
      never close the FILE object.
      d1df71eb
    • Max Kellermann's avatar
      playlist: replaced run-time check with assertion · 54c8e3da
      Max Kellermann authored
      The "fspath" argument of writeStoredPlaylistToPath() must never be
      NULL.  There should be an assertion on that, instead of a run-time
      check.
      54c8e3da
    • Max Kellermann's avatar
      playlist: added is_valid_playlist_name() · dc353eca
      Max Kellermann authored
      The function valid_playlist_name() checks the name, but it insists on
      reporting an eventual error to the client.  The new function
      is_valid_playlist_name() is more generic: it just returns a boolean,
      and does not care what the caller will use it for.  The old function
      valid_playlist_name() will be removed later.
      dc353eca
    • Max Kellermann's avatar
      tag: added buffered versions of the tag_print.c code · 59efed3e
      Max Kellermann authored
      Currently, when the tag cache is being serialized to hard disk, the
      stdio buffer is flushed before every song, because tag_print.c
      performs unbuffered writes on the raw file descriptor.  Unfortunately,
      the fdprintf() API allows buffered I/O only for a client connection by
      looking up the client pointer owning the file descriptor - for stdio,
      this is not possible.  To re-enable proper stdio buffering, we have to
      duplicate the tag_print.c code without fprintf() instead of our custom
      fdprintf() hack.  Add this duplicated code to tag_save.c.
      59efed3e
    • Max Kellermann's avatar
      song: moved code to song_print.c, song_save.c · 75aa8dad
      Max Kellermann authored
      Move everything which dumps song information (via tag_print.c) to a
      separate source file.  song_print.c gets code which writes song data
      to the client; song_save.c is responsible for serializing songs from
      the tag cache.
      75aa8dad
    • Max Kellermann's avatar
      tag: moved code to tag_print.c · 386c3031
      Max Kellermann authored
      Move everything which dumps a tag to a file descriptor to tag_print.c.
      This relaxes dependencies and splits the code into smaller parts.
      386c3031
    • Max Kellermann's avatar
      client: added client_printf() · f73319c0
      Max Kellermann authored
      Based on client_puts(), client_printf() is the successor of
      fdprintf().  As soon as all fdprintf() callers have been rewritten to
      use client_printf(), we can remove fdprintf().
      f73319c0
    • Max Kellermann's avatar
      client: added client_write() and client_puts() · 33aec0d6
      Max Kellermann authored
      client_write() writes a buffer to the client and buffers it if
      required.  client_puts() does the same for a C string.  The next patch
      will add more tools which will replace fdprintf() later.
      33aec0d6
  2. 06 Sep, 2008 5 commits
    • Max Kellermann's avatar
      include cleanup · a34e1d2b
      Max Kellermann authored
      As usual, include only headers which are really needed.
      a34e1d2b
    • Eric Wong's avatar
      tag: fix segfault on update · 092bdf3d
      Eric Wong authored
      clearMpdTag could be called on a tag that was still in a
      tag_begin_add transaction before tag_end_add is called.  This
      was causing free() to attempt to operate on bulk.items; which is
      un-free()-able.  Now instead we unmark the bulk.busy to avoid
      committing the tags to the heap only to be immediately freed.
      
      Additionally, we need to remember to call tag_end_add() when
      a song is updated before we NULL song->tag to avoid tripping
      an assertion the next time tag_begin_add() is called.
      092bdf3d
    • Max Kellermann's avatar
      client: don't check FD_ISSET(client->fd) on expired client · 6146d4f5
      Max Kellermann authored
      client->fd becomes -1 when the client expires.  Don't use FD_ISSET()
      with this expired client; doing so would cause a crash due to SIGBUS.
      6146d4f5
    • Max Kellermann's avatar
      client: removed assert(client->fd)>=0 · 77b16716
      Max Kellermann authored
      Since client->fd==-1 has become our "expired" flag, it may already be
      -1 when client_close() is called.  Don't assert that it is still
      non-negative, and call client_set_expired() instead.
      77b16716
    • Max Kellermann's avatar
      dbUtils, playlist, directory: pass constant pointers · 35c0b84f
      Max Kellermann authored
      The usual bunch of const pointer conversions.
      35c0b84f
  3. 29 Aug, 2008 19 commits
    • Max Kellermann's avatar
      tag: optimize tag_dup(), copy item references · d38d2bc3
      Max Kellermann authored
      Don't call tag_pool_get_item() for duplicating tags, just increase the
      item's reference counter instead.
      d38d2bc3
    • Max Kellermann's avatar
      oggflac: fix GCC warnings · d8ad109e
      Max Kellermann authored
      Fix lots of "unused parameter" warnings in the OggFLAC decoder
      plugin.  Not sure if anybody uses it anymore, since newer libflac
      obsoletes it.
      d8ad109e
    • Max Kellermann's avatar
      tag: fix the shout and oggflac plugins · 01f9684f
      Max Kellermann authored
      During the tag library refactoring, the shout plugin was disabled, and
      I forgot about adapting it to the new API.  Apply the same fixes to
      the oggflac decoder plugin.
      01f9684f
    • Max Kellermann's avatar
      const pointers · 37d77caa
      Max Kellermann authored
      Yet another patch which converts pointer arguments to "const".
      37d77caa
    • Max Kellermann's avatar
      tag: static directory name · 5bd55516
      Max Kellermann authored
      While parsing the tag cache, don't allocate the directory name from
      the heap, but copy it into a buffer on the stack.  This reduces heap
      fragmentation by 1%.
      5bd55516
    • Max Kellermann's avatar
      tag: try not to reallocate tag.items in every add() call · 1aa34573
      Max Kellermann authored
      If many tag_items are added at once while the tag cache is being
      loaded, manage these items in a static fixed list, instead of
      reallocating the list with every newly created item.  This reduces
      heap fragmentation.
      
      Massif results again:
      
       mk before:  total 12,837,632; useful 10,626,383; extra 2,211,249
       mk now:     total 12,736,720; useful 10,626,383; extra 2,110,337
      
      The "useful" value is the same since this patch only changes the way
      we allocate the same amount of memory, but heap fragmentation was
      reduced by 5%.
      1aa34573
    • Max Kellermann's avatar
      song: don't export newNullSong() · 03152206
      Max Kellermann authored
      The function newNullSong() is only used internally in song.c.
      03152206
    • Max Kellermann's avatar
      tag: try not to duplicate the input string · a208d654
      Max Kellermann authored
      Try to detect if the string needs Latin1-UTF8 conversion, or
      whitespace cleanup.  If not, we don't need to allocate temporary
      memory, leading to decreased heap fragmentation.
      a208d654
    • Max Kellermann's avatar
      tag: pass length to fix_utf8() · 9352fc9e
      Max Kellermann authored
      Same as the previous patch, prepare the function fix_utf8() this time.
      9352fc9e
    • Max Kellermann's avatar
      added "length" parameter to validUtf8String() · 43c389b9
      Max Kellermann authored
      At several places, we create temporary copies of non-null-terminated
      strings, just to use them in functions like validUtf8String().  We can
      save this temporary allocation and avoid heap fragmentation if we
      add a length parameter instead of expecting a null-terminated string.
      43c389b9
    • Max Kellermann's avatar
      assert value!=NULL in fix_utf8() · 92b75767
      Max Kellermann authored
      We must never pass value==NULL to fix_utf().  Replace the run-time
      check with an assertion.
      92b75767
    • Max Kellermann's avatar
      tag: converted macro fixUtf8() to an inline function · f99fe808
      Max Kellermann authored
      Since the inline function cannot modify its caller's variables (which
      is a good thing for code readability), the new string pointer is the
      return value.  The resulting binary should be the same as with the
      macro.
      f99fe808
    • Max Kellermann's avatar
      tag: added a pool for tag items · c855415c
      Max Kellermann authored
      The new source tag_pool.c manages a pool of reference counted tag_item
      objects.  This is used to merge tag items of the same type and value,
      saving lots of memory.  Formerly, only the value itself was pooled,
      wasting memory for all the pointers and tag_item structs.
      
      The following results were measured with massif.  Started MPD on
      amd64, typed "mpc", no song being played.  My music database contains
      35k tagged songs.  The results are what massif reports as "peak".
      
       0.13.2:     total 14,131,392; useful 11,408,972; extra 2,722,420
       eric:       total 18,370,696; useful 15,648,182; extra 2,722,514
       mk f34f694e: total 15,833,952; useful 13,111,470; extra 2,722,482
       mk now:     total 12,837,632; useful 10,626,383; extra 2,211,249
      
      This patch set saves 20% memory, and does a good job in reducing heap
      fragmentation.
      c855415c
    • Max Kellermann's avatar
      tag: converted tag_item.value to a char array · e5a78798
      Max Kellermann authored
      The value is stored in the same memory allocation as the tag_item
      struct; this saves memory because we do not store the value pointer
      anymore.  Also remove the getTagItemString()/removeTagItemString()
      dummies.
      e5a78798
    • Max Kellermann's avatar
      removed tree.c · b731bbe9
      Max Kellermann authored
      This patch makes MPD consume much more memory because string pooling
      is disabled, but it prepares the next bunch of patches.  Replace the
      code in tagTracker.c with naive algorithms without the tree code.  For
      now, this should do; later we should find better algorithms,
      especially for getNumberOfTagItems(), which has become wasteful with
      temporary memory.
      b731bbe9
    • Max Kellermann's avatar
      tag: converted MpdTag.items to a pointer list · ad0e09b2
      Max Kellermann authored
      This prepares the following patches, which aim to reduce MPD's memory
      usage: we plan to share tag_item instances, instead of just their
      values.
      ad0e09b2
    • Max Kellermann's avatar
      tag: moved code to tag_id3.c · 6f72fe3e
      Max Kellermann authored
      The ID3 code uses only the public tag API, but is otherwise
      unrelated.  Move it to a separate source file.
      6f72fe3e
    • Max Kellermann's avatar
      wavpack: tag_new() cannot fail · 055f4a41
      Max Kellermann authored
      Since tag_new() uses xmalloc(), it cannot fail - if we're really out
      of memory, the process will abort.
      055f4a41
    • Max Kellermann's avatar
      5e1feb8f