20
20
#include "internal/string.h"
21
21
#include "internal/transcode.h"
22
22
#include "ruby/encoding.h"
23
+ #include "vm_sync.h"
23
24
24
25
#include "transcode_data.h"
25
26
#include "id.h"
@@ -209,19 +210,21 @@ make_transcoder_entry(const char *sname, const char *dname)
209
210
st_data_t val ;
210
211
st_table * table2 ;
211
212
212
- if (!st_lookup (transcoder_table , (st_data_t )sname , & val )) {
213
- val = (st_data_t )st_init_strcasetable ();
214
- st_add_direct (transcoder_table , (st_data_t )sname , val );
215
- }
216
- table2 = (st_table * )val ;
217
- if (!st_lookup (table2 , (st_data_t )dname , & val )) {
218
- transcoder_entry_t * entry = ALLOC (transcoder_entry_t );
219
- entry -> sname = sname ;
220
- entry -> dname = dname ;
221
- entry -> lib = NULL ;
222
- entry -> transcoder = NULL ;
223
- val = (st_data_t )entry ;
224
- st_add_direct (table2 , (st_data_t )dname , val );
213
+ RB_VM_LOCKING () {
214
+ if (!st_lookup (transcoder_table , (st_data_t )sname , & val )) {
215
+ val = (st_data_t )st_init_strcasetable ();
216
+ st_add_direct (transcoder_table , (st_data_t )sname , val );
217
+ }
218
+ table2 = (st_table * )val ;
219
+ if (!st_lookup (table2 , (st_data_t )dname , & val )) {
220
+ transcoder_entry_t * entry = ALLOC (transcoder_entry_t );
221
+ entry -> sname = sname ;
222
+ entry -> dname = dname ;
223
+ entry -> lib = NULL ;
224
+ entry -> transcoder = NULL ;
225
+ val = (st_data_t )entry ;
226
+ st_add_direct (table2 , (st_data_t )dname , val );
227
+ }
225
228
}
226
229
return (transcoder_entry_t * )val ;
227
230
}
@@ -231,14 +234,18 @@ get_transcoder_entry(const char *sname, const char *dname)
231
234
{
232
235
st_data_t val ;
233
236
st_table * table2 ;
234
-
237
+ unsigned int lev ;
238
+ RB_VM_LOCK_ENTER_LEV (& lev );
235
239
if (!st_lookup (transcoder_table , (st_data_t )sname , & val )) {
240
+ RB_VM_LOCK_LEAVE_LEV (& lev );
236
241
return NULL ;
237
242
}
238
243
table2 = (st_table * )val ;
239
244
if (!st_lookup (table2 , (st_data_t )dname , & val )) {
245
+ RB_VM_LOCK_LEAVE_LEV (& lev );
240
246
return NULL ;
241
247
}
248
+ RB_VM_LOCK_LEAVE_LEV (& lev );
242
249
return (transcoder_entry_t * )val ;
243
250
}
244
251
@@ -249,14 +256,19 @@ rb_register_transcoder(const rb_transcoder *tr)
249
256
const char * const dname = tr -> dst_encoding ;
250
257
251
258
transcoder_entry_t * entry ;
259
+ unsigned int lev ;
252
260
253
- entry = make_transcoder_entry (sname , dname );
254
- if (entry -> transcoder ) {
255
- rb_raise (rb_eArgError , "transcoder from %s to %s has been already registered" ,
256
- sname , dname );
261
+ RB_VM_LOCK_ENTER_LEV (& lev );
262
+ {
263
+ entry = make_transcoder_entry (sname , dname );
264
+ if (entry -> transcoder ) {
265
+ RB_VM_LOCK_LEAVE_LEV (& lev );
266
+ rb_raise (rb_eArgError , "transcoder from %s to %s has been already registered" ,
267
+ sname , dname );
268
+ }
269
+ entry -> transcoder = tr ;
257
270
}
258
-
259
- entry -> transcoder = tr ;
271
+ RB_VM_LOCK_LEAVE_LEV (& lev );
260
272
}
261
273
262
274
static void
@@ -325,6 +337,7 @@ transcode_search_path(const char *sname, const char *dname,
325
337
st_table * table2 ;
326
338
int found ;
327
339
int pathlen = -1 ;
340
+ bool lookup_res ;
328
341
329
342
if (encoding_equal (sname , dname ))
330
343
return -1 ;
@@ -344,7 +357,11 @@ transcode_search_path(const char *sname, const char *dname,
344
357
if (!bfs .queue )
345
358
bfs .queue_last_ptr = & bfs .queue ;
346
359
347
- if (!st_lookup (transcoder_table , (st_data_t )q -> enc , & val )) {
360
+ RB_VM_LOCKING () {
361
+ lookup_res = st_lookup (transcoder_table , (st_data_t )q -> enc , & val );
362
+ }
363
+
364
+ if (!lookup_res ) {
348
365
xfree (q );
349
366
continue ;
350
367
}
@@ -2662,23 +2679,28 @@ rb_econv_open_opts(const char *source_encoding, const char *destination_encoding
2662
2679
replacement = rb_hash_aref (opthash , sym_replace );
2663
2680
}
2664
2681
2665
- ec = rb_econv_open (source_encoding , destination_encoding , ecflags );
2666
- if (!ec )
2667
- return ec ;
2668
-
2669
- if (!NIL_P (replacement )) {
2670
- int ret ;
2671
- rb_encoding * enc = rb_enc_get (replacement );
2672
-
2673
- ret = rb_econv_set_replacement (ec ,
2674
- (const unsigned char * )RSTRING_PTR (replacement ),
2675
- RSTRING_LEN (replacement ),
2676
- rb_enc_name (enc ));
2677
- if (ret == -1 ) {
2678
- rb_econv_close (ec );
2679
- return NULL ;
2682
+ unsigned int lev ;
2683
+ RB_VM_LOCK_ENTER_LEV (& lev );
2684
+ {
2685
+ ec = rb_econv_open (source_encoding , destination_encoding , ecflags );
2686
+ if (ec ) {
2687
+ if (!NIL_P (replacement )) {
2688
+ int ret ;
2689
+ rb_encoding * enc = rb_enc_get (replacement );
2690
+
2691
+ ret = rb_econv_set_replacement (ec ,
2692
+ (const unsigned char * )RSTRING_PTR (replacement ),
2693
+ RSTRING_LEN (replacement ),
2694
+ rb_enc_name (enc ));
2695
+ if (ret == -1 ) {
2696
+ rb_econv_close (ec );
2697
+ RB_VM_LOCK_LEAVE_LEV (& lev );
2698
+ return NULL ;
2699
+ }
2700
+ }
2680
2701
}
2681
2702
}
2703
+ RB_VM_LOCK_LEAVE_LEV (& lev );
2682
2704
return ec ;
2683
2705
}
2684
2706
0 commit comments