note description: "[ Condition variables allow threads to synchronize based on the content of a shared data, whereas mutexes only synchronize access to the data. In other words, a condition variable is a synchronization object that enables threads to wait until a particular condition occurs. When a thread executes a wait call on a condition variable, it must hold an associated mutex (used for checking that condition). Then, it is immediately suspended and put into the waiting queue. The thread is suspended and is waiting for the condition to occur. Eventually, when the condition has occurred, a thread will signal it. Two possible scenarios: - if there are threads waiting, then one of the waiting thread will resume its execution and will get the mutex in a locked state. - if there are no threads waiting, nothing is done For the simple usage of a condition variable, it is very similar to using a semaphore. In addition you have broadcast that will resume all waiting threads at once, and wait_with_timeout that will wait only a certain amount of time before abandonning the wait. The signal and broadcast routines can be called by a thread whether or not it currently owns the mutex that threads calling wait or wait_with_timeout have associated with the condition variable during their waits. If, however, predictable scheduling behavior is required, then that mutex should be locked by the thread prior to calling signal or broadcast. Assuming shared_data an INTEGER initially set to zero, then a typical usage of condition variable to wait until shared_data becomes one, could be written as followed in thread A: mutex.lock from until shared_data = 1 loop condition_variable.wait (mutex) end mutex.unlock and in thread B: mutex.lock shared_data := 1 condition_variable.signal mutex.unlock Thread A will be blocked until thread B signal that now shared_data is 1. ]" legal: "See notice at end of class." status: "See notice at end of class." date: "$Date: 2017-05-25 15:02:28 +0000 (Thu, 25 May 2017) $" revision: "$Revision: 100436 $" class interface CONDITION_VARIABLE create make -- Create and initialize condition variable. ensure is_set: is_set feature -- Access generating_type: TYPE [detachable CONDITION_VARIABLE] -- Type of current object -- (type of which it is a direct instance) -- (from ANY) ensure -- from ANY generating_type_not_void: Result /= Void generator: STRING_8 -- Name of current object's generating class -- (base class of the type of which it is a direct instance) -- (from ANY) ensure -- from ANY generator_not_void: Result /= Void generator_not_empty: not Result.is_empty is_set: BOOLEAN -- Is condition variable initialized? feature -- Comparison frozen deep_equal (a: detachable ANY; b: like arg #1): BOOLEAN -- Are a and b either both void -- or attached to isomorphic object structures? -- (from ANY) ensure -- from ANY instance_free: class shallow_implies_deep: standard_equal (a, b) implies Result both_or_none_void: (a = Void) implies (Result = (b = Void)) same_type: (Result and (a /= Void)) implies (b /= Void and then a.same_type (b)) symmetric: Result implies deep_equal (b, a) frozen equal (a: detachable ANY; b: like arg #1): BOOLEAN -- Are a and b either both void or attached -- to objects considered equal? -- (from ANY) ensure -- from ANY instance_free: class definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.is_equal (b)) frozen is_deep_equal alias "≡≡≡" (other: CONDITION_VARIABLE): BOOLEAN -- Are Current and other attached to isomorphic object structures? -- (from ANY) require -- from ANY other_not_void: other /= Void ensure -- from ANY shallow_implies_deep: standard_is_equal (other) implies Result same_type: Result implies same_type (other) symmetric: Result implies other.is_deep_equal (Current) is_equal (other: CONDITION_VARIABLE): BOOLEAN -- Is other attached to an object considered -- equal to current object? -- (from ANY) require -- from ANY other_not_void: other /= Void ensure -- from ANY symmetric: Result implies other ~ Current consistent: standard_is_equal (other) implies Result frozen standard_equal (a: detachable ANY; b: like arg #1): BOOLEAN -- Are a and b either both void or attached to -- field-by-field identical objects of the same type? -- Always uses default object comparison criterion. -- (from ANY) ensure -- from ANY instance_free: class definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.standard_is_equal (b)) frozen standard_is_equal alias "≜" (other: CONDITION_VARIABLE): BOOLEAN -- Is other attached to an object of the same type -- as current object, and field-by-field identical to it? -- (from ANY) require -- from ANY other_not_void: other /= Void ensure -- from ANY same_type: Result implies same_type (other) symmetric: Result implies other.standard_is_equal (Current) feature -- Status report conforms_to (other: ANY): BOOLEAN -- Does type of current object conform to type -- of other (as per Eiffel: The Language, chapter 13)? -- (from ANY) require -- from ANY other_not_void: other /= Void same_type (other: ANY): BOOLEAN -- Is type of current object identical to type of other? -- (from ANY) require -- from ANY other_not_void: other /= Void ensure -- from ANY definition: Result = (conforms_to (other) and other.conforms_to (Current)) feature -- Status setting broadcast -- Unblock all threads blocked on the current condition variable. require is_set: is_set destroy -- Destroy condition variable. require is_set: is_set ensure not_set: not is_set signal -- Unblock one thread blocked on the current condition variable. require is_set: is_set wait (a_mutex: MUTEX) -- Block calling thread on current condition variable. require is_set: is_set a_mutex_not_void: a_mutex /= Void wait_with_timeout (a_mutex: MUTEX; a_timeout_ms: INTEGER_32): BOOLEAN -- Block calling thread on current condition variable for at most a_timeout milliseconds. -- Return True is we got the condition variable on time, otherwise return False require is_set: is_set a_mutex_not_void: a_mutex /= Void timeout_positive: a_timeout_ms >= 0 feature -- Removal dispose -- Called by the garbage collector when the condition -- variable is collected. feature -- Duplication copy (other: CONDITION_VARIABLE) -- Update current object using fields of object attached -- to other, so as to yield equal objects. -- (from ANY) require -- from ANY other_not_void: other /= Void type_identity: same_type (other) ensure -- from ANY is_equal: Current ~ other frozen deep_copy (other: CONDITION_VARIABLE) -- Effect equivalent to that of: -- copy (other . deep_twin) -- (from ANY) require -- from ANY other_not_void: other /= Void ensure -- from ANY deep_equal: deep_equal (Current, other) frozen deep_twin: CONDITION_VARIABLE -- New object structure recursively duplicated from Current. -- (from ANY) ensure -- from ANY deep_twin_not_void: Result /= Void deep_equal: deep_equal (Current, Result) frozen standard_copy (other: CONDITION_VARIABLE) -- Copy every field of other onto corresponding field -- of current object. -- (from ANY) require -- from ANY other_not_void: other /= Void type_identity: same_type (other) ensure -- from ANY is_standard_equal: standard_is_equal (other) frozen standard_twin: CONDITION_VARIABLE -- New object field-by-field identical to other. -- Always uses default copying semantics. -- (from ANY) ensure -- from ANY standard_twin_not_void: Result /= Void equal: standard_equal (Result, Current) frozen twin: CONDITION_VARIABLE -- New object equal to Current -- twin calls copy; to change copying/twinning semantics, redefine copy. -- (from ANY) ensure -- from ANY twin_not_void: Result /= Void is_equal: Result ~ Current feature -- Basic operations frozen default: detachable CONDITION_VARIABLE -- Default value of object's type -- (from ANY) frozen default_pointer: POINTER -- Default value of type POINTER -- (Avoid the need to write p.default for -- some p of type POINTER.) -- (from ANY) ensure -- from ANY instance_free: class default_rescue -- Process exception for routines with no Rescue clause. -- (Default: do nothing.) -- (from ANY) frozen do_nothing -- Execute a null action. -- (from ANY) ensure -- from ANY instance_free: class feature -- Output Io: STD_FILES -- Handle to standard file setup -- (from ANY) ensure -- from ANY instance_free: class io_not_void: Result /= Void out: STRING_8 -- New string containing terse printable representation -- of current object -- (from ANY) ensure -- from ANY out_not_void: Result /= Void print (o: detachable ANY) -- Write terse external representation of o -- on standard output. -- (from ANY) ensure -- from ANY instance_free: class frozen tagged_out: STRING_8 -- New string containing terse printable representation -- of current object -- (from ANY) ensure -- from ANY tagged_out_not_void: Result /= Void feature -- Platform Operating_environment: OPERATING_ENVIRONMENT -- Objects available from the operating system -- (from ANY) ensure -- from ANY instance_free: class operating_environment_not_void: Result /= Void invariant -- from ANY reflexive_equality: standard_is_equal (Current) reflexive_conformance: conforms_to (Current) note copyright: "Copyright (c) 1984-2017, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software 5949 Hollister Ave., Goleta, CA 93117 USA Telephone 805-685-1006, Fax 805-685-6869 Website http://www.eiffel.com Customer support http://support.eiffel.com ]" end -- class CONDITION_VARIABLE
Generated by ISE EiffelStudio