• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "AutoDecodeCancel.h"
2 
3 static SkMutex  gAutoDecoderCancelMutex;
4 static AutoDecoderCancel* gAutoDecoderCancel;
5 #ifdef SK_DEBUG
6 static int gAutoDecoderCancelCount;
7 #endif
8 
AutoDecoderCancel(jobject joptions,SkImageDecoder * decoder)9 AutoDecoderCancel::AutoDecoderCancel(jobject joptions,
10                                        SkImageDecoder* decoder) {
11     fJOptions = joptions;
12     fDecoder = decoder;
13 
14     if (NULL != joptions) {
15         SkAutoMutexAcquire ac(gAutoDecoderCancelMutex);
16 
17         // Add us as the head of the list
18         fPrev = NULL;
19         fNext = gAutoDecoderCancel;
20         if (gAutoDecoderCancel) {
21             gAutoDecoderCancel->fPrev = this;
22         }
23         gAutoDecoderCancel = this;
24 
25         SkDEBUGCODE(gAutoDecoderCancelCount += 1;)
26         Validate();
27     }
28 }
29 
~AutoDecoderCancel()30 AutoDecoderCancel::~AutoDecoderCancel() {
31     if (NULL != fJOptions) {
32         SkAutoMutexAcquire ac(gAutoDecoderCancelMutex);
33 
34         // take us out of the dllist
35         AutoDecoderCancel* prev = fPrev;
36         AutoDecoderCancel* next = fNext;
37 
38         if (prev) {
39             SkASSERT(prev->fNext == this);
40             prev->fNext = next;
41         } else {
42             SkASSERT(gAutoDecoderCancel == this);
43             gAutoDecoderCancel = next;
44         }
45         if (next) {
46             SkASSERT(next->fPrev == this);
47             next->fPrev = prev;
48         }
49 
50         SkDEBUGCODE(gAutoDecoderCancelCount -= 1;)
51         Validate();
52     }
53 }
54 
RequestCancel(jobject joptions)55 bool AutoDecoderCancel::RequestCancel(jobject joptions) {
56     SkAutoMutexAcquire ac(gAutoDecoderCancelMutex);
57 
58     Validate();
59 
60     AutoDecoderCancel* pair = gAutoDecoderCancel;
61     while (pair != NULL) {
62         if (pair->fJOptions == joptions) {
63             pair->fDecoder->cancelDecode();
64             return true;
65         }
66         pair = pair->fNext;
67     }
68     return false;
69 }
70 
71 #ifdef SK_DEBUG
72 // can only call this inside a lock on gAutoDecoderCancelMutex
Validate()73 void AutoDecoderCancel::Validate() {
74     const int gCount = gAutoDecoderCancelCount;
75 
76     if (gCount == 0) {
77         SkASSERT(gAutoDecoderCancel == NULL);
78     } else {
79         SkASSERT(gCount > 0);
80 
81         AutoDecoderCancel* curr = gAutoDecoderCancel;
82         SkASSERT(curr);
83         SkASSERT(curr->fPrev == NULL);
84 
85         int count = 0;
86         while (curr) {
87             count += 1;
88             SkASSERT(count <= gCount);
89             if (curr->fPrev) {
90                 SkASSERT(curr->fPrev->fNext == curr);
91             }
92             if (curr->fNext) {
93                 SkASSERT(curr->fNext->fPrev == curr);
94             }
95             curr = curr->fNext;
96         }
97         SkASSERT(count == gCount);
98     }
99 }
100 #endif
101