Commit Graph

2157 Commits

Author SHA1 Message Date
Max Kellermann
92b757674e assert value!=NULL in fix_utf8()
We must never pass value==NULL to fix_utf().  Replace the run-time
check with an assertion.
2008-08-29 09:38:56 +02:00
Max Kellermann
f99fe80811 tag: converted macro fixUtf8() to an inline function
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.
2008-08-29 09:38:54 +02:00
Max Kellermann
c855415c73 tag: added a pool for tag items
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 f34f694: 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.
2008-08-29 09:38:37 +02:00
Max Kellermann
e5a7879892 tag: converted tag_item.value to a char array
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.
2008-08-29 09:38:33 +02:00
Max Kellermann
b731bbe93a removed tree.c
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.
2008-08-29 09:38:31 +02:00
Max Kellermann
ad0e09b2db tag: converted MpdTag.items to a pointer list
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.
2008-08-29 09:38:29 +02:00
Max Kellermann
6f72fe3ecf tag: moved code to tag_id3.c
The ID3 code uses only the public tag API, but is otherwise
unrelated.  Move it to a separate source file.
2008-08-29 09:38:27 +02:00
Max Kellermann
055f4a41c5 wavpack: tag_new() cannot fail
Since tag_new() uses xmalloc(), it cannot fail - if we're really out
of memory, the process will abort.
2008-08-29 09:38:25 +02:00
Max Kellermann
5e1feb8fa3 tag: converted tag_add_item() to an inline function 2008-08-29 09:38:24 +02:00
Max Kellermann
91502cd71e tag: renamed functions, no CamelCase 2008-08-29 09:38:21 +02:00
Max Kellermann
d0556dc983 tag: renamed MpdTag and MpdTagItem to struct tag, struct mpd_tag_item
Getting rid of CamelCase; not having typedefs also allows us to
forward-declare the structures.
2008-08-29 09:38:11 +02:00
Max Kellermann
f42de62aa2 added xfree() which takes a const pointer
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.
2008-08-29 09:38:08 +02:00
Max Kellermann
8811c0e059 export the function client_is_expired()
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.
2008-08-29 09:37:11 +02:00
Max Kellermann
8b1b82b363 client: pass the client struct to processCommand()
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.
2008-08-29 09:36:42 +02:00
Max Kellermann
2c8aa8efde client: reorder function declarations
Change the order of function declarations in client.h, to make it well
arranged and readable.
2008-08-29 09:36:40 +02:00
Max Kellermann
e743d71b89 client: check "expired" after command execution
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.
2008-08-29 09:36:40 +02:00
Max Kellermann
76ecc30243 client: added global "expired" flag
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.
2008-08-29 09:36:38 +02:00
Max Kellermann
12bcba8b89 pass constant pointers
And again, convert arguments to const.
2008-08-29 09:01:53 +02:00
Max Kellermann
d8a8fa63b4 client: removed superfluous assertion
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.
2008-08-29 06:17:54 +02:00
Eric Wong
7858081eda log.c: thread-safety for warning log
I'm really no fan of the warning log, it's too complex
for how little it gets used; but fixing it is another
problem.
2008-08-28 20:40:26 +02:00
Eric Wong
5c26e73226 Point the contact email to musicpd-dev-team
Warren hasn't been active in development in a while and probably
doesn't have much time to answer user questions.  So point the
mailing contact to the public mailing lists where any developer
can see and answer.
2008-08-28 20:40:17 +02:00
Max Kellermann
08c9de7b68 client: more assertions 2008-08-28 20:23:22 +02:00
Max Kellermann
4e17ab11a8 client: replace "expired" flag with fd==-1
Why waste 4 bytes for a flag which we can hide in another variable.
2008-08-28 20:20:10 +02:00
Max Kellermann
bdeb8e148e client: moved "expired" accesses into inline function
Hiding this flag allows us later to remove it easily.
2008-08-28 20:20:10 +02:00
Max Kellermann
e0fd63ecf8 moved code to sockaddr_to_tmp_string()
Unclutter the client_new() constructor by moving unrelated complex
code into a separate function.
2008-08-28 20:20:10 +02:00
Max Kellermann
34735fab66 client: no while loop in client_manager_io()
The last patch removed the "continue" directive, and now the while
loop is without function.  Remove it.  Also make client_manager_io()
return 0.
2008-08-28 20:20:10 +02:00
Max Kellermann
f6a7dd2b45 client: select() errors are fatal
Previously, when select() failed, we assumed that there was an invalid
file descriptor in one of the client structs.  Thus we tried select()
one by one.  This is bogus, because we should never have invalid file
descriptors.  Remove it, and make select() errors fatal.
2008-08-28 20:20:10 +02:00
Max Kellermann
32bb19d03f client: use client_defer_output() in client_write()
Eliminate duplicated code, call client_defer_output() which we
splitted from client_write_output() earlier.
2008-08-28 20:20:04 +02:00
Max Kellermann
709b795e4a moved code to client_write()
Move the second part of client_write_output() into a separate
function.
2008-08-28 20:03:58 +02:00
Max Kellermann
4516bd117c client: client_defer_output() can create the first defer buffer
client_defer_output() was designed to add new buffers to an existing
deferred_send buffer.  Tweak it and allow it to create a new buffer
list.
2008-08-28 20:03:56 +02:00
Max Kellermann
20f06162dd client: return early on error in client_defer_output()
Exit the function when an error occurs, and move the rest of the
following code one indent level left.
2008-08-28 20:03:54 +02:00
Max Kellermann
7774cd2774 client: moved code to client_defer_output()
Split the large function client_write_output() into two parts; this is
the first code moving patch.
2008-08-28 20:03:51 +02:00
Max Kellermann
4448b17e2e don't free client resources except in client_close()
All of the client's resources are freed in client_close().  It is
enough to set the "expired" flag, no need to duplicate lots of
destruction code again and again.
2008-08-28 20:03:49 +02:00
Max Kellermann
61443c13e6 client: allocate clients dynamically
Due to the large buffers in the client struct, the static client array
eats several megabytes of RAM with a maximum of only 10 clients.  Stop
this waste and allocate each client struct from the heap.
2008-08-28 20:03:48 +02:00
Max Kellermann
a091c148e6 client: added function client_by_fd()
The code becomes less complex and more readable when we move this
linear search into a separate mini function.
2008-08-28 20:03:06 +02:00
Max Kellermann
d15e1e09a2 client: return early in client_new()
This saves one level of indent.
2008-08-28 20:03:03 +02:00
Max Kellermann
c0197c58ba client: renamed all public functions
Functions which operate on the whole client list are prefixed with
"client_manager_", and functions which handle just one client just get
"client_".
2008-08-28 20:03:02 +02:00
Max Kellermann
6d18e00099 client: renamed internal functions and variables
Rename all static functions, variables and macros which have
"interface" in their name to something nicer prefixed with "client_".
2008-08-28 20:02:59 +02:00
Max Kellermann
fe03cb9549 client: renamed Interface to struct client
Second patch: rename the internal struct name.  We will eventually
export this type as an opaque forward-declared struct later, so we
can pass a struct pointer instead of a file descriptor, which would
save us an expensive linear lookup.
2008-08-28 20:02:58 +02:00
Max Kellermann
deb29e0884 renamed interface.c to client.c
I don't believe "interface" is a good name for something like
"connection by a client to MPD", let's call it "client".  This is the
first patch in the series which changes the name, beginning with the
file name.
2008-08-28 20:02:43 +02:00
Max Kellermann
9340e291f0 imported list.h from the Linux kernel sources
linux/list.h is a nice doubly linked list library - it is lightweight
and powerful at the same time.  It will be useful later, when we begin
to allocate client structures dynamically.  Import it, and strip out
all the stuff which we are not going to use.
2008-08-28 20:02:20 +02:00
Max Kellermann
bc1c8835c6 const pointers
The usual bunch of pointer arguments which should be const.
2008-08-28 20:02:17 +02:00
Max Kellermann
801c71ed1c unsigned integers and size_t
Use "unsigned int" whenever negative values are not meaningful.  Use
size_t whenever we are going to describe buffer sizes.
2008-08-28 20:02:16 +02:00
Max Kellermann
1560a70b01 include cleanup
Only include headers which are really needed.
2008-08-28 20:01:08 +02:00
Max Kellermann
b7861868cf protect locate.h from double inclusion 2008-08-28 20:01:08 +02:00
Max Kellermann
f34f694ec3 moved player_command_finished() to player_thread.c 2008-08-26 08:45:15 +02:00
Max Kellermann
e2c8b960de moved code to pc_init(), dc_init() 2008-08-26 08:45:14 +02:00
Max Kellermann
5e51fa020d renamed player.c to player_control.c
Give player.c a better name, meaning that the code is used to control
the player thread.
2008-08-26 08:44:38 +02:00
Max Kellermann
b616dff77d no commandError() in playerSeek()
We should avoid having protocol specific code in player.c.  Just
return success or failure, and let the caller send the error code to
the MPD client.
2008-08-26 08:44:34 +02:00
Max Kellermann
bf4af19f54 don't initialize "i" if we overwrite it anyway 2008-08-26 08:44:33 +02:00