@@ -232,6 +232,32 @@ make_transcoder_entry(const char *sname, const char *dname)
232
232
st_table * table2 ;
233
233
transcoder_entry_t * entry = NULL ;
234
234
235
+ char key_buf [SRC_ENC_TO_DST_ENC_KEY_SIZE ] = { 0 };
236
+ char * key = NULL ;
237
+ gen_src_to_dst_encodings_key (key_buf , sname , dname );
238
+ while (1 ) {
239
+ VALUE tbl = fast_transcoder_entry_table ;
240
+ VALUE entry_got ;
241
+ if (rb_managed_st_table_lookup (tbl , (st_data_t )key_buf , & entry_got )) {
242
+ entry = (transcoder_entry_t * )entry_got ;
243
+ break ;
244
+ } else {
245
+ if (!entry ) {
246
+ entry = ALLOC (transcoder_entry_t );
247
+ entry -> sname = sname ;
248
+ entry -> dname = dname ;
249
+ entry -> lib = NULL ;
250
+ entry -> transcoder = NULL ;
251
+ }
252
+ VALUE new_tbl = rb_managed_st_table_dup (tbl );
253
+ if (!key ) key = strdup (key_buf );
254
+ rb_managed_st_table_insert (new_tbl , (st_data_t )key , (VALUE )entry );
255
+ if (RUBY_ATOMIC_VALUE_CAS (fast_transcoder_entry_table , tbl , new_tbl ) == tbl ) {
256
+ break ;
257
+ }
258
+ }
259
+ }
260
+
235
261
// TODO: we should be able to remove this table soon
236
262
RB_VM_LOCKING () {
237
263
if (!st_lookup (transcoder_table , (st_data_t )sname , & val )) {
@@ -240,58 +266,25 @@ make_transcoder_entry(const char *sname, const char *dname)
240
266
}
241
267
table2 = (st_table * )val ;
242
268
if (!st_lookup (table2 , (st_data_t )dname , & val )) {
243
- entry = ALLOC (transcoder_entry_t );
244
- entry -> sname = sname ;
245
- entry -> dname = dname ;
246
- entry -> lib = NULL ;
247
- entry -> transcoder = NULL ;
248
269
val = (st_data_t )entry ;
249
270
st_add_direct (table2 , (st_data_t )dname , val );
250
271
} else {
251
272
entry = (transcoder_entry_t * )val ;
252
273
}
253
274
}
254
- char key_buf [SRC_ENC_TO_DST_ENC_KEY_SIZE ] = { 0 };
255
- gen_src_to_dst_encodings_key (key_buf , sname , dname );
256
- ID key = rb_intern (key_buf );
257
- while (1 ) {
258
- VALUE tbl = fast_transcoder_entry_table ;
259
- VALUE entry_got ;
260
- if (rb_managed_id_table_lookup (tbl , key , & entry_got )) {
261
- break ;
262
- } else {
263
- VALUE new_tbl = rb_managed_id_table_dup (tbl );
264
- rb_managed_id_table_insert (new_tbl , key , (VALUE )entry );
265
- if (RUBY_ATOMIC_VALUE_CAS (fast_transcoder_entry_table , tbl , new_tbl ) == tbl ) {
266
- break ;
267
- }
268
- }
269
- }
270
275
return entry ;
271
276
}
272
277
273
278
static transcoder_entry_t *
274
279
get_transcoder_entry (const char * sname , const char * dname )
275
280
{
276
- st_data_t val = 0 ;
277
- st_table * table2 ;
278
281
char key_buf [SRC_ENC_TO_DST_ENC_KEY_SIZE ] = { 0 };
279
282
gen_src_to_dst_encodings_key (key_buf , sname , dname );
280
283
VALUE entry_val ;
281
- if (rb_managed_id_table_lookup (fast_transcoder_entry_table , rb_intern ( key_buf ) , & entry_val )) {
284
+ if (rb_managed_st_table_lookup (fast_transcoder_entry_table , ( st_data_t ) key_buf , & entry_val )) {
282
285
return (transcoder_entry_t * )entry_val ;
283
286
}
284
-
285
- // TODO: we should be able to remove this table soon
286
- RB_VM_LOCKING () {
287
- if (st_lookup (transcoder_table , (st_data_t )sname , & val )) {
288
- table2 = (st_table * )val ;
289
- if (!st_lookup (table2 , (st_data_t )dname , & val )) {
290
- val = 0 ;
291
- }
292
- }
293
- }
294
- return (transcoder_entry_t * )val ;
287
+ return NULL ;
295
288
}
296
289
297
290
void
@@ -1095,11 +1088,11 @@ rb_econv_open0(rb_encoding *senc, const char *sname, rb_encoding *denc, const ch
1095
1088
toarg .entries = NULL ;
1096
1089
toarg .num_additional = 0 ;
1097
1090
char key_buf [SRC_ENC_TO_DST_ENC_KEY_SIZE ] = { 0 };
1091
+ char * key ;
1098
1092
gen_src_to_dst_encodings_key (key_buf , sname , dname );
1099
- ID src_to_dest_id = rb_intern (key_buf );
1100
1093
VALUE managed_val ;
1101
1094
VALUE tbl = RUBY_ATOMIC_VALUE_LOAD (fast_transcoder_path_table );
1102
- if (rb_managed_id_table_lookup (tbl , src_to_dest_id , & managed_val )) {
1095
+ if (rb_managed_st_table_lookup (tbl , ( st_data_t ) key_buf , & managed_val )) {
1103
1096
entries = (transcoder_entry_t * * )managed_val ;
1104
1097
} else {
1105
1098
num_trans = transcode_search_path (sname , dname , trans_open_i , (void * )& toarg );
@@ -1111,8 +1104,9 @@ rb_econv_open0(rb_encoding *senc, const char *sname, rb_encoding *denc, const ch
1111
1104
// No need for CAS loop if it's not most recent `fast_transcoder_table`, some values
1112
1105
// can be lost. It will just go through the slow path next time for the lost src/dst encoding
1113
1106
// pairs
1114
- VALUE new_tbl = rb_managed_id_table_dup (tbl );
1115
- rb_managed_id_table_insert (new_tbl , src_to_dest_id , (VALUE )entries );
1107
+ VALUE new_tbl = rb_managed_st_table_dup (tbl );
1108
+ key = strdup (key_buf );
1109
+ rb_managed_st_table_insert (new_tbl , (st_data_t )key , (VALUE )entries );
1116
1110
RUBY_ATOMIC_VALUE_SET (fast_transcoder_path_table , new_tbl );
1117
1111
}
1118
1112
}
@@ -1919,7 +1913,6 @@ rb_econv_asciicompat_encoding(const char *ascii_incompat_name)
1919
1913
}
1920
1914
1921
1915
}
1922
-
1923
1916
}
1924
1917
1925
1918
return data .ascii_compat_name ; // can be NULL
@@ -4561,9 +4554,9 @@ void
4561
4554
Init_transcode (void )
4562
4555
{
4563
4556
transcoder_table = st_init_strcasetable ();
4564
- fast_transcoder_path_table = rb_managed_id_table_new (8 ); // NOTE: size is arbitrarily chosen
4557
+ fast_transcoder_path_table = rb_managed_st_table_create_strcasetable (8 ); // NOTE: size is arbitrarily chosen
4565
4558
rb_gc_register_address (& fast_transcoder_path_table );
4566
- fast_transcoder_entry_table = rb_managed_id_table_new (8 );
4559
+ fast_transcoder_entry_table = rb_managed_st_table_create_strcasetable (8 );
4567
4560
rb_gc_register_address (& fast_transcoder_entry_table );
4568
4561
4569
4562
id_destination_encoding = rb_intern_const ("destination_encoding" );
0 commit comments