Future.st
author Claus Gittinger <cg@exept.de>
Thu, 16 Jan 1997 14:45:49 +0100
changeset 484 d50c08ae6e3d
parent 457 c862c91716b6
child 885 c31412b26306
permissions -rw-r--r--
documentation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
457
c862c91716b6 packages
Claus Gittinger <cg@exept.de>
parents: 351
diff changeset
     1
"{ Package: 'goodies/Parallelism-Futures' }"
c862c91716b6 packages
Claus Gittinger <cg@exept.de>
parents: 351
diff changeset
     2
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
     3
"       NAME            Parallelism
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
     4
	AUTHOR          tph@cs.man.ac.uk
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
     5
	FUNCTION throttled Futures; lazy eval; explicit pa'l'l procs 
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
     6
	ST-VERSIONS     stx
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
     7
	PREREQUISITES    
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
     8
	CONFLICTS       
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
     9
	DISTRIBUTION    world
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    10
	VERSION         1.1
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    11
	DATE    22 Jan 1989
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    12
	SUMMARY 
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    13
Parallelism contains a number of explicitly parallel constructs,
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    14
including a new version of Future, Lazy evaluation, and explicit
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    15
parallel processes.  Lots of code in here.  Contains an early
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    16
version (read: doesn't work) of a ""throttled"" future mechanism.
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    17
New version RSN.(2.2).TPH
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    18
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    19
claus: I have separated the original Parallelism package into
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    20
       individual ones: Lazy, Future, ThrottledFuture and ParallelEvaluation
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    21
"!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    22
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    23
'From Smalltalk-80, version 2, of April 1, 1983 on 29 March 1987 at 5:13:27 pm'!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    24
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    25
!Object methodsFor: 'parallel evaluation'!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    26
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    27
touch
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    28
	"Simply returns self.  If the receiver is an uncompleted
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    29
	 Future or Lazy, this forces complete evaluation."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    30
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    31
	^self
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    32
! !
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    33
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    34
Object subclass: #Future
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    35
	instanceVariableNames: 'result semaphore '
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    36
	classVariableNames: ''
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    37
	poolDictionaries: ''
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
    38
	category: 'Kernel-Processes'
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    39
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    40
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    41
Future comment:
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    42
'I represent an execution in progress.  Any messages sent to me are delayed until
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    43
 execution has completed.'
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    44
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
    45
484
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    46
!Future class methodsFor:'documentation'!
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    47
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    48
copyright
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    49
"
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    50
 This is a Manchester Goodie protected by copyright.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    51
 These conditions are imposed on the whole Goodie, and on any significant
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    52
 part of it which is separately transmitted or stored:
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    53
	* You must ensure that every copy includes this notice, and that
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    54
	  source and author(s) of the material are acknowledged.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    55
	* These conditions must be imposed on anyone who receives a copy.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    56
	* The material shall not be used for commercial gain without the prior
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    57
	  written consent of the author(s).
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    58
 Further information on the copyright conditions may be obtained by
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    59
 sending electronic mail:
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    60
	To: goodies-lib@cs.man.ac.uk
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    61
	Subject: copyright
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    62
 or by writing to The Smalltalk Goodies Library Manager, Dept of
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    63
 Computer Science, The University, Manchester M13 9PL, UK
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    64
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    65
 (C) Copyright 1992 University of Manchester
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    66
 For more information about the Manchester Goodies Library (from which 
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    67
 this file was distributed) send e-mail:
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    68
	To: goodies-lib@cs.man.ac.uk
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    69
	Subject: help 
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    70
"
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    71
!
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    72
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    73
documentation
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    74
"
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    75
    I represent an execution in progress.  
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    76
    Any messages sent to me are delayed until execution has completed.'
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    77
"
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    78
!
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    79
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    80
examples
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    81
"
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    82
  Starts evaluating the factorial immediately, but waits until
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    83
  the result is available before printing the answer
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    84
								    [exBegin]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    85
    | fac |
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    86
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    87
    fac := [100 factorial] futureValue.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    88
    Transcript showCR: 'evaluating factorial...'.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    89
    Transcript showCR: fac printString
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    90
								    [exEnd]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    91
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    92
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    93
  An example illustrating the use of multiple futures and
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    94
  explicit resynchronisation.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    95
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    96
  Starts evaluating both factorials immediately, but waits until
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    97
  both blocks have finished before continuing.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    98
								    [exBegin]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
    99
    | fac1 fac2 |
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   100
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   101
    fac1 := [Transcript showCR: 'Starting fac1.. '. 1000 factorial] futureValue.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   102
    fac2 := [Transcript showCR: 'Starting fac2.. '. 2000 factorial] futureValue.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   103
    fac2 touch.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   104
    fac1 touch.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   105
    Transcript showCR: 'both completed.'.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   106
								    [exEnd]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   107
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   108
  Example showing how arguments may be passed to futures.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   109
								    [exBegin]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   110
    | temp |
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   111
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   112
    temp := [:x :y | 10 * x * y] futureValue: 3 value: 4.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   113
    Transcript  showCR: temp printString.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   114
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   115
								    [exEnd]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   116
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   117
  Claus:
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   118
    The above examples do not really show the power of Futures;
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   119
    they can be useful, whenever some long-time computation is
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   120
    to be done, and some other useful work can be done in the meanwhile.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   121
    for example:
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   122
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   123
    Here, the input is read before - the readTime and view creation
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   124
    times sum up:
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   125
								    [exBegin]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   126
	|p text v|
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   127
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   128
	p := PipeStream readingFrom:'ls -l /bin /usr/bin /usr/lib'.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   129
	text := p contents.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   130
	p close.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   131
	v := TextView new openAndWait.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   132
	v contents:text
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   133
								    [exEnd]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   134
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   135
    The same here:
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   136
								    [exBegin]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   137
	|p text v|
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   138
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   139
	v := TextView new openAndWait.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   140
	p := PipeStream readingFrom:'ls -l /bin /usr/bin /usr/lib'.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   141
	text := p contents.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   142
	p close.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   143
	v contents:text
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   144
								    [exEnd]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   145
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   146
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   147
    Here, the view creation and reading are done in parallel:
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   148
    (if the user is slow when opening the view, the contents may
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   149
     be already available)
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   150
								    [exBegin]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   151
	|p text v|
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   152
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   153
	text := [   |p t|
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   154
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   155
		    p := PipeStream readingFrom:'ls -l /bin /usr/bin /usr/lib'.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   156
		    t := p contents.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   157
		    p close.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   158
		    t
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   159
		] futureValue.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   160
	v := TextView new openAndWait.
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   161
	v contents:text
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   162
								    [exEnd]
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   163
"
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   164
!
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   165
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   166
version
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   167
    ^ '$Header: /cvs/stx/stx/libbasic2/Future.st,v 1.5 1997-01-16 13:45:49 cg Exp $'
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   168
! !
d50c08ae6e3d documentation
Claus Gittinger <cg@exept.de>
parents: 457
diff changeset
   169
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   170
!Future methodsFor: 'synchronising'!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   171
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   172
doesNotUnderstand: aMessage
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   173
	"Any message to a Future will end up here."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   174
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   175
	semaphore wait.     "Wait for evaluation to complete"
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   176
			    "(if not already completed)"
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   177
	semaphore signal.   "Wake up anything else that might be waiting"
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   178
	^result perform: aMessage selector 
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   179
		withArguments: aMessage arguments
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   180
! !
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   181
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   182
!Future methodsFor: 'evaluating'!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   183
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   184
block: aBlock
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   185
	"Execute aBlock in parallel with whatever called me, but
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   186
	 ensure that any messages sent to me before execution
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   187
	 of the block has terminated are suspended until it has terminated."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   188
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   189
	semaphore := Semaphore new.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   190
	[result := aBlock value.  semaphore signal] fork
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   191
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   192
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   193
block: aBlock value: aValue
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   194
	"Execute aBlock in parallel with whatever called me, but
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   195
	 ensure that any messages sent to me before execution
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   196
	 of the block has terminated are suspended until it has terminated."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   197
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   198
	semaphore := Semaphore new.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   199
	[result := aBlock value: aValue.  semaphore signal] fork
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   200
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   201
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   202
block: aBlock value: value1 value: value2
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   203
	"Execute aBlock in parallel with whatever called me, but
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   204
	 ensure that any messages sent to me before execution
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   205
	 of the block has terminated are suspended until it has terminated."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   206
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   207
	semaphore := Semaphore new.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   208
	[result := aBlock value: value1 value: value2.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   209
	 semaphore signal] fork
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   210
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   211
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   212
block: aBlock value: value1 value: value2 value: value3
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   213
	"Execute aBlock in parallel with whatever called me, but
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   214
	 ensure that any messages sent to me before execution
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   215
	 of the block has terminated are suspended until it has terminated."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   216
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   217
	semaphore := Semaphore new.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   218
	[result := aBlock value: value1 value: value2 value: value3.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   219
	 semaphore signal] fork
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   220
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   221
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   222
block: aBlock valueWithArguments: anArray
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   223
	"Execute aBlock in parallel with whatever called me, but
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   224
	 ensure that any messages sent to me before execution
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   225
	 of the block has terminated are suspended until it has terminated."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   226
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   227
	semaphore := Semaphore new.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   228
	[result := aBlock valueWithArguments: anArray.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   229
	 semaphore signal] fork
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   230
! !
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   231
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   232
!Future class methodsFor: 'class initialization'!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   233
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   234
initialize
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   235
	"must avoid the checks"
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   236
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   237
	superclass := nil
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   238
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   239
	"Future initialize."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   240
! !
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   241
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   242
Future initialize!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   243
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   244
!Block methodsFor: 'parallel evaluation'!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   245
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   246
futureValue
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   247
	"Fork a synchronised evaluation of myself. Starts the
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   248
	 evaluation in parallel immediately."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   249
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   250
	^Future new block: self
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   251
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   252
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   253
futureValue: aValue
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   254
	"Fork a synchronised evaluation of myself. Starts the
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   255
	 evaluation in parallel immediately."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   256
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   257
	^Future new block: self value: aValue
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   258
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   259
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   260
futureValue: aValue value: anotherValue
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   261
	"Fork a synchronised evaluation of myself. Starts the
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   262
	 evaluation in parallel immediately."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   263
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   264
	^Future new block: self value: aValue value: anotherValue
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   265
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   266
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   267
futureValue: aValue value: anotherValue value: bValue
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   268
	"Fork a synchronised evaluation of myself. Starts the
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   269
	 evaluation in parallel immediately."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   270
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   271
	^Future new block: self value: aValue value: anotherValue value: bValue
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   272
!
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   273
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   274
futureValueWithArguments: anArray
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   275
	"Fork a synchronised evaluation of myself. Starts the
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   276
	 evaluation in parallel immediately."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   277
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   278
	^Future new block: self valueWithArguments: anArray
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   279
! 
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   280
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   281
parallelAnd: aBlock 
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   282
	"Executes the receiver in parallel with aBlock. Once both   
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   283
	 have completed, perform a logical AND operation."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   284
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   285
	| first second |
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   286
	first := self futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   287
	second := aBlock futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   288
	^first touch & second touch!
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   289
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   290
parallelEqv: aBlock 
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   291
	"Executes the receiver in parallel with aBlock. Once both   
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   292
	 have completed, perform a logical equivalence (exclusive-NOR)
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   293
	 operation."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   294
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   295
	| first second |
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   296
	first := self futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   297
	second := aBlock futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   298
	^first touch eqv: second touch!
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   299
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   300
parallelOr: aBlock 
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   301
	"Executes the receiver in parallel with aBlock. Once both   
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   302
	 have completed, perform a logical OR operation."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   303
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   304
	| first second |
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   305
	first := self futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   306
	second := aBlock futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   307
	^first touch | second touch!
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   308
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   309
parallelPerform: aSymbol with: aBlock 
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   310
	"Executes the receiver in parallel with aBlock. Once both  
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   311
	 have completed, perform the operation given by aSymbol."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   312
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   313
	| first second |
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   314
	first := self futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   315
	second := aBlock futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   316
	^first touch perform: aSymbol with: second touch!
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   317
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   318
parallelXor: aBlock 
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   319
	"Executes the receiver in parallel with aBlock. Once both   
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   320
	 have completed, perform a logical equivalence (exclusive-NOR)
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   321
	 operation."
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   322
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   323
	| first second |
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   324
	first := self futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   325
	second := aBlock futureValue.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   326
	^first touch xor: second touch
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   327
! !
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   328
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   329
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   330
"COPYRIGHT.
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   331
 The above file is a Manchester Goodie protected by copyright.
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   332
 These conditions are imposed on the whole Goodie, and on any significant
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   333
 part of it which is separately transmitted or stored:
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   334
	* You must ensure that every copy includes this notice, and that
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   335
	  source and author(s) of the material are acknowledged.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   336
	* These conditions must be imposed on anyone who receives a copy.
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   337
	* The material shall not be used for commercial gain without the prior
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   338
	  written consent of the author(s).
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   339
 Further information on the copyright conditions may be obtained by
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   340
 sending electronic mail:
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   341
	To: goodies-lib@cs.man.ac.uk
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   342
	Subject: copyright
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   343
 or by writing to The Smalltalk Goodies Library Manager, Dept of
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   344
 Computer Science, The University, Manchester M13 9PL, UK
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   345
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   346
 (C) Copyright 1992 University of Manchester
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   347
 For more information about the Manchester Goodies Library (from which 
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   348
 this file was distributed) send e-mail:
67
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   349
	To: goodies-lib@cs.man.ac.uk
6d8a403eff0a *** empty log message ***
claus
parents: 62
diff changeset
   350
	Subject: help 
62
a759b5c72c98 Initial revision
claus
parents:
diff changeset
   351
"!