mutex.cpp revision 50294ead5e5d23f5bbfed76e00e6b510bd41eee1
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
17U_NAMESPACE_BEGIN
18
19void *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
42void *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
76void 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 */
86static Mutex *aMutex = 0;
87
88/* UCONFIG_NO_SERVICE */
89#endif
90
91U_NAMESPACE_END
92