1. 07 Sep, 2008 18 commits
  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 17 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