20 #include "AtomicInteger.h"
21 #include "JNIHelper.h"
23 namespace com {
namespace avpkit {
namespace ferry {
24 jclass AtomicInteger::mClass = 0;
25 jmethodID AtomicInteger::mConstructorMethod = 0;
26 jmethodID AtomicInteger::mGetMethod = 0;
27 jmethodID AtomicInteger::mSetMethod = 0;
28 jmethodID AtomicInteger::mGetAndSetMethod = 0;
29 jmethodID AtomicInteger::mGetAndIncrementMethod = 0;
30 jmethodID AtomicInteger::mGetAndDecrementMethod = 0;
31 jmethodID AtomicInteger::mGetAndAddMethod = 0;
32 jmethodID AtomicInteger::mIncrementAndGetMethod = 0;
33 jmethodID AtomicInteger::mDecrementAndGetMethod = 0;
34 jmethodID AtomicInteger::mAddAndGetMethod = 0;
35 jmethodID AtomicInteger::mCompareAndSetMethod = 0;
38 bool AtomicInteger::mInitialized =
false;
46 JNIHelper::sRegisterInitializationCallback(initializeClass, 0);
52 AtomicInteger::initializeClass(JavaVM*,
void*)
54 JNIEnv *env=JNIHelper::sGetEnv();
58 jclass cls=env->FindClass(
"java/util/concurrent/atomic/AtomicInteger");
62 mConstructorMethod = env->GetMethodID(cls,
65 mGetMethod=env->GetMethodID(cls,
"get",
"()I");
66 mSetMethod=env->GetMethodID(cls,
"set",
"(I)V");
67 mGetAndSetMethod=env->GetMethodID(cls,
"getAndSet",
"(I)I");
68 mCompareAndSetMethod=env->GetMethodID(cls,
69 "compareAndSet",
"(II)Z");
70 mGetAndIncrementMethod=env->GetMethodID(cls,
71 "getAndIncrement",
"()I");
72 mGetAndDecrementMethod=env->GetMethodID(cls,
73 "getAndDecrement",
"()I");
74 mGetAndAddMethod=env->GetMethodID(cls,
76 mIncrementAndGetMethod=env->GetMethodID(cls,
77 "incrementAndGet",
"()I");
78 mDecrementAndGetMethod=env->GetMethodID(cls,
79 "decrementAndGet",
"()I");
80 mAddAndGetMethod=env->GetMethodID(cls,
84 mClass = (jclass)env->NewWeakGlobalRef(cls);
90 AtomicInteger::initializeObject()
96 JNIEnv *env=JNIHelper::sGetEnv();
103 AtomicInteger::initializeClass(JNIHelper::sGetVM(), 0);
107 jobject newValue = env->NewObject(mClass, mConstructorMethod);
110 mAtomicValue = env->NewGlobalRef(newValue);
111 env->DeleteLocalRef(newValue);
117 AtomicInteger::AtomicInteger()
122 AtomicInteger::AtomicInteger(int32_t val)
130 AtomicInteger::~AtomicInteger()
134 JNIEnv *env=JNIHelper::sGetEnv();
137 env->DeleteGlobalRef(mAtomicValue);
146 JNIEnv *env=JNIHelper::sGetEnv();
149 if (mAtomicValue && env)
150 val = env->CallIntMethod(mAtomicValue,
153 val = mNonAtomicValue;
158 AtomicInteger::set(int32_t newval)
160 JNIEnv *env=JNIHelper::sGetEnv();
162 if (mAtomicValue && env)
163 env->CallVoidMethod(mAtomicValue,
166 mNonAtomicValue=newval;
170 AtomicInteger::getAndSet(int32_t newval)
172 JNIEnv *env=JNIHelper::sGetEnv();
175 if (mAtomicValue && env)
176 retval = env->CallIntMethod(mAtomicValue,
177 mGetAndSetMethod, newval);
179 retval = mNonAtomicValue;
180 mNonAtomicValue = newval;
186 AtomicInteger::getAndIncrement()
188 JNIEnv *env=JNIHelper::sGetEnv();
191 if (mAtomicValue && env)
192 retval = env->CallIntMethod(mAtomicValue,
193 mGetAndIncrementMethod);
195 retval = mNonAtomicValue++;
200 AtomicInteger::getAndDecrement()
202 JNIEnv *env=JNIHelper::sGetEnv();
205 if (mAtomicValue && env)
206 retval = env->CallIntMethod(mAtomicValue,
207 mGetAndDecrementMethod);
209 retval = mNonAtomicValue--;
214 AtomicInteger::getAndAdd(int32_t newval)
216 JNIEnv *env=JNIHelper::sGetEnv();
219 if (mAtomicValue && env)
220 retval = env->CallIntMethod(mAtomicValue,
221 mGetAndAddMethod, newval);
223 retval = mNonAtomicValue;
224 mNonAtomicValue += newval;
231 AtomicInteger::incrementAndGet()
233 JNIEnv *env=JNIHelper::sGetEnv();
236 if (mAtomicValue && env)
237 retval = env->CallIntMethod(mAtomicValue,
238 mIncrementAndGetMethod);
240 retval = (++mNonAtomicValue);
245 AtomicInteger::decrementAndGet()
247 JNIEnv *env=JNIHelper::sGetEnv();
250 if (mAtomicValue && env)
251 retval = env->CallIntMethod(mAtomicValue,
252 mDecrementAndGetMethod);
254 retval = (--mNonAtomicValue);
259 AtomicInteger::addAndGet(int32_t newval)
261 JNIEnv *env=JNIHelper::sGetEnv();
264 if (mAtomicValue && env)
265 retval = env->CallIntMethod(mAtomicValue,
266 mAddAndGetMethod, newval);
268 mNonAtomicValue += newval;
269 retval = mNonAtomicValue;
277 JNIEnv *env=JNIHelper::sGetEnv();
280 if (mAtomicValue && env)
281 retval = env->CallBooleanMethod(mAtomicValue,
282 mCompareAndSetMethod, expected, update);
284 retval = (mNonAtomicValue == expected);
287 mNonAtomicValue = update;
296 return init() && mAtomicValue != 0;
bool compareAndSet(int32_t expected, int32_t update)
Compare the current value to expected, and if they are equal, set the current value to update.
WARNING: Do not use logging in this class, and do not set any static file variables to values other t...