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"Lbe explicitly asked to run using the Fiber#resume method. ;TI"FThe code running inside the fiber can give up control by calling ;TI"MFiber.yield in which case it yields control back to caller ;TI"3(the 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"IThe Fiber#resume method accepts an arbitrary number of ;TI"Jparameters, if it is the first call to resume then they ;TI"Jwill be passed as block arguments. Otherwise they will be the return ;TI"2value of the 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 14 ;TI"puts fiber.resume 18 ;T; 0o; ;[I"produces;T@o; ;[I"12 ;TI"14 ;TI""FiberError: dead fiber called;T; 0: @fileI" cont.c;T:0@omit_headings_from_table_of_contents_below0; 0;0[[[[[I" class;T[[: public[[I" current;TI" cont.c;T[I" yield;T@a[:protected[[: private[[I" instance;T[[;[[I" alive?;T@a[I" resume;T@a[I" transfer;T@a[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0;0[@U@UcRDoc::TopLevel