Skip to content

Commit 88fad37

Browse files
authored
fix: Clean up some of the cruft generated by Codex (#31)
- Remove the use of Mutex (Ruby already provides a global lock) - Remove the pointless init function - Add error handling
1 parent eeb89ee commit 88fad37

File tree

2 files changed

+19
-25
lines changed

2 files changed

+19
-25
lines changed

examples/selective_tracing.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@
1111
puts 'this will be traced'
1212
recorder.disable_tracing
1313
puts 'tracing disabled'
14-
recorder.flush_trace(ENV['CODETRACER_RUBY_RECORDER_OUT_DIR'] || Dir.pwd)
14+
recorder.flush_trace(Dir.pwd)

gems/native-tracer/ext/native_tracer/src/lib.rs

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use std::{
66
os::raw::{c_char, c_void},
77
path::Path,
88
ptr,
9-
sync::Mutex,
109
};
1110

1211
use rb_sys::{
@@ -17,6 +16,7 @@ use rb_sys::{
1716
rb_tracearg_event_flag, rb_tracearg_lineno, rb_tracearg_path,
1817
rb_cObject, VALUE, ID, RUBY_EVENT_LINE,
1918
RSTRING_PTR, RSTRING_LEN,
19+
rb_raise, rb_eIOError,
2020
};
2121
use runtime_tracing::{Tracer, Line};
2222

@@ -56,7 +56,7 @@ extern "C" {
5656
}
5757

5858
struct Recorder {
59-
tracer: Mutex<Tracer>,
59+
tracer: Tracer,
6060
active: bool,
6161
}
6262

@@ -86,16 +86,11 @@ unsafe fn get_recorder(obj: VALUE) -> *mut Recorder {
8686
}
8787

8888
unsafe extern "C" fn ruby_recorder_alloc(klass: VALUE) -> VALUE {
89-
let recorder = Box::new(Recorder { tracer: Mutex::new(Tracer::new("ruby", &vec![])), active: false });
89+
let recorder = Box::new(Recorder { tracer: Tracer::new("ruby", &vec![]), active: false });
9090
let ty = std::ptr::addr_of!(RECORDER_TYPE) as *const rb_data_type_t;
9191
rb_data_typed_object_wrap(klass, Box::into_raw(recorder) as *mut c_void, ty)
9292
}
9393

94-
unsafe extern "C" fn ruby_recorder_initialize(_self: VALUE) -> VALUE {
95-
// nothing special for now
96-
rb_sys::Qnil.into()
97-
}
98-
9994
unsafe extern "C" fn enable_tracing(self_val: VALUE) -> VALUE {
10095
let recorder = &mut *get_recorder(self_val);
10196
if !recorder.active {
@@ -118,14 +113,15 @@ unsafe extern "C" fn disable_tracing(self_val: VALUE) -> VALUE {
118113
rb_sys::Qnil.into()
119114
}
120115

121-
fn flush_to_dir(tracer: &Tracer, dir: &Path) {
122-
let _ = std::fs::create_dir_all(dir);
116+
fn flush_to_dir(tracer: &Tracer, dir: &Path) -> Result<(), Box<dyn std::error::Error>> {
117+
std::fs::create_dir_all(dir)?;
123118
let events = dir.join("trace.json");
124119
let metadata = dir.join("trace_metadata.json");
125120
let paths = dir.join("trace_paths.json");
126-
let _ = tracer.store_trace_events(&events);
127-
let _ = tracer.store_trace_metadata(&metadata);
128-
let _ = tracer.store_trace_paths(&paths);
121+
tracer.store_trace_events(&events)?;
122+
tracer.store_trace_metadata(&metadata)?;
123+
tracer.store_trace_paths(&paths)?;
124+
Ok(())
129125
}
130126

131127
unsafe extern "C" fn flush_trace(self_val: VALUE, out_dir: VALUE) -> VALUE {
@@ -134,14 +130,16 @@ unsafe extern "C" fn flush_trace(self_val: VALUE, out_dir: VALUE) -> VALUE {
134130
let ptr = RSTRING_PTR(out_dir) as *const u8;
135131
let len = RSTRING_LEN(out_dir) as usize;
136132
let slice = std::slice::from_raw_parts(ptr, len);
137-
if let Ok(path_str) = std::str::from_utf8(slice) {
138-
if let Ok(t) = recorder.tracer.lock() {
139-
flush_to_dir(&t, Path::new(path_str));
133+
134+
match std::str::from_utf8(slice) {
135+
Ok(path_str) => {
136+
if let Err(e) = flush_to_dir(&recorder.tracer, Path::new(path_str)) {
137+
rb_raise(rb_eIOError, b"Failed to flush trace: %s\0".as_ptr() as *const c_char, e.to_string().as_ptr() as *const c_char);
138+
}
140139
}
140+
Err(e) => rb_raise(rb_eIOError, b"Invalid UTF-8 in path: %s\0".as_ptr() as *const c_char, e.to_string().as_ptr() as *const c_char),
141141
}
142-
drop(Box::from_raw(recorder_ptr));
143-
let rdata = self_val as *mut RTypedData;
144-
(*rdata).data = ptr::null_mut();
142+
145143
rb_sys::Qnil.into()
146144
}
147145

@@ -172,9 +170,7 @@ unsafe extern "C" fn event_hook_raw(data: VALUE, arg: *mut rb_trace_arg_t) {
172170

173171
if !path_ptr.is_null() {
174172
if let Ok(path) = CStr::from_ptr(path_ptr).to_str() {
175-
if let Ok(mut t) = recorder.tracer.lock() {
176-
t.register_step(Path::new(path), Line(line));
177-
}
173+
recorder.tracer.register_step(Path::new(path), Line(line));
178174
}
179175
}
180176
}
@@ -184,11 +180,9 @@ pub extern "C" fn Init_codetracer_ruby_recorder() {
184180
unsafe {
185181
let class = rb_define_class(b"RubyRecorder\0".as_ptr() as *const c_char, rb_cObject);
186182
rb_define_alloc_func(class, Some(ruby_recorder_alloc));
187-
let init_cb: unsafe extern "C" fn(VALUE) -> VALUE = ruby_recorder_initialize;
188183
let enable_cb: unsafe extern "C" fn(VALUE) -> VALUE = enable_tracing;
189184
let disable_cb: unsafe extern "C" fn(VALUE) -> VALUE = disable_tracing;
190185
let flush_cb: unsafe extern "C" fn(VALUE, VALUE) -> VALUE = flush_trace;
191-
rb_define_method(class, b"initialize\0".as_ptr() as *const c_char, Some(transmute(init_cb)), 0);
192186
rb_define_method(class, b"enable_tracing\0".as_ptr() as *const c_char, Some(transmute(enable_cb)), 0);
193187
rb_define_method(class, b"disable_tracing\0".as_ptr() as *const c_char, Some(transmute(disable_cb)), 0);
194188
rb_define_method(class, b"flush_trace\0".as_ptr() as *const c_char, Some(transmute(flush_cb)), 1);

0 commit comments

Comments
 (0)