summaryrefslogtreecommitdiffstats
path: root/core/jni/android/graphics
diff options
context:
space:
mode:
authorRay Chen <>2009-04-02 10:41:55 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-04-02 10:41:55 -0700
commit43ca00b0e82711f67246030e70bfb1f423e4a67f (patch)
tree8ac791b3811eb21058f638e82a62e7bab52c094a /core/jni/android/graphics
parentf1b083fb856b36c3381d5d167617ed68d640ee8c (diff)
downloadframeworks_base-43ca00b0e82711f67246030e70bfb1f423e4a67f.zip
frameworks_base-43ca00b0e82711f67246030e70bfb1f423e4a67f.tar.gz
frameworks_base-43ca00b0e82711f67246030e70bfb1f423e4a67f.tar.bz2
AI 144209: am: CL 144176 To fix the race condition in case "requestCancelDecode"
happens earlier than AutoDecoderCancel object is added to the gAutoDecoderCancelMutex linked list. Original author: raychen Merged from: //branches/donutburger/... Automated import of CL 144209
Diffstat (limited to 'core/jni/android/graphics')
-rw-r--r--core/jni/android/graphics/BitmapFactory.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 332b01c..4ad2eb0 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -22,6 +22,7 @@ static jfieldID gOptions_ditherFieldID;
static jfieldID gOptions_widthFieldID;
static jfieldID gOptions_heightFieldID;
static jfieldID gOptions_mimeFieldID;
+static jfieldID gOptions_mCancelID;
static jclass gFileDescriptor_class;
static jfieldID gFileDescriptor_descriptor;
@@ -204,12 +205,12 @@ class AssetStreamAdaptor : public SkStream {
public:
AssetStreamAdaptor(Asset* a) : fAsset(a) {}
- virtual bool rewind() {
+ virtual bool rewind() {
off_t pos = fAsset->seek(0, SEEK_SET);
return pos != (off_t)-1;
}
- virtual size_t read(void* buffer, size_t size) {
+ virtual size_t read(void* buffer, size_t size) {
ssize_t amount;
if (NULL == buffer) {
@@ -322,6 +323,15 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding,
AutoDecoderCancel adc(options, decoder);
+ // To fix the race condition in case "requestCancelDecode"
+ // happens earlier than AutoDecoderCancel object is added
+ // to the gAutoDecoderCancelMutex linked list.
+ if (NULL != options) {
+ if (env->GetBooleanField(options, gOptions_mCancelID)) {
+ return NULL;
+ }
+ }
+
if (!decoder->decode(stream, bitmap, prefConfig, mode)) {
return NULL;
}
@@ -588,6 +598,7 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) {
gOptions_widthFieldID = getFieldIDCheck(env, gOptions_class, "outWidth", "I");
gOptions_heightFieldID = getFieldIDCheck(env, gOptions_class, "outHeight", "I");
gOptions_mimeFieldID = getFieldIDCheck(env, gOptions_class, "outMimeType", "Ljava/lang/String;");
+ gOptions_mCancelID = getFieldIDCheck(env, gOptions_class, "mCancel", "Z");
gFileDescriptor_class = make_globalref(env, "java/io/FileDescriptor");
gFileDescriptor_descriptor = getFieldIDCheck(env, gFileDescriptor_class, "descriptor", "I");