xref: /aosp_15_r20/external/cronet/base/android/jni_weak_ref.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/android/jni_weak_ref.h"
6 
7 #include <utility>
8 
9 #include "base/android/jni_android.h"
10 
11 using base::android::AttachCurrentThread;
12 
JavaObjectWeakGlobalRef()13 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(nullptr) {}
14 
JavaObjectWeakGlobalRef(const JavaObjectWeakGlobalRef & orig)15 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
16     const JavaObjectWeakGlobalRef& orig)
17     : obj_(nullptr) {
18   Assign(orig);
19 }
20 
JavaObjectWeakGlobalRef(JavaObjectWeakGlobalRef && orig)21 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
22     JavaObjectWeakGlobalRef&& orig) noexcept
23     : obj_(orig.obj_) {
24   orig.obj_ = nullptr;
25 }
26 
JavaObjectWeakGlobalRef(JNIEnv * env,jobject obj)27 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj)
28     : obj_(env->NewWeakGlobalRef(obj)) {
29 }
30 
JavaObjectWeakGlobalRef(JNIEnv * env,const base::android::JavaRef<jobject> & obj)31 JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
32     JNIEnv* env,
33     const base::android::JavaRef<jobject>& obj)
34     : obj_(env->NewWeakGlobalRef(obj.obj())) {
35 }
36 
~JavaObjectWeakGlobalRef()37 JavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() {
38   reset();
39 }
40 
operator =(const JavaObjectWeakGlobalRef & rhs)41 void JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) {
42   Assign(rhs);
43 }
44 
operator =(JavaObjectWeakGlobalRef && rhs)45 void JavaObjectWeakGlobalRef::operator=(JavaObjectWeakGlobalRef&& rhs) {
46   std::swap(obj_, rhs.obj_);
47 }
48 
reset()49 void JavaObjectWeakGlobalRef::reset() {
50   if (obj_) {
51     AttachCurrentThread()->DeleteWeakGlobalRef(obj_);
52     obj_ = nullptr;
53   }
54 }
55 
56 base::android::ScopedJavaLocalRef<jobject>
get(JNIEnv * env) const57     JavaObjectWeakGlobalRef::get(JNIEnv* env) const {
58   return GetRealObject(env, obj_);
59 }
60 
GetRealObject(JNIEnv * env,jweak obj)61 base::android::ScopedJavaLocalRef<jobject> GetRealObject(
62     JNIEnv* env, jweak obj) {
63   jobject real = nullptr;
64   if (obj)
65     real = env->NewLocalRef(obj);
66   return base::android::ScopedJavaLocalRef<jobject>(env, real);
67 }
68 
Assign(const JavaObjectWeakGlobalRef & other)69 void JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) {
70   if (&other == this)
71     return;
72 
73   JNIEnv* env = AttachCurrentThread();
74   if (obj_)
75     env->DeleteWeakGlobalRef(obj_);
76 
77   obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : nullptr;
78 }
79