ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ???????????????????????????????????? ???????????????????????????????????? ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ÿØÿà JFIF    ÿÛ „  ( %!1!%)+//.383,7(-.+  -%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ     ÿÄ J    ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ   ÿÄ *  !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú "SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5 ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍѶ¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e ríV ?> ......................................... ............................................................................. ???????????????????????????????????? ???????????????????????????????????? U:RDoc::NormalClass[iI" Fiber:ET@I" Object;To:RDoc::Markup::Document: @parts[o;;[$o:RDoc::Markup::Paragraph;[ I"EFibers are primitives for implementing light weight cooperative ;TI"Mconcurrency in Ruby. Basically they are a means of creating code blocks ;TI"Lthat can be paused and resumed, much like threads. The main difference ;TI"Nis that they are never preempted and that the scheduling must be done by ;TI"#the programmer and not the VM.;To:RDoc::Markup::BlankLineo; ;[ I"OAs opposed to other stackless light weight concurrency models, each fiber ;TI"Jcomes with a stack. This enables the fiber to be paused from deeply ;TI"Dnested function calls within the fiber block. See the ruby(1) ;TI"9manpage to configure the size of the fiber stack(s).;T@o; ;[ I"KWhen a fiber is created it will not run automatically. Rather it must ;TI"?be explicitly asked to run using the Fiber#resume method. ;TI"FThe code running inside the fiber can give up control by calling ;TI"EFiber.yield in which case it yields control back to caller (the ;TI"!caller of the Fiber#resume).;T@o; ;[I"JUpon yielding or termination the Fiber returns the value of the last ;TI"executed expression;T@o; ;[I"For instance:;T@o:RDoc::Markup::Verbatim;[ I"fiber = Fiber.new do ;TI" Fiber.yield 1 ;TI" 2 ;TI" end ;TI" ;TI"puts fiber.resume ;TI"puts fiber.resume ;TI"puts fiber.resume ;T: @format0o; ;[I"produces;T@o; ;[I"1 ;TI"2 ;TI"#FiberError: dead fiber called ;T; 0o; ;[ I"HThe Fiber#resume method accepts an arbitrary number of parameters, ;TI"Dif it is the first call to #resume then they will be passed as ;TI"Eblock arguments. Otherwise they will be the return value of the ;TI"call to Fiber.yield;T@o; ;[I" Example:;T@o; ;[ I""fiber = Fiber.new do |first| ;TI"& second = Fiber.yield first + 2 ;TI" end ;TI" ;TI"puts fiber.resume 10 ;TI"!puts fiber.resume 1_000_000 ;TI"Kputs fiber.resume "The fiber will be dead before I can cause trouble" ;T; 0o; ;[I"produces;T@o; ;[I"12 ;TI" 1000000 ;TI"#FiberError: dead fiber called ;T; 0S:RDoc::Markup::Heading: leveli: textI"Non-blocking Fibers;T@o; ;[ I"LThe concept of non-blocking fiber was introduced in Ruby 3.0. ;TI"OA non-blocking fiber, when reaching a operation that would normally block ;TI"Mthe fiber (like sleep, or wait for another process or I/O) ;TI"Lwill yield control to other fibers and allow the scheduler to ;TI"Mhandle blocking and waking up (resuming) this fiber when it can proceed.;T@o; ;[ I"TFor a Fiber to behave as non-blocking, it need to be created in Fiber.new with ;TI"Jblocking: false (which is the default), and Fiber.scheduler ;TI"Nshould be set with Fiber.set_scheduler. If Fiber.scheduler is not set in ;TI"Qthe current thread, blocking and non-blocking fibers' behavior is identical.;T@o; ;[I"QRuby doesn't provide a scheduler class: it is expected to be implemented by ;TI"1the user and correspond to Fiber::Scheduler.;T@o; ;[I"SThere is also Fiber.schedule method, which is expected to immediately perform ;TI"Rthe given block in a non-blocking manner. Its actual implementation is up to ;TI"the scheduler.;T: @fileI" cont.c;T:0@omit_headings_from_table_of_contents_below0;0;0[[[[[I" class;T[[: public[[I"[];TI" cont.c;T[I"[]=;T@y[I" blocking;T@y[I"blocking?;T@y[I" current;T@y[I"current_scheduler;T@y[I"new;T@y[I" schedule;T@y[I"scheduler;T@y[I"set_scheduler;T@y[I" yield;T@y[:protected[[: private[[I" instance;T[[;[[I" alive?;T@y[I"backtrace;T@y[I"backtrace_locations;T@y[I"blocking?;T@y[I" inspect;T@y[I" kill;T@y[I" raise;T@y[I" resume;T@y[I" storage;T@y[I" storage=;T@y[I" to_s;T@y[I" transfer;T@y[;[[;[[[U:RDoc::Context::Section[i0o;;[;0;0[@m@mcRDoc::TopLevel