1 /*
2 *******************************************************************************
3 *
4 * Copyright (C) 2008-2010, International Business Machines
5 * Corporation and others. All Rights Reserved.
6 *
7 *******************************************************************************
8 * file name: mutex.cpp
9 * encoding: US-ASCII
10 * tab size: 8 (not used)
11 * indentation:4
12 */
13
14 #include "unicode/utypes.h"
15 #include "mutex.h"
16
17 U_NAMESPACE_BEGIN
18
getInstance(InstantiatorFn * instantiator,const void * context,void * & duplicate,UErrorCode & errorCode)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
getInstance(InstantiatorFn * instantiator,const void * context,void * & duplicate,UErrorCode & errorCode)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
reset()76 void TriStateSingleton::reset() {
77 fInstance=NULL;
78 fErrorCode=U_ZERO_ERROR;
79 fHaveInstance=0;
80 }
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 */
86 static Mutex *aMutex = 0;
87
88 /* UCONFIG_NO_SERVICE */
89 #endif
90
91 U_NAMESPACE_END
92