jvmti_rs/wrapper/jvmtifns/
heap.rs1use 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 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}