@@ -81,7 +81,7 @@ getattr(int fd, conmode *t)
81
81
82
82
#define CSI "\x1b\x5b"
83
83
84
- static ID id_getc , id_console , id_close ;
84
+ static ID id_getc , id_close ;
85
85
static ID id_gets , id_flush , id_chomp_bang ;
86
86
87
87
#if defined HAVE_RUBY_FIBER_SCHEDULER_H
@@ -1566,6 +1566,56 @@ rb_io_closed_p(VALUE io)
1566
1566
}
1567
1567
#endif
1568
1568
1569
+ #ifdef HAVE_RB_EXT_RACTOR_SAFE
1570
+ #include "ruby/ractor.h"
1571
+ static rb_ractor_local_key_t key_console_dev ;
1572
+
1573
+ static bool
1574
+ console_dev_get (VALUE klass , VALUE * dev )
1575
+ {
1576
+ return rb_ractor_local_storage_value_lookup (key_console_dev , dev );
1577
+ }
1578
+
1579
+ static void
1580
+ console_dev_set (VALUE klass , VALUE value )
1581
+ {
1582
+ rb_ractor_local_storage_value_set (key_console_dev , value );
1583
+ }
1584
+
1585
+ static void
1586
+ console_dev_remove (VALUE klass )
1587
+ {
1588
+ console_dev_set (klass , Qnil );
1589
+ }
1590
+
1591
+ #else
1592
+
1593
+ static ID id_console ;
1594
+
1595
+ static bool
1596
+ console_dev_get (VALUE klass , VALUE * dev )
1597
+ {
1598
+ if (rb_const_defined (klass , id_console )) {
1599
+ * dev = rb_const_get (klass , id_console );
1600
+ return true;
1601
+ }
1602
+ return false;
1603
+ }
1604
+
1605
+ static void
1606
+ console_dev_set (VALUE klass , VALUE value )
1607
+ {
1608
+ rb_const_set (klass , id_console , value );
1609
+ }
1610
+
1611
+ static void
1612
+ console_dev_remove (VALUE klass )
1613
+ {
1614
+ rb_const_remove (klass , id_console );
1615
+ }
1616
+
1617
+ #endif
1618
+
1569
1619
/*
1570
1620
* call-seq:
1571
1621
* IO.console -> #<File:/dev/tty>
@@ -1594,10 +1644,9 @@ console_dev(int argc, VALUE *argv, VALUE klass)
1594
1644
// Force the class to be File.
1595
1645
if (klass == rb_cIO ) klass = rb_cFile ;
1596
1646
1597
- if (rb_const_defined (klass , id_console )) {
1598
- con = rb_const_get (klass , id_console );
1647
+ if (console_dev_get (klass , & con )) {
1599
1648
if (!RB_TYPE_P (con , T_FILE ) || RTEST (rb_io_closed_p (con ))) {
1600
- rb_const_remove (klass , id_console );
1649
+ console_dev_remove (klass );
1601
1650
con = 0 ;
1602
1651
}
1603
1652
}
@@ -1606,7 +1655,7 @@ console_dev(int argc, VALUE *argv, VALUE klass)
1606
1655
if (sym == ID2SYM (id_close ) && argc == 1 ) {
1607
1656
if (con ) {
1608
1657
rb_io_close (con );
1609
- rb_const_remove (klass , id_console );
1658
+ console_dev_remove (klass );
1610
1659
con = 0 ;
1611
1660
}
1612
1661
return Qnil ;
@@ -1647,7 +1696,7 @@ console_dev(int argc, VALUE *argv, VALUE klass)
1647
1696
#ifdef CONSOLE_DEVICE_FOR_WRITING
1648
1697
rb_io_set_write_io (con , out );
1649
1698
#endif
1650
- rb_const_set (klass , id_console , con );
1699
+ console_dev_set (klass , con );
1651
1700
}
1652
1701
1653
1702
if (sym ) {
@@ -1769,11 +1818,15 @@ Init_console(void)
1769
1818
#endif
1770
1819
1771
1820
#undef rb_intern
1821
+ #ifdef HAVE_RB_EXT_RACTOR_SAFE
1822
+ key_console_dev = rb_ractor_local_storage_value_newkey ();
1823
+ #else
1824
+ id_console = rb_intern ("console" );
1825
+ #endif
1772
1826
id_getc = rb_intern ("getc" );
1773
1827
id_gets = rb_intern ("gets" );
1774
1828
id_flush = rb_intern ("flush" );
1775
1829
id_chomp_bang = rb_intern ("chomp!" );
1776
- id_console = rb_intern ("console" );
1777
1830
id_close = rb_intern ("close" );
1778
1831
#define init_rawmode_opt_id (name ) \
1779
1832
rawmode_opt_ids[kwd_##name] = rb_intern(#name)
0 commit comments