@@ -214,7 +214,7 @@ def zip_futures(*futures_and_or_events)
214
214
# @param [AbstractEventFuture] futures_and_or_events
215
215
# @return [Future]
216
216
def zip_futures_on ( default_executor , *futures_and_or_events )
217
- ZipFuturesPromise . new ( futures_and_or_events , default_executor ) . future
217
+ ZipFuturesPromise . new_blocked ( futures_and_or_events , futures_and_or_events , default_executor ) . future
218
218
end
219
219
220
220
alias_method :zip , :zip_futures
@@ -232,7 +232,7 @@ def zip_events(*futures_and_or_events)
232
232
# @param [AbstractEventFuture] futures_and_or_events
233
233
# @return [Event]
234
234
def zip_events_on ( default_executor , *futures_and_or_events )
235
- ZipEventsPromise . new ( futures_and_or_events , default_executor ) . future
235
+ ZipEventsPromise . new_blocked ( futures_and_or_events , futures_and_or_events , default_executor ) . future
236
236
end
237
237
238
238
# @!macro promises.shortcut.on
@@ -254,7 +254,7 @@ def any_resolved_future(*futures_and_or_events)
254
254
# @param [AbstractEventFuture] futures_and_or_events
255
255
# @return [Future]
256
256
def any_resolved_future_on ( default_executor , *futures_and_or_events )
257
- AnyResolvedFuturePromise . new ( futures_and_or_events , default_executor ) . future
257
+ AnyResolvedFuturePromise . new_blocked ( futures_and_or_events , futures_and_or_events , default_executor ) . future
258
258
end
259
259
260
260
# @!macro promises.shortcut.on
@@ -273,7 +273,7 @@ def any_fulfilled_future(*futures_and_or_events)
273
273
# @param [AbstractEventFuture] futures_and_or_events
274
274
# @return [Future]
275
275
def any_fulfilled_future_on ( default_executor , *futures_and_or_events )
276
- AnyFulfilledFuturePromise . new ( futures_and_or_events , default_executor ) . future
276
+ AnyFulfilledFuturePromise . new_blocked ( futures_and_or_events , futures_and_or_events , default_executor ) . future
277
277
end
278
278
279
279
# @!macro promises.shortcut.on
@@ -580,7 +580,7 @@ def chain(*args, &task)
580
580
# @overload a_future.chain_on(executor, *args, &task)
581
581
# @yield [fulfilled?, value, reason, *args] to the task.
582
582
def chain_on ( executor , *args , &task )
583
- ChainPromise . new ( self , @DefaultExecutor , executor , args , &task ) . future
583
+ ChainPromise . new_blocked ( [ self ] , self , @DefaultExecutor , executor , args , &task ) . future
584
584
end
585
585
586
586
# Short string representation.
@@ -782,9 +782,9 @@ class Event < AbstractEventFuture
782
782
# @return [Future, Event]
783
783
def zip ( other )
784
784
if other . is_a? ( Future )
785
- ZipFutureEventPromise . new ( other , self , @DefaultExecutor ) . future
785
+ ZipFutureEventPromise . new_blocked ( [ other , self ] , other , self , @DefaultExecutor ) . future
786
786
else
787
- ZipEventEventPromise . new ( self , other , @DefaultExecutor ) . event
787
+ ZipEventEventPromise . new_blocked ( [ self , other ] , self , other , @DefaultExecutor ) . event
788
788
end
789
789
end
790
790
@@ -795,7 +795,7 @@ def zip(other)
795
795
#
796
796
# @return [Event]
797
797
def any ( event_or_future )
798
- AnyResolvedEventPromise . new ( [ self , event_or_future ] , @DefaultExecutor ) . event
798
+ AnyResolvedEventPromise . new_blocked ( [ self , event_or_future ] , [ self , event_or_future ] , @DefaultExecutor ) . event
799
799
end
800
800
801
801
alias_method :| , :any
@@ -805,9 +805,11 @@ def any(event_or_future)
805
805
#
806
806
# @return [Event]
807
807
def delay
808
- ZipEventEventPromise . new ( self ,
809
- DelayPromise . new ( @DefaultExecutor ) . event ,
810
- @DefaultExecutor ) . event
808
+ event = DelayPromise . new ( @DefaultExecutor ) . event
809
+ ZipEventEventPromise . new_blocked ( [ self , event ] ,
810
+ self ,
811
+ event ,
812
+ @DefaultExecutor ) . event
811
813
end
812
814
813
815
# @!macro [new] promise.method.schedule
@@ -819,9 +821,11 @@ def delay
819
821
# @return [Event]
820
822
def schedule ( intended_time )
821
823
chain do
822
- ZipEventEventPromise . new ( self ,
823
- ScheduledPromise . new ( @DefaultExecutor , intended_time ) . event ,
824
- @DefaultExecutor ) . event
824
+ event = ScheduledPromise . new ( @DefaultExecutor , intended_time ) . event
825
+ ZipEventEventPromise . new_blocked ( [ self , event ] ,
826
+ self ,
827
+ event ,
828
+ @DefaultExecutor ) . event
825
829
end . flat_event
826
830
end
827
831
@@ -956,7 +960,7 @@ def then(*args, &task)
956
960
# @return [Future]
957
961
# @yield [value, *args] to the task.
958
962
def then_on ( executor , *args , &task )
959
- ThenPromise . new ( self , @DefaultExecutor , executor , args , &task ) . future
963
+ ThenPromise . new_blocked ( [ self ] , self , @DefaultExecutor , executor , args , &task ) . future
960
964
end
961
965
962
966
# @!macro promises.shortcut.on
@@ -974,16 +978,16 @@ def rescue(*args, &task)
974
978
# @return [Future]
975
979
# @yield [reason, *args] to the task.
976
980
def rescue_on ( executor , *args , &task )
977
- RescuePromise . new ( self , @DefaultExecutor , executor , args , &task ) . future
981
+ RescuePromise . new_blocked ( [ self ] , self , @DefaultExecutor , executor , args , &task ) . future
978
982
end
979
983
980
984
# @!macro promises.method.zip
981
985
# @return [Future]
982
986
def zip ( other )
983
987
if other . is_a? ( Future )
984
- ZipFutureFuturePromise . new ( self , other , @DefaultExecutor ) . future
988
+ ZipFutureFuturePromise . new_blocked ( [ self , other ] , self , other , @DefaultExecutor ) . future
985
989
else
986
- ZipFutureEventPromise . new ( self , other , @DefaultExecutor ) . future
990
+ ZipFutureEventPromise . new_blocked ( [ self , other ] , self , other , @DefaultExecutor ) . future
987
991
end
988
992
end
989
993
@@ -995,7 +999,7 @@ def zip(other)
995
999
#
996
1000
# @return [Future]
997
1001
def any ( event_or_future )
998
- AnyResolvedFuturePromise . new ( [ self , event_or_future ] , @DefaultExecutor ) . future
1002
+ AnyResolvedFuturePromise . new_blocked ( [ self , event_or_future ] , [ self , event_or_future ] , @DefaultExecutor ) . future
999
1003
end
1000
1004
1001
1005
alias_method :| , :any
@@ -1005,25 +1009,29 @@ def any(event_or_future)
1005
1009
#
1006
1010
# @return [Future]
1007
1011
def delay
1008
- ZipFutureEventPromise . new ( self ,
1009
- DelayPromise . new ( @DefaultExecutor ) . future ,
1010
- @DefaultExecutor ) . future
1012
+ future = DelayPromise . new ( @DefaultExecutor ) . future
1013
+ ZipFutureEventPromise . new_blocked ( [ self , future ] ,
1014
+ self ,
1015
+ future ,
1016
+ @DefaultExecutor ) . future
1011
1017
end
1012
1018
1013
1019
# @!macro promise.method.schedule
1014
1020
# @return [Future]
1015
1021
def schedule ( intended_time )
1016
1022
chain do
1017
- ZipFutureEventPromise . new ( self ,
1018
- ScheduledPromise . new ( @DefaultExecutor , intended_time ) . event ,
1019
- @DefaultExecutor ) . future
1023
+ event = ScheduledPromise . new ( @DefaultExecutor , intended_time ) . event
1024
+ ZipFutureEventPromise . new_blocked ( [ self , event ] ,
1025
+ self ,
1026
+ event ,
1027
+ @DefaultExecutor ) . future
1020
1028
end . flat
1021
1029
end
1022
1030
1023
1031
# @!macro promises.method.with_default_executor
1024
1032
# @return [Future]
1025
1033
def with_default_executor ( executor )
1026
- FutureWrapperPromise . new ( self , executor ) . future
1034
+ FutureWrapperPromise . new_blocked ( [ self ] , self , executor ) . future
1027
1035
end
1028
1036
1029
1037
# Creates new future which will have result of the future returned by receiver. If receiver
@@ -1032,7 +1040,7 @@ def with_default_executor(executor)
1032
1040
# @param [Integer] level how many levels of futures should flatten
1033
1041
# @return [Future]
1034
1042
def flat_future ( level = 1 )
1035
- FlatFuturePromise . new ( self , level , @DefaultExecutor ) . future
1043
+ FlatFuturePromise . new_blocked ( [ self ] , self , level , @DefaultExecutor ) . future
1036
1044
end
1037
1045
1038
1046
alias_method :flat , :flat_future
@@ -1042,7 +1050,7 @@ def flat_future(level = 1)
1042
1050
#
1043
1051
# @return [Event]
1044
1052
def flat_event
1045
- FlatEventPromise . new ( self , @DefaultExecutor ) . event
1053
+ FlatEventPromise . new_blocked ( [ self ] , self , @DefaultExecutor ) . event
1046
1054
end
1047
1055
1048
1056
# @!macro promises.shortcut.using
@@ -1116,7 +1124,7 @@ def on_rejection_using(executor, *args, &callback)
1116
1124
# end
1117
1125
# future(0, &body).run.value! # => 5
1118
1126
def run
1119
- RunFuturePromise . new ( self , @DefaultExecutor ) . future
1127
+ RunFuturePromise . new_blocked ( [ self ] , self , @DefaultExecutor ) . future
1120
1128
end
1121
1129
1122
1130
# @!visibility private
@@ -1211,7 +1219,7 @@ def resolve(raise_on_reassign = true)
1211
1219
#
1212
1220
# @return [Event]
1213
1221
def with_hidden_resolvable
1214
- @with_hidden_resolvable ||= EventWrapperPromise . new ( self , @DefaultExecutor ) . event
1222
+ @with_hidden_resolvable ||= EventWrapperPromise . new_blocked ( [ self ] , self , @DefaultExecutor ) . event
1215
1223
end
1216
1224
end
1217
1225
@@ -1224,7 +1232,6 @@ class ResolvableFuture < Future
1224
1232
#
1225
1233
# @!macro promise.param.raise_on_reassign
1226
1234
def resolve ( fulfilled = true , value = nil , reason = nil , raise_on_reassign = true )
1227
- # TODO (pitr-ch 25-Sep-2016): should the defaults be kept to match event resolve api?
1228
1235
resolve_with ( fulfilled ? Fulfilled . new ( value ) : Rejected . new ( reason ) , raise_on_reassign )
1229
1236
end
1230
1237
@@ -1268,7 +1275,7 @@ def evaluate_to!(*args, &block)
1268
1275
#
1269
1276
# @return [Future]
1270
1277
def with_hidden_resolvable
1271
- @with_hidden_resolvable ||= FutureWrapperPromise . new ( self , @DefaultExecutor ) . future
1278
+ @with_hidden_resolvable ||= FutureWrapperPromise . new_blocked ( [ self ] , self , @DefaultExecutor ) . future
1272
1279
end
1273
1280
end
1274
1281
@@ -1360,10 +1367,13 @@ class InnerPromise < AbstractPromise
1360
1367
# @abstract
1361
1368
class BlockedPromise < InnerPromise
1362
1369
# @!visibility private
1363
- def self . new ( *args , &block )
1364
- promise = super ( *args , &block )
1365
- promise . blocked_by . each { |f | f . add_callback :callback_notify_blocked , promise }
1366
- promise
1370
+
1371
+ private_class_method :new
1372
+
1373
+ def self . new_blocked ( blockers , *args , &block )
1374
+ promise = new ( *args , &block )
1375
+ ensure
1376
+ blockers . each { |f | f . add_callback :callback_notify_blocked , promise }
1367
1377
end
1368
1378
1369
1379
def initialize ( future , blocked_by_futures , countdown )
@@ -1925,7 +1935,8 @@ class Future < AbstractEventFuture
1925
1935
# Zips with selected value form the suplied channels
1926
1936
# @return [Future]
1927
1937
def then_select ( *channels )
1928
- ZipFuturesPromise . new ( [ self , Concurrent ::Promises . select ( *channels ) ] , @DefaultExecutor ) . future
1938
+ future = Concurrent ::Promises . select ( *channels )
1939
+ ZipFuturesPromise . new_blocked ( [ self , future ] , [ self , future ] , @DefaultExecutor ) . future
1929
1940
end
1930
1941
1931
1942
# @note may block
0 commit comments