OSDN Git Service

fix: recorder.php:子プロセスを再帰的に停止させるよう変更
authorepgrec@park.mda.or.jp <yoneda@recorder.localnet.mda.or.jp>
Sun, 18 Apr 2010 09:06:39 +0000 (18:06 +0900)
committerepgrec@park.mda.or.jp <yoneda@recorder.localnet.mda.or.jp>
Sun, 18 Apr 2010 09:06:39 +0000 (18:06 +0900)
Reservation.class.php
recorder.php
storeProgram.inc.php

index 3150dd6..bdc6783 100755 (executable)
@@ -238,7 +238,10 @@ class Reservation {
                        $filename = mb_str_replace("%DURATION%","".$duration, $filename );
                        
                        // あると面倒くさそうな文字を全部_に
-                       $filename = preg_replace("/[ \.\/\*:<>\?\\|()\'\"&]/u","_", trim($filename) );
+//                     $filename = preg_replace("/[ \.\/\*:<>\?\\|()\'\"&]/u","_", trim($filename) );
+                       
+                       // preg_replaceがUTF-8に対応できない環境があるようなのでmb_ereg_replaceに戻す
+                       $filename = mb_ereg_replace("[ \./\*:<>\?\\|()\'\"&]","_", trim($filename) );
                        
                        // 文字コード変換
                        if( defined("FILESYSTEM_ENCODING") ) {
index 53b0818..1368faf 100755 (executable)
@@ -56,14 +56,11 @@ function epgrec_exec( $cmd ) {
        return false;
 }
 
-// 指定したプロセスハンドルが生成した子プロセスのpidリストを返す
+// 指定したプロセスIDが生成した子プロセスのpidリストを返す
 // こういうやり方しかないのか?
 //
-function epgrec_childproc( $p )
+function epgrec_childproc( $ppid )
 {
-       $st = proc_get_status( $p );
-       $ppid = $st['pid'];
-       
        // ps を実行する
        $d = array(
                        0 => array( 'file','/dev/null','r' ),
@@ -88,6 +85,12 @@ function epgrec_childproc( $p )
        fclose( $pipes[1] );
        proc_close( $ps );
        
+       foreach( $cpids as $p ) {
+               $ccpids = epgrec_childproc( $p );
+               foreach( $ccpids as $ccpid ) {
+                       array_push( $cpids, $ccpid );
+               }
+       }
        return $cpids;
 }
 
@@ -100,8 +103,8 @@ function epgrec_termproc( $p )
                system( "ps ax >>".$logfile );
                system( "echo ------- >>".$logfile );
        }
-       
-       $cpids = epgrec_childproc( $p );
+       $status = proc_get_status( $p );
+       $cpids = epgrec_childproc( $status['pid'] );
        
        if( DEBUG ) {
                 global $logfile;
@@ -112,12 +115,13 @@ function epgrec_termproc( $p )
                system( "echo ------- >>".$logfile );
        }
        
+       // 親から止める
        @proc_terminate( $p );
-       sleep(1);
+       usleep(500*1000);
        @proc_terminate( $p );  // 2度送る
        
        foreach( $cpids as $cpid ) {
-               $ret = posix_kill( $cpid, SIGTERM );    // sigterm
+               $ret = posix_kill( $cpid, SIGTERM );            // sigterm
                usleep(100*1000);
                if( ! $ret ) posix_kill( $cpid, SIGKILL );      // sigkill
        }
@@ -128,10 +132,12 @@ function epgrec_termproc( $p )
                system( "echo ------- >>".$logfile );
        }
        
+       /* プロセスがしばらく居残る場合がある
        foreach( $cpids as $cpid ) {
                $ret = posix_kill( $cpid, SIGTERM );    // sigterm
-               if( $ret ) return false;        // 恐らくプロセスが存在するのでエラー
+               if( $ret ) return false;                                // 恐らくプロセスが存在するのでエラー
        }
+       */
        return true;    // 保証できない
 }
 
@@ -226,7 +232,6 @@ try{
        if( time() < $endtime ) {
                $rrec->endtime = toDatetime( time() );
        }
-       
        // 完了フラグを立てておく
        $rrec->complete = '1';
        
index a209c16..ff820ed 100755 (executable)
@@ -191,7 +191,8 @@ function storeProgram( $type, $xmlfile ) {
                                
                                try {
                                        $reserve = new DBRecord( RESERVE_TBL, "program_id", $rec->id );
-                                       if( $reserve->dirty == 0 ) {
+                                       // dirtyが立っておらず現在より後の録画予約であるなら
+                                       if( ($reserve->dirty == 0) && (toTimestamp($reserve->starttime) > time()) ) {
                                                $reserve->title = $title;
                                                $reserve->description = $desc;
                                                reclog( "getepg:: 予約ID".$reserve->id."のEPG情報が更新された" );