@@ -232,6 +232,32 @@ make_transcoder_entry(const char *sname, const char *dname)
232232 st_table * table2 ;
233233 transcoder_entry_t * entry = NULL ;
234234
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+
235261 // TODO: we should be able to remove this table soon
236262 RB_VM_LOCKING () {
237263 if (!st_lookup (transcoder_table , (st_data_t )sname , & val )) {
@@ -240,58 +266,25 @@ make_transcoder_entry(const char *sname, const char *dname)
240266 }
241267 table2 = (st_table * )val ;
242268 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 ;
248269 val = (st_data_t )entry ;
249270 st_add_direct (table2 , (st_data_t )dname , val );
250271 } else {
251272 entry = (transcoder_entry_t * )val ;
252273 }
253274 }
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- }
270275 return entry ;
271276}
272277
273278static transcoder_entry_t *
274279get_transcoder_entry (const char * sname , const char * dname )
275280{
276- st_data_t val = 0 ;
277- st_table * table2 ;
278281 char key_buf [SRC_ENC_TO_DST_ENC_KEY_SIZE ] = { 0 };
279282 gen_src_to_dst_encodings_key (key_buf , sname , dname );
280283 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 )) {
282285 return (transcoder_entry_t * )entry_val ;
283286 }
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 ;
295288}
296289
297290void
@@ -1095,11 +1088,11 @@ rb_econv_open0(rb_encoding *senc, const char *sname, rb_encoding *denc, const ch
10951088 toarg .entries = NULL ;
10961089 toarg .num_additional = 0 ;
10971090 char key_buf [SRC_ENC_TO_DST_ENC_KEY_SIZE ] = { 0 };
1091+ char * key ;
10981092 gen_src_to_dst_encodings_key (key_buf , sname , dname );
1099- ID src_to_dest_id = rb_intern (key_buf );
11001093 VALUE managed_val ;
11011094 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 )) {
11031096 entries = (transcoder_entry_t * * )managed_val ;
11041097 } else {
11051098 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
11111104 // No need for CAS loop if it's not most recent `fast_transcoder_table`, some values
11121105 // can be lost. It will just go through the slow path next time for the lost src/dst encoding
11131106 // 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 );
11161110 RUBY_ATOMIC_VALUE_SET (fast_transcoder_path_table , new_tbl );
11171111 }
11181112 }
@@ -1919,7 +1913,6 @@ rb_econv_asciicompat_encoding(const char *ascii_incompat_name)
19191913 }
19201914
19211915 }
1922-
19231916 }
19241917
19251918 return data .ascii_compat_name ; // can be NULL
@@ -4561,9 +4554,9 @@ void
45614554Init_transcode (void )
45624555{
45634556 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
45654558 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 );
45674560 rb_gc_register_address (& fast_transcoder_entry_table );
45684561
45694562 id_destination_encoding = rb_intern_const ("destination_encoding" );
0 commit comments