]>
Commit | Line | Data |
---|---|---|
729e4ab9 | 1 | /* |
46f4442e | 2 | ******************************************************************************* |
729e4ab9 A |
3 | * |
4 | * Copyright (C) 2008-2010, International Business Machines | |
5 | * Corporation and others. All Rights Reserved. | |
6 | * | |
46f4442e | 7 | ******************************************************************************* |
729e4ab9 A |
8 | * file name: mutex.cpp |
9 | * encoding: US-ASCII | |
10 | * tab size: 8 (not used) | |
11 | * indentation:4 | |
46f4442e A |
12 | */ |
13 | ||
14 | #include "unicode/utypes.h" | |
729e4ab9 A |
15 | #include "mutex.h" |
16 | ||
17 | U_NAMESPACE_BEGIN | |
18 | ||
19 | void *SimpleSingleton::getInstance(InstantiatorFn *instantiator, const void *context, | |
20 | void *&duplicate, | |
21 | UErrorCode &errorCode) { | |
22 | duplicate=NULL; | |
23 | if(U_FAILURE(errorCode)) { | |
24 | return NULL; | |
25 | } | |
26 | void *instance; | |
27 | UMTX_CHECK(NULL, fInstance, instance); | |
28 | if(instance!=NULL) { | |
29 | return instance; | |
30 | } else { | |
31 | instance=instantiator(context, errorCode); | |
32 | Mutex mutex; | |
33 | if(fInstance==NULL && U_SUCCESS(errorCode)) { | |
34 | fInstance=instance; | |
35 | } else { | |
36 | duplicate=instance; | |
37 | } | |
38 | return fInstance; | |
39 | } | |
40 | } | |
41 | ||
42 | void *TriStateSingleton::getInstance(InstantiatorFn *instantiator, const void *context, | |
43 | void *&duplicate, | |
44 | UErrorCode &errorCode) { | |
45 | duplicate=NULL; | |
46 | if(U_FAILURE(errorCode)) { | |
47 | return NULL; | |
48 | } | |
49 | int8_t haveInstance; | |
50 | UMTX_CHECK(NULL, fHaveInstance, haveInstance); | |
51 | if(haveInstance>0) { | |
52 | return fInstance; // instance was created | |
53 | } else if(haveInstance<0) { | |
54 | errorCode=fErrorCode; // instance creation failed | |
55 | return NULL; | |
56 | } else /* haveInstance==0 */ { | |
57 | void *instance=instantiator(context, errorCode); | |
58 | Mutex mutex; | |
59 | if(fHaveInstance==0) { | |
60 | if(U_SUCCESS(errorCode)) { | |
61 | fInstance=instance; | |
62 | instance=NULL; | |
63 | fHaveInstance=1; | |
64 | } else { | |
65 | fErrorCode=errorCode; | |
66 | fHaveInstance=-1; | |
67 | } | |
68 | } else { | |
69 | errorCode=fErrorCode; | |
70 | } | |
71 | duplicate=instance; | |
72 | return fInstance; | |
73 | } | |
74 | } | |
75 | ||
76 | void TriStateSingleton::reset() { | |
77 | fInstance=NULL; | |
78 | fErrorCode=U_ZERO_ERROR; | |
79 | fHaveInstance=0; | |
80 | } | |
46f4442e A |
81 | |
82 | #if UCONFIG_NO_SERVICE | |
83 | ||
84 | /* If UCONFIG_NO_SERVICE, then there is no invocation of Mutex elsewhere in | |
85 | common, so add one here to force an export */ | |
46f4442e A |
86 | static Mutex *aMutex = 0; |
87 | ||
88 | /* UCONFIG_NO_SERVICE */ | |
89 | #endif | |
729e4ab9 A |
90 | |
91 | U_NAMESPACE_END |