jvmti_rs/wrapper/jvmtifns/
heap.rs

1use std::ptr;
2
3use crate::{errors::*, JVMTIEnv, objects::*, slice_raw, sys::*};
4use jni::sys::jobject;
5
6impl<'a> JVMTIEnv<'a> {
7    pub fn get_tag(&self, object: &JObject) -> Result<jlong> {
8        Ok(jvmti_call_number_result!(self.jvmti_raw(), jlong,
9            GetTag,
10            object.into_inner()
11       ))
12    }
13
14    pub fn set_tag(&self, object: &JObject, tag: jlong) -> Result<()> {
15        jvmti_call!(self.jvmti_raw(), SetTag,
16            object.into_inner(),
17            tag
18        )
19    }
20
21    pub fn get_objects_with_tags(&self, tags: &Vec<jlong>) -> Result<Vec<JTagObject>> {
22        if tags.is_empty() {
23            return Ok(vec![]);
24        }
25
26        let mut count: jint = 0 as jint;
27        let mut object_result: *mut jobject = ptr::null_mut();
28        let mut tag_result: *mut jlong = ptr::null_mut();
29
30        let res = jvmti_call_result!( self.jvmti_raw(), GetObjectsWithTags,
31            tags.len() as jint,
32            tags.as_ptr(),
33            &mut count,
34            &mut object_result,
35            &mut tag_result
36        );
37        jvmti_error_code_to_result(res)?;
38        if count == 0 || object_result.is_null() || tag_result.is_null() {
39            return Ok(vec![]);
40        }
41        // TODO: to be optimized
42        let objects = slice_raw(object_result, count);
43        let tags = slice_raw(tag_result, count);
44        let mut jtag_objects: Vec<JTagObject> = Vec::with_capacity(count as usize);
45        for idx in 0..(count as usize) {
46            let o: jobject = objects[idx..idx + 1][0];
47            let t: jlong = tags[idx..idx + 1][0];
48            jtag_objects.push(JTagObject::new(o, t))
49        }
50
51        self.deallocate_raw(object_result as jmemory)?;
52        self.deallocate_raw(tag_result as jmemory)?;
53
54        Ok(jtag_objects)
55    }
56
57    pub fn force_garbage_collection(&self) -> Result<()> {
58        jvmti_call!(self.jvmti_raw(), ForceGarbageCollection)
59    }
60}