developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Ticket #1237: ticket_1237_2.diff

File ticket_1237_2.diff, 1.8 KB (added by bricet, 10 years ago)
  • lib/jelix/utils/jCache.class.php

    diff -r 37aa39f7ca6c lib/jelix/utils/jCache.class.php
    a b  
    163163        if($drv->enabled){
    164164
    165165            $key = md5(serialize($fn).serialize($fnargs));
     166            $lockKey = $key.'_callLock';
    166167
    167168            if (!($data = $drv->get($key))) {
     169                //wait lock to be realesed (if a lock exists)
     170                $lockTests=0;
     171                while( $drv->get($lockKey) ) {
     172                    usleep(100000);
     173                    if( ($lockTests++)%10 == 0 ) { //every second, first shot is on first call
     174                        //automatic cleaning cache
     175                        if($drv->automatic_cleaning_factor > 0 &&  rand(1, $drv->automatic_cleaning_factor) == 1){
     176                            $drv->garbage();
     177                        }
     178                    }
     179                }
     180                if( $lockTests > 0 ) {
     181                    //a lock has been met. So read again jCache value now that it has been released
     182                    $data = $drv->get($key);
     183                }
     184            }
     185
     186            if ( !$data ) {
     187                $lockTtl = get_cfg_var('max_execution_time');
     188                if( !$lockTtl ) {
     189                    $lockTtl = $drv->ttl;
     190                }
     191                $lockTtl = max( 30, min( $lockTtl, $drv->ttl ) ); //prevent lock ttl from being more than drv's ttl and from being eternal
     192                $drv->set($lockKey,true,$lockTtl);
    168193
    169194                $data = self::_doFunctionCall($fn,$fnargs);
    170195
     
    184209                        $drv->set($key,$data,$ttl);
    185210                    }
    186211                }
     212                $drv->delete($lockKey);
    187213            }
    188214
    189215            return $data;