1 /* libs/graphics/sgl/SkGlobals.cpp 2 ** 3 ** Copyright 2006, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 #include "SkGlobals.h" 19 #include "SkThread.h" 20 21 SkGlobals::Rec::~Rec() 22 { 23 } 24 25 SkGlobals::Rec* SkGlobals::Find(uint32_t tag, Rec* (*create_proc)()) 26 { 27 SkGlobals::BootStrap& bootstrap = SkGlobals::GetBootStrap(); 28 29 Rec* rec = bootstrap.fHead; 30 while (rec) 31 { 32 if (rec->fTag == tag) 33 return rec; 34 rec = rec->fNext; 35 } 36 37 if (create_proc == NULL) // no create proc, just return not found 38 return NULL; 39 40 // if we get here, we may need to create one. First grab the mutex, and 41 // search again, creating one if its not found the 2nd time. 42 43 bootstrap.fMutex.acquire(); 44 45 // search again, now that we have the mutex. Odds are it won't be there, but we check again 46 // just in case it was added by another thread before we grabbed the mutex 47 48 Rec*& head = bootstrap.fHead; 49 rec = head; 50 while (rec) 51 { 52 if (rec->fTag == tag) 53 break; 54 rec = rec->fNext; 55 } 56 57 if (rec == NULL && (rec = create_proc()) != NULL) 58 { 59 rec->fTag = tag; 60 rec->fNext = head; 61 bootstrap.fHead = rec; 62 } 63 64 bootstrap.fMutex.release(); 65 return rec; 66 } 67 68 void SkGlobals::Init() 69 { 70 } 71 72 void SkGlobals::Term() 73 { 74 SkGlobals::BootStrap& bootstrap = SkGlobals::GetBootStrap(); 75 76 bootstrap.fMutex.acquire(); 77 78 Rec*& head = bootstrap.fHead; 79 Rec* rec = head; 80 81 while (rec) 82 { 83 Rec* next = rec->fNext; 84 SkDELETE(rec); 85 rec = next; 86 } 87 88 bootstrap.fHead = NULL; 89 bootstrap.fMutex.release(); 90 } 91 92 93