aboutsummaryrefslogtreecommitdiffstats
path: root/src/notify.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* notify: loop while no signal is pendingMax Kellermann2008-10-081-2/+1
| | | | | | pthread_cond_wait() may wake up spuriously. To prevent superfluous state checks, loop until the "pending" flag becomes true. Removed the dangerous assertion.
* notify: protect notify->pending with the mutexMax Kellermann2008-09-261-16/+4
| | | | | | | | | | There was a known deadlocking bug in the notify library: when the other thread set notify->pending after the according check in notify_wait(), the latter thread was deadlocked. Resolve this by synchronizing all accesses to notify->pending with the notify object's mutex. Since notify_signal_sync() was never used, we can remove it. As a consequence, we don't need notify_enter() and notify_leave() anymore; eliminate them, too.
* notify: added notify_deinit()Max Kellermann2008-09-241-0/+6
| | | | Destroy the mutex when it is not used anymore.
* notify: make notify_init() failures fatalMax Kellermann2008-09-241-8/+5
| | | | | When a mutex cannot be created, there must be something very wrong. Induce panic and abort MPD in this case.
* notify: declare "struct notify"Max Kellermann2008-09-241-6/+6
| | | | | "struct notify" is the same as the "Notify" typedef. It can be forward-declared and has a lower case name.
* notify: don't use camelCase in notify.[ch]Max Kellerman2008-06-011-7/+7
| | | git-svn-id: https://svn.musicpd.org/mpd/trunk@7367 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* use the pthread API in notify.cMax Kellermann2008-04-121-17/+37
| | | | | | | This patch rewrites notify.c to use the pthread API, namely pthread_mutex and pthread_cond. This is a lot cheaper and easier than the pipe() hack. git-svn-id: https://svn.musicpd.org/mpd/trunk@7280 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* rename the notify.c methodsMax Kellermann2008-04-121-3/+3
| | | | | Use "notify" as a prefix rather than suffix. git-svn-id: https://svn.musicpd.org/mpd/trunk@7279 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* notify: initialize variable to keep valgrind from bitchingEric Wong2008-03-271-1/+1
| | | | | | We don't really care what that variable is, so it might as well be uninitialized, but valgrind does... git-svn-id: https://svn.musicpd.org/mpd/trunk@7220 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* notify: more cleanups, add error checking for pipe errorsEric Wong2008-03-261-7/+8
| | | | | | | | | | Don't bother initializing the junk buffer, we really don't care. The array was also unnecessary and ugly. Also, avoid returning the byte count we read/wrote since it unnecessarily exposes internal details of the implementation to the callers. git-svn-id: https://svn.musicpd.org/mpd/trunk@7219 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* notify: cleanupsEric Wong2008-03-261-32/+9
| | | | | | | | * move set_nonblock{,ing}() into utils.c since we use it elsewhere, too * add proper error checking to set_nonblocking() * use os_compat.h instead of individually #includ-ing system headers git-svn-id: https://svn.musicpd.org/mpd/trunk@7217 09075e82-0dd4-0310-85a5-a0d7c8717e4f
* notify the decoder instead of polling 100hzMax Kellermann2008-03-261-0/+70
When the decoder process is faster than the player process, all decodedd buffers are full at some point in time. The decoder has to wait for buffers to become free (finished playing). It used to do this by polling the buffer status 100 times a second. This generates a lot of unnecessary CPU wakeups. This patch adds a way for the player process to notify the decoder process that it may continue its work. We could use pthread_cond for that, unfortunately inter-process mutexes/conds are not supported by some kernels (Linux), so we cannot use this light-weight method until mpd moves to using threads instead of processes. The other method would be semaphores, which historically are global resources with a unique name; this historic API is cumbersome, and I wanted to avoid it. I came up with a quite naive solution for now: I create an anonymous pipe with pipe(), and the decoder process reads on that pipe. Until the player process sends data on it as a signal, the decoder process blocks. This can be optimized in a number of ways: - if the decoder process is still working (instead of waiting for buffers), we could save the write() system call, since there is nobody waiting for the notification. [ew: I tried this using a counter in shared memory, didn't help] - the pipe buffer will be full at some point, when the decoder thread is too slow. For this reason, the writer side of the pipe is non-blocking, and mpd can ignore the resulting EWOULDBLOCK. - since we have shared memory, we could check whether somebody is actually waiting without a context switch, and we could just not write the notification byte. [ew: tried same method/result as first point above] - if there is already a notification in the pipe, we could also not write another one. [ew: tried same method/result as first/third points above] - the decoder will only consume 64 bytes at a time. If the pipe buffer is full, this will result in a lot of read() invocations. This does not hurt badly, but on a heavily loaded system, this might add a little bit more load. The preceding optimizations however are able eliminate the this. - finally, we should use another method for inter process notifications - maybe kill() or just make mpd use threads, finally. In spite of all these possibilities to optimize this code further, this pipe notification trick is faster than the 100 Hz poll. On my machine, it reduced the number of wakeups to less than 30%. git-svn-id: https://svn.musicpd.org/mpd/trunk@7215 09075e82-0dd4-0310-85a5-a0d7c8717e4f