Merge "deferred: make DeferredUpdates::attemptUpdate() use callback owners for $fname...
[lhc/web/wiklou.git] / includes / cache / MessageCache.php
index a8bcfc6..93fdb16 100644 (file)
@@ -99,44 +99,20 @@ class MessageCache {
        protected $contLang;
 
        /**
-        * Singleton instance
-        *
-        * @var MessageCache $instance
+        * Track which languages have been loaded by load().
+        * @var array
         */
-       private static $instance;
+       private $loadedLanguages = [];
 
        /**
-        * Get the signleton instance of this class
+        * Get the singleton instance of this class
         *
+        * @deprecated in 1.34 inject an instance of this class instead of using global state
         * @since 1.18
         * @return MessageCache
         */
        public static function singleton() {
-               if ( self::$instance === null ) {
-                       global $wgUseDatabaseMessages, $wgMsgCacheExpiry, $wgUseLocalMessageCache;
-                       $services = MediaWikiServices::getInstance();
-                       self::$instance = new self(
-                               $services->getMainWANObjectCache(),
-                               wfGetMessageCacheStorage(),
-                               $wgUseLocalMessageCache
-                                       ? $services->getLocalServerObjectCache()
-                                       : new EmptyBagOStuff(),
-                               $wgUseDatabaseMessages,
-                               $wgMsgCacheExpiry,
-                               $services->getContentLanguage()
-                       );
-               }
-
-               return self::$instance;
-       }
-
-       /**
-        * Destroy the singleton instance
-        *
-        * @since 1.18
-        */
-       public static function destroyInstance() {
-               self::$instance = null;
+               return MediaWikiServices::getInstance()->getMessageCache();
        }
 
        /**
@@ -264,23 +240,12 @@ class MessageCache {
                }
 
                # Don't do double loading...
-               if ( $this->cache->has( $code ) && $mode != self::FOR_UPDATE ) {
+               if ( isset( $this->loadedLanguages[$code] ) && $mode != self::FOR_UPDATE ) {
                        return true;
                }
 
                $this->overridable = array_flip( Language::getMessageKeysFor( $code ) );
 
-               // T208897 array_flip can fail and return null
-               if ( is_null( $this->overridable ) ) {
-                       LoggerFactory::getInstance( 'MessageCache' )->error(
-                               __METHOD__ . ': $this->overridable is null',
-                               [
-                                       'message_keys' => Language::getMessageKeysFor( $code ),
-                                       'code' => $code
-                               ]
-                       );
-               }
-
                # 8 lines of code just to say (once) that message cache is disabled
                if ( $this->mDisable ) {
                        static $shownDisabled = false;
@@ -396,6 +361,9 @@ class MessageCache {
                        wfDebugLog( 'MessageCacheError', __METHOD__ . ": Failed to load $code\n" );
                        # This used to throw an exception, but that led to nasty side effects like
                        # the whole wiki being instantly down if the memcached server died
+               } else {
+                       # All good, just record the success
+                       $this->loadedLanguages[$code] = true;
                }
 
                if ( !$this->cache->has( $code ) ) { // sanity
@@ -1300,6 +1268,7 @@ class MessageCache {
                        $this->wanCache->touchCheckKey( $this->getCheckKey( $code ) );
                }
                $this->cache->clear();
+               $this->loadedLanguages = [];
        }
 
        /**