Skip to content

Commit 97b2d01

Browse files
committed
Fix bug about Whisper::Model and GC
1 parent 666e13f commit 97b2d01

File tree

1 file changed

+44
-18
lines changed

1 file changed

+44
-18
lines changed

bindings/ruby/ext/ruby_whisper.cpp

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,7 +1171,7 @@ typedef struct {
11711171
} ruby_whisper_segment;
11721172

11731173
typedef struct {
1174-
whisper_context *context;
1174+
VALUE context;
11751175
} ruby_whisper_model;
11761176

11771177
VALUE cSegment;
@@ -1348,13 +1348,17 @@ static VALUE ruby_whisper_segment_get_text(VALUE self) {
13481348
return rb_str_new2(text);
13491349
}
13501350

1351+
static void rb_whisper_model_mark(ruby_whisper_model *rwm) {
1352+
rb_gc_mark(rwm->context);
1353+
}
1354+
13511355
static VALUE ruby_whisper_model_allocate(VALUE klass) {
13521356
ruby_whisper_model *rwm;
13531357
rwm = ALLOC(ruby_whisper_model);
1354-
return Data_Wrap_Struct(klass, NULL, RUBY_DEFAULT_FREE, rwm);
1358+
return Data_Wrap_Struct(klass, rb_whisper_model_mark, RUBY_DEFAULT_FREE, rwm);
13551359
}
13561360

1357-
static VALUE rb_whisper_model_initialize(whisper_context *context) {
1361+
static VALUE rb_whisper_model_initialize(VALUE context) {
13581362
ruby_whisper_model *rwm;
13591363
const VALUE model = ruby_whisper_model_allocate(cModel);
13601364
Data_Get_Struct(model, ruby_whisper_model, rwm);
@@ -1367,9 +1371,7 @@ static VALUE rb_whisper_model_initialize(whisper_context *context) {
13671371
* model -> Whisper::Model
13681372
*/
13691373
static VALUE ruby_whisper_get_model(VALUE self) {
1370-
ruby_whisper *rw;
1371-
Data_Get_Struct(self, ruby_whisper, rw);
1372-
return rb_whisper_model_initialize(rw->context);
1374+
return rb_whisper_model_initialize(self);
13731375
}
13741376

13751377
/*
@@ -1379,7 +1381,9 @@ static VALUE ruby_whisper_get_model(VALUE self) {
13791381
static VALUE ruby_whisper_c_model_n_vocab(VALUE self) {
13801382
ruby_whisper_model *rwm;
13811383
Data_Get_Struct(self, ruby_whisper_model, rwm);
1382-
return INT2NUM(whisper_model_n_vocab(rwm->context));
1384+
ruby_whisper *rw;
1385+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1386+
return INT2NUM(whisper_model_n_vocab(rw->context));
13831387
}
13841388

13851389
/*
@@ -1389,7 +1393,9 @@ static VALUE ruby_whisper_c_model_n_vocab(VALUE self) {
13891393
static VALUE ruby_whisper_c_model_n_audio_ctx(VALUE self) {
13901394
ruby_whisper_model *rwm;
13911395
Data_Get_Struct(self, ruby_whisper_model, rwm);
1392-
return INT2NUM(whisper_model_n_audio_ctx(rwm->context));
1396+
ruby_whisper *rw;
1397+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1398+
return INT2NUM(whisper_model_n_audio_ctx(rw->context));
13931399
}
13941400

13951401
/*
@@ -1399,7 +1405,9 @@ static VALUE ruby_whisper_c_model_n_audio_ctx(VALUE self) {
13991405
static VALUE ruby_whisper_c_model_n_audio_state(VALUE self) {
14001406
ruby_whisper_model *rwm;
14011407
Data_Get_Struct(self, ruby_whisper_model, rwm);
1402-
return INT2NUM(whisper_model_n_audio_state(rwm->context));
1408+
ruby_whisper *rw;
1409+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1410+
return INT2NUM(whisper_model_n_audio_state(rw->context));
14031411
}
14041412

14051413
/*
@@ -1409,7 +1417,9 @@ static VALUE ruby_whisper_c_model_n_audio_state(VALUE self) {
14091417
static VALUE ruby_whisper_c_model_n_audio_head(VALUE self) {
14101418
ruby_whisper_model *rwm;
14111419
Data_Get_Struct(self, ruby_whisper_model, rwm);
1412-
return INT2NUM(whisper_model_n_audio_head(rwm->context));
1420+
ruby_whisper *rw;
1421+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1422+
return INT2NUM(whisper_model_n_audio_head(rw->context));
14131423
}
14141424

14151425
/*
@@ -1419,7 +1429,9 @@ static VALUE ruby_whisper_c_model_n_audio_head(VALUE self) {
14191429
static VALUE ruby_whisper_c_model_n_audio_layer(VALUE self) {
14201430
ruby_whisper_model *rwm;
14211431
Data_Get_Struct(self, ruby_whisper_model, rwm);
1422-
return INT2NUM(whisper_model_n_audio_layer(rwm->context));
1432+
ruby_whisper *rw;
1433+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1434+
return INT2NUM(whisper_model_n_audio_layer(rw->context));
14231435
}
14241436

14251437
/*
@@ -1429,7 +1441,9 @@ static VALUE ruby_whisper_c_model_n_audio_layer(VALUE self) {
14291441
static VALUE ruby_whisper_c_model_n_text_ctx(VALUE self) {
14301442
ruby_whisper_model *rwm;
14311443
Data_Get_Struct(self, ruby_whisper_model, rwm);
1432-
return INT2NUM(whisper_model_n_text_ctx(rwm->context));
1444+
ruby_whisper *rw;
1445+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1446+
return INT2NUM(whisper_model_n_text_ctx(rw->context));
14331447
}
14341448

14351449
/*
@@ -1439,7 +1453,9 @@ static VALUE ruby_whisper_c_model_n_text_ctx(VALUE self) {
14391453
static VALUE ruby_whisper_c_model_n_text_state(VALUE self) {
14401454
ruby_whisper_model *rwm;
14411455
Data_Get_Struct(self, ruby_whisper_model, rwm);
1442-
return INT2NUM(whisper_model_n_text_state(rwm->context));
1456+
ruby_whisper *rw;
1457+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1458+
return INT2NUM(whisper_model_n_text_state(rw->context));
14431459
}
14441460

14451461
/*
@@ -1449,7 +1465,9 @@ static VALUE ruby_whisper_c_model_n_text_state(VALUE self) {
14491465
static VALUE ruby_whisper_c_model_n_text_head(VALUE self) {
14501466
ruby_whisper_model *rwm;
14511467
Data_Get_Struct(self, ruby_whisper_model, rwm);
1452-
return INT2NUM(whisper_model_n_text_head(rwm->context));
1468+
ruby_whisper *rw;
1469+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1470+
return INT2NUM(whisper_model_n_text_head(rw->context));
14531471
}
14541472

14551473
/*
@@ -1459,7 +1477,9 @@ static VALUE ruby_whisper_c_model_n_text_head(VALUE self) {
14591477
static VALUE ruby_whisper_c_model_n_text_layer(VALUE self) {
14601478
ruby_whisper_model *rwm;
14611479
Data_Get_Struct(self, ruby_whisper_model, rwm);
1462-
return INT2NUM(whisper_model_n_text_layer(rwm->context));
1480+
ruby_whisper *rw;
1481+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1482+
return INT2NUM(whisper_model_n_text_layer(rw->context));
14631483
}
14641484

14651485
/*
@@ -1469,7 +1489,9 @@ static VALUE ruby_whisper_c_model_n_text_layer(VALUE self) {
14691489
static VALUE ruby_whisper_c_model_n_mels(VALUE self) {
14701490
ruby_whisper_model *rwm;
14711491
Data_Get_Struct(self, ruby_whisper_model, rwm);
1472-
return INT2NUM(whisper_model_n_mels(rwm->context));
1492+
ruby_whisper *rw;
1493+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1494+
return INT2NUM(whisper_model_n_mels(rw->context));
14731495
}
14741496

14751497
/*
@@ -1479,7 +1501,9 @@ static VALUE ruby_whisper_c_model_n_mels(VALUE self) {
14791501
static VALUE ruby_whisper_c_model_ftype(VALUE self) {
14801502
ruby_whisper_model *rwm;
14811503
Data_Get_Struct(self, ruby_whisper_model, rwm);
1482-
return INT2NUM(whisper_model_ftype(rwm->context));
1504+
ruby_whisper *rw;
1505+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1506+
return INT2NUM(whisper_model_ftype(rw->context));
14831507
}
14841508

14851509
/*
@@ -1489,7 +1513,9 @@ static VALUE ruby_whisper_c_model_ftype(VALUE self) {
14891513
static VALUE ruby_whisper_c_model_type(VALUE self) {
14901514
ruby_whisper_model *rwm;
14911515
Data_Get_Struct(self, ruby_whisper_model, rwm);
1492-
return rb_str_new2(whisper_model_type_readable(rwm->context));
1516+
ruby_whisper *rw;
1517+
Data_Get_Struct(rwm->context, ruby_whisper, rw);
1518+
return rb_str_new2(whisper_model_type_readable(rw->context));
14931519
}
14941520

14951521
void Init_whisper() {

0 commit comments

Comments
 (0)