+ } );
+
+ $thumb = false;
+ $errorHtml = false;
+
+ // guard thumbnail rendering with PoolCounter to avoid stampedes
+ // expensive files use a separate PoolCounter config so it is possible to set up a global limit on them
+ if ( $file->isExpensiveToThumbnail() ) {
+ $poolCounterType = 'FileRenderExpensive';
+ } else {
+ $poolCounterType = 'FileRender';
+ }
+
+ // Thumbnail isn't already there, so create the new thumbnail...
+ try {
+ $work = new PoolCounterWorkViaCallback( $poolCounterType, sha1( $file->getName() ),
+ array(
+ 'doWork' => function() use ( $file, $params ) {
+ return $file->transform( $params, File::RENDER_NOW );
+ },
+ 'getCachedWork' => function() use ( $file, $params, $thumbPath ) {
+ // If the worker that finished made this thumbnail then use it.
+ // Otherwise, it probably made a different thumbnail for this file.
+ return $file->getRepo()->fileExists( $thumbPath )
+ ? $file->transform( $params, File::RENDER_NOW )
+ : false; // retry once more in exclusive mode
+ },
+ 'fallback' => function() {
+ return wfMessage( 'generic-pool-error' )->parse();
+ },
+ 'error' => function ( $status ) {
+ return $status->getHTML();
+ }
+ )
+ );
+ $result = $work->execute();
+ if ( $result instanceof MediaTransformOutput ) {
+ $thumb = $result;
+ } elseif ( is_string( $result ) ) { // error
+ $errorHtml = $result;