1. 29 Aug, 2008 20 commits
    • 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
    • Max Kellermann's avatar
      tag: renamed functions, no CamelCase · 91502cd7
      Max Kellermann authored
      91502cd7
    • Max Kellermann's avatar
      tag: renamed MpdTag and MpdTagItem to struct tag, struct mpd_tag_item · d0556dc9
      Max Kellermann authored
      Getting rid of CamelCase; not having typedefs also allows us to
      forward-declare the structures.
      d0556dc9
    • Max Kellermann's avatar
      added xfree() which takes a const pointer · f42de62a
      Max Kellermann authored
      Unfortunately, the C standard postulates that the argument to free()
      must be non-const.  This does not makes sense, and virtually prevents
      every pointer which must be freed at some time to be non-const.  Use
      the deconst hack (sorry for that) to allow us to free constant
      pointers.
      f42de62a
    • Max Kellermann's avatar
      export the function client_is_expired() · 8811c0e0
      Max Kellermann authored
      Instead of passing the pointer to the "expired" flag to
      processListOfCommands(), this function should use the client API to
      check this flag.  We can now remove the "global_expired" hack
      introduced recently.
      8811c0e0
    • Max Kellermann's avatar
      client: pass the client struct to processCommand() · 8b1b82b3
      Max Kellermann authored
      Start exporting the client struct as an opaque struct.  For now, pass
      it only to processCommand() and processListOfCommands(), and provide a
      function to extract the socket handle.  Later, we will propagate the
      pointer to all command implementations, and of course to
      client_print() etc.
      8b1b82b3
    • Max Kellermann's avatar
      client: reorder function declarations · 2c8aa8ef
      Max Kellermann authored
      Change the order of function declarations in client.h, to make it well
      arranged and readable.
      2c8aa8ef
    • Max Kellermann's avatar
      client: check "expired" after command execution · e743d71b
      Max Kellermann authored
      The old code tried to write a response to the client, without even
      checking if it was already closed.  Now that we have added more
      assertions, these may fail...  perform the "expired" check earlier.
      e743d71b
    • Max Kellermann's avatar
      client: added global "expired" flag · 76ecc302
      Max Kellermann authored
      Patch bdeb8e14 ("client: moved "expired" accesses into inline
      function") was created under the wrong assumption that
      processListOfCommands() could modify the expired flag, which is not
      the case.  Although "expired" is a non-const pointer,
      processListOfCommands() just reads it, using it as the break condition
      in a "while" loop.  I will address this issue with a better overall
      solution, but for now provide a pointer to a global "expired" flag.
      76ecc302
    • Max Kellermann's avatar
      pass constant pointers · 12bcba8b
      Max Kellermann authored
      And again, convert arguments to const.
      12bcba8b
    • Max Kellermann's avatar
      client: removed superfluous assertion · d8a8fa63
      Max Kellermann authored
      client_defer_output() was modified so that it can create the
      deferred_send list.  With this patch, the assertion on
      "deferred_send!=NULL" has become invalid.  Remove it.
      d8a8fa63
  2. 28 Aug, 2008 20 commits