Files
palemoon27/image/DecodePool.h
T
roytam1 877b16186b import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1157954 - Report each surface in the ImageLib SurfaceCache individually in about:memory. r=dholbert (3810a2b1f)
- Bug 1139641 - Return more information from SurfaceCache::Lookup and SurfaceCache::LookupBestMatch. r=dholbert (fdd62b01d)
- Bug 1177615 - Rip everything related to FLAG_DECODE_STARTED out of ImageLib. r=tn (818a77ac1)
- Bug 1153253 - move nsImageBoxFrame::mRequestRegistered to pack better with other members; r=dholbert (fe26ff0ce)
- Bug 1177604 - Stop delaying the load event for XUL images until the image is decoded. r=tn (6c0100f5a)
- Bug 1180931 (Part 1) - Allow sync size decoding for single core devices. r=tn (62eae65e3)
- Bug 1180931 (Part 2) - Allow sync size decoding for transient (i.e. multipart) images. r=tn (537dea273)
- Bug 1165009 - Bail in RasterImage::OnAddedFrame if we hit an error during decoding. r=tn (e9a85bf7d)
- Bug 1171356 - On B2G, retry image decodes that fail because allocation of the first frame failed. r=tn (06e712f65)
- Bug 1151166 - Fix two Coverity warnings in nsPNGDecoder.cpp. r=jrmuizel (848f4f0c2)
- Bug 857040 - Warn on bad CRC instead of error exit. r=joe (74a6438ab)
- Bug 1117607 - Make decoders responsible for their own frame allocations. r=tn (d224b33a8)
- Bug 1178274 - Don't enable decode-only-on-draw if the APZ pref is true but e10s is disabled. r=dvander (76ca02965)
- Bug 1177323 - disable decode-only-on-draw preference. r=seth (b6ac4e9b0)
- Bug 1183836 - Remove support for decode-on-draw-only. r=tn (af0b79370)
- Bug 1183852 - Only mark surfaces as used in the SurfaceCache if a caller requested exactly that surface. r=dholbert (e8d94d193)
- Bug 1176124 (Part 1) - Add a MatchType enum to LookupResult to let Lookup*() return more detailed information. r=dholbert (b3b7b01c0)
- Bug 1176124 (Part 2) - Add placeholder support to the SurfaceCache so we can avoid launching redundant decoders. r=dholbert (6fa4cae4d)
- Bug 1185582 - Back out bug 1171356, a hack to retry image decoding which is now useless. r=tn (0bac6a812)
- Bug 1155332 - If we don't have enough memory to fully decode an image, discard it immediately. r=tn (2adc2f8ea)
- Bug 1185592 (Part 1) - Remove obsolete logging macros. r=baku (b1e98c8a8)
- Bug 1185592 (Part 2) - Make RasterImage store the decoder type instead of the MIME type. r=baku (abce7fd06)
- Bug 1186667 - Correctly report IMAGE_DECODE_COUNT and IMAGE_MAX_DECODE_COUNT telemetry for only non-size decodes. r=tn (97bfbbc82)
- make WEBPDecoder comply Bug 1117607 - Make decoders responsible for their own frame allocation (03866748e)
- make JXR decoder crudely compliant to 1117607 and make it allocate its frame - can probably be improved (b804d6f67)
2021-09-07 17:25:13 +08:00

107 lines
3.0 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/**
* DecodePool manages the threads used for decoding raster images.
*/
#ifndef mozilla_image_DecodePool_h
#define mozilla_image_DecodePool_h
#include "mozilla/Mutex.h"
#include "mozilla/StaticPtr.h"
#include "nsCOMArray.h"
#include "nsCOMPtr.h"
#include "nsIEventTarget.h"
#include "nsIObserver.h"
#include "mozilla/RefPtr.h"
class nsIThread;
class nsIThreadPool;
namespace mozilla {
namespace image {
class Decoder;
class DecodePoolImpl;
/**
* DecodePool is a singleton class that manages decoding of raster images. It
* owns a pool of image decoding threads that are used for asynchronous
* decoding.
*
* DecodePool allows callers to run a decoder, handling management of the
* decoder's lifecycle and whether it executes on the main thread,
* off-main-thread in the image decoding thread pool, or on some combination of
* the two.
*/
class DecodePool : public nsIObserver
{
public:
NS_DECL_THREADSAFE_ISUPPORTS
NS_DECL_NSIOBSERVER
/// Initializes the singleton instance. Should be called from the main thread.
static void Initialize();
/// Returns the singleton instance.
static DecodePool* Singleton();
/// @return the number of processor cores we have available. This is not the
/// same as the number of decoding threads we're actually using.
static uint32_t NumberOfCores();
/// Ask the DecodePool to run @aDecoder asynchronously and return immediately.
void AsyncDecode(Decoder* aDecoder);
/**
* Run @aDecoder synchronously if the image it's decoding is small. If the
* image is too large, or if the source data isn't complete yet, run @aDecoder
* asynchronously instead.
*/
void SyncDecodeIfSmall(Decoder* aDecoder);
/**
* Run aDecoder synchronously if at all possible. If it can't complete
* synchronously because the source data isn't complete, asynchronously decode
* the rest.
*/
void SyncDecodeIfPossible(Decoder* aDecoder);
/**
* Returns an event target interface to the DecodePool's I/O thread. Callers
* who want to deliver data to workers on the DecodePool can use this event
* target.
*
* @return An nsIEventTarget interface to the thread pool's I/O thread.
*/
already_AddRefed<nsIEventTarget> GetIOEventTarget();
private:
friend class DecodePoolWorker;
DecodePool();
virtual ~DecodePool();
void Decode(Decoder* aDecoder);
void NotifyDecodeComplete(Decoder* aDecoder);
void NotifyProgress(Decoder* aDecoder);
static StaticRefPtr<DecodePool> sSingleton;
static uint32_t sNumCores;
nsRefPtr<DecodePoolImpl> mImpl;
// mMutex protects mThreads and mIOThread.
Mutex mMutex;
nsCOMArray<nsIThread> mThreads;
nsCOMPtr<nsIThread> mIOThread;
};
} // namespace image
} // namespace mozilla
#endif // mozilla_image_DecodePool_h