# HG changeset patch # User Dan # Date 1218856950 14400 # Node ID 86140ed9087d5339400682c866aa3c9b59a8b68c # Parent 20a36fe254c968a6e9a5921b5da8326790fa16c9 Experimental: upon change to playlist, send SIGUSR1 to parent process and branch out to all children to force a playlist refresh diff -r 20a36fe254c9 -r 86140ed9087d functions.php --- a/functions.php Tue Aug 05 13:17:57 2008 -0400 +++ b/functions.php Fri Aug 15 23:22:30 2008 -0400 @@ -134,6 +134,12 @@ ); $playlist[] = $item; } + // if we're a child process, signal the parent to update + if ( defined('HTTPD_WS_CHILD') ) + { + global $httpd; + posix_kill($httpd->parent_pid, SIGUSR1); + } } /** diff -r 20a36fe254c9 -r 86140ed9087d greyhound.php --- a/greyhound.php Tue Aug 05 13:17:57 2008 -0400 +++ b/greyhound.php Fri Aug 15 23:22:30 2008 -0400 @@ -23,6 +23,7 @@ // trap SIGTERM pcntl_signal(SIGTERM, 'sigterm'); pcntl_signal(SIGINT, 'sigterm'); + pcntl_signal(SIGUSR1, 'handle_refresh_signal'); } // @@ -154,3 +155,23 @@ { burnout("Exception caught while running webserver:\n$e"); } + +function handle_refresh_signal() +{ + global $httpd; + if ( !is_object($httpd) ) + // we're not serving yet. + return false; + + // we've got an httpd instance; rebuild the playlist + rebuild_playlist(); + + // if this is the parent, also ask the children to rebuild. + if ( !defined('HTTPD_WS_CHILD') ) + { + foreach ( $httpd->child_list as $pid ) + { + posix_kill($pid, SIGUSR1); + } + } +} diff -r 20a36fe254c9 -r 86140ed9087d webserver.php --- a/webserver.php Tue Aug 05 13:17:57 2008 -0400 +++ b/webserver.php Fri Aug 15 23:22:30 2008 -0400 @@ -160,6 +160,20 @@ var $socket_initted = false; /** + * The list of child processes spawned by this server. + * @var array + */ + + var $child_list = array(); + + /** + * The parent process's PID + * @var int + */ + + var $parent_pid = 0; + + /** * Constructor. * @param string IPv4 address to bind to * @param int Port number @@ -254,6 +268,7 @@ $this->bind_address = $address; $this->server_string = "PhpHttpd/" . HTTPD_VERSION . " PHP/" . PHP_VERSION . "\r\n"; + $this->parent_pid = getmypid(); // create a UUID $uuid_base = md5(microtime() . ( function_exists('mt_rand') ? mt_rand() : rand() )); @@ -337,6 +352,7 @@ { // we are the parent, continue listening socket_close($remote); + $this->child_list[] = $pid; continue; } else @@ -357,11 +373,7 @@ $client_headers = ''; if ( defined('HTTPD_WS_CHILD') ) { - if ( !@socket_set_timeout($remote, HTTPD_KEEP_ALIVE_TIMEOUT) ) - { - status('stream_set_timeout() on $remote failed.'); - var_dump($remote); - } + @socket_set_timeout($remote, HTTPD_KEEP_ALIVE_TIMEOUT); } if ( $line = @socket_read($remote, 1024, PHP_NORMAL_READ) ) {