Skip to content

Commit 857a340

Browse files
committed
Call CSRelease through a destructor
Ensures it's called on panics and allows us to simplify control flow a bit. Additionally correct the signature of `CSRelease` to return `()` instead of an empty `c_void` enum.
1 parent 53dc53d commit 857a340

File tree

1 file changed

+40
-25
lines changed

1 file changed

+40
-25
lines changed

src/symbolize/coresymbolication.rs

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ coresymbolication! {
187187
/Versions/A/CoreSymbolication"]
188188
extern "C" {
189189
fn CSSymbolicatorCreateWithPid(pid: c_int) -> CSTypeRef;
190-
fn CSRelease(rf: CSTypeRef) -> c_void;
190+
fn CSRelease(rf: CSTypeRef) -> ();
191191
fn CSSymbolicatorGetSymbolWithAddressAtTime(
192192
cs: CSTypeRef, addr: *const c_void, time: u64) -> CSTypeRef;
193193
fn CSSymbolicatorGetSourceInfoWithAddressAtTime(
@@ -213,40 +213,55 @@ unsafe fn try_resolve(addr: *mut c_void, cb: &mut FnMut(&super::Symbol)) -> bool
213213
if cs == CSREF_NULL {
214214
return false;
215215
}
216+
let _dtor = OwnedCSTypeRef {
217+
ptr: cs,
218+
CSRelease: lib.CSRelease(),
219+
};
216220

217221
let info = lib.CSSymbolicatorGetSourceInfoWithAddressAtTime()(cs, addr, CS_NOW);
218222
let sym = if info == CSREF_NULL {
219223
lib.CSSymbolicatorGetSymbolWithAddressAtTime()(cs, addr, CS_NOW)
220224
} else {
221225
lib.CSSourceInfoGetSymbol()(info)
222226
};
227+
if sym == CSREF_NULL {
228+
return false;
229+
}
230+
let owner = lib.CSSymbolGetSymbolOwner()(sym);
231+
if owner == CSREF_NULL {
232+
return false;
233+
}
223234

224-
let mut rv = false;
225-
if sym != CSREF_NULL {
226-
let owner = lib.CSSymbolGetSymbolOwner()(sym);
227-
if owner != CSREF_NULL {
228-
cb(&super::Symbol {
229-
inner: Symbol::Core {
230-
path: if info != CSREF_NULL {
231-
lib.CSSourceInfoGetPath()(info)
232-
} else {
233-
ptr::null()
234-
},
235-
lineno: if info != CSREF_NULL {
236-
lib.CSSourceInfoGetLineNumber()(info) as u32
237-
} else {
238-
0
239-
},
240-
name: lib.CSSymbolGetMangledName()(sym),
241-
addr: lib.CSSymbolOwnerGetBaseAddress()(owner),
242-
},
243-
});
244-
rv = true;
235+
cb(&super::Symbol {
236+
inner: Symbol::Core {
237+
path: if info != CSREF_NULL {
238+
lib.CSSourceInfoGetPath()(info)
239+
} else {
240+
ptr::null()
241+
},
242+
lineno: if info != CSREF_NULL {
243+
lib.CSSourceInfoGetLineNumber()(info) as u32
244+
} else {
245+
0
246+
},
247+
name: lib.CSSymbolGetMangledName()(sym),
248+
addr: lib.CSSymbolOwnerGetBaseAddress()(owner),
249+
},
250+
});
251+
true
252+
}
253+
254+
struct OwnedCSTypeRef {
255+
ptr: CSTypeRef,
256+
CSRelease: unsafe extern "C" fn(CSTypeRef),
257+
}
258+
259+
impl Drop for OwnedCSTypeRef {
260+
fn drop(&mut self) {
261+
unsafe {
262+
(self.CSRelease)(self.ptr);
245263
}
246264
}
247-
lib.CSRelease()(cs);
248-
249-
rv
250265
}
251266

252267
pub unsafe fn resolve(what: ResolveWhat, cb: &mut FnMut(&super::Symbol)) {

0 commit comments

Comments
 (0)