aboutsummaryrefslogtreecommitdiffhomepage
path: root/libs/graphics/sgl/SkGlobals.cpp
blob: a53cc1d88b059ba40a3cfbd787eecba0e69f8535 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "SkGlobals.h"
#include "SkThread.h"

SkGlobals::Rec::~Rec()
{
}

SkGlobals::Rec* SkGlobals::Find(U32 tag, Rec* (*create_proc)())
{
	SkGlobals::BootStrap&	bootstrap = SkGlobals::GetBootStrap();

	Rec* rec = bootstrap.fHead;
	while (rec)
	{
		if (rec->fTag == tag)
			return rec;
		rec = rec->fNext;
	}

	if (create_proc == nil)	// no create proc, just return not found
		return nil;

	// if we get here, we may need to create one. First grab the mutex, and
	// search again, creating one if its not found the 2nd time.

	bootstrap.fMutex.acquire();

	// search again, now that we have the mutex. Odds are it won't be there, but we check again
	// just in case it was added by another thread before we grabbed the mutex

	Rec*& head = bootstrap.fHead;
	rec = head;
	while (rec)
	{
		if (rec->fTag == tag)
			break;
		rec = rec->fNext;
	}

	if (rec == nil && (rec = create_proc()) != nil)
	{
		rec->fTag = tag;
		rec->fNext = head;
		bootstrap.fHead = rec;
	}

	bootstrap.fMutex.release();
	return rec;
}

void SkGlobals::Init()
{
}

void SkGlobals::Term()
{
	SkGlobals::BootStrap&	bootstrap = SkGlobals::GetBootStrap();

	bootstrap.fMutex.acquire();

	Rec*&	head = bootstrap.fHead;
	Rec*	rec = head;

	while (rec)
	{
		Rec* next = rec->fNext;
		SkDELETE(rec);
		rec = next;
	}

	bootstrap.fHead = nil;
	bootstrap.fMutex.release();
}