@@ -20,6 +20,8 @@ mutable struct Future <: AbstractRemoteRef
2020
2121 Future (w:: Int , rrid:: RRID ) = Future (w, rrid, Nullable {Any} ())
2222 Future (w:: Int , rrid:: RRID , v) = (r = new (w,rrid. whence,rrid. id,v); return test_existing_ref (r))
23+
24+ Future (t:: Tuple ) = new (t[1 ],t[2 ],t[3 ],t[4 ]) # Useful for creating dummy, zeroed-out instances
2325end
2426
2527mutable struct RemoteChannel{T<: AbstractChannel } <: AbstractRemoteRef
@@ -31,6 +33,10 @@ mutable struct RemoteChannel{T<:AbstractChannel} <: AbstractRemoteRef
3133 r = new (w, rrid. whence, rrid. id)
3234 return test_existing_ref (r)
3335 end
36+
37+ function RemoteChannel {T} (t:: Tuple ) where T<: AbstractChannel
38+ return new (t[1 ],t[2 ],t[3 ])
39+ end
3440end
3541
3642function test_existing_ref (r:: AbstractRemoteRef )
@@ -273,29 +279,29 @@ end
273279
274280channel_type (rr:: RemoteChannel{T} ) where {T} = T
275281
276- serialize (s:: AbstractSerializer , f:: Future ) = serialize (s, f, isnull (f. v))
277- serialize (s:: AbstractSerializer , rr:: RemoteChannel ) = serialize (s, rr, true )
278- function serialize (s:: AbstractSerializer , rr:: AbstractRemoteRef , addclient)
282+ serialize (s:: ClusterSerializer , f:: Future ) = serialize (s, f, isnull (f. v))
283+ serialize (s:: ClusterSerializer , rr:: RemoteChannel ) = serialize (s, rr, true )
284+ function serialize (s:: ClusterSerializer , rr:: AbstractRemoteRef , addclient)
279285 if addclient
280286 p = worker_id_from_socket (s. io)
281287 (p != = rr. where) && send_add_client (rr, p)
282288 end
283- invoke (serialize, Tuple{AbstractSerializer , Any}, s, rr)
289+ invoke (serialize, Tuple{ClusterSerializer , Any}, s, rr)
284290end
285291
286- function deserialize (s:: AbstractSerializer , t:: Type{<:Future} )
292+ function deserialize (s:: ClusterSerializer , t:: Type{<:Future} )
287293 f = deserialize_rr (s,t)
288294 Future (f. where, RRID (f. whence, f. id), f. v) # ctor adds to client_refs table
289295end
290296
291- function deserialize (s:: AbstractSerializer , t:: Type{<:RemoteChannel} )
297+ function deserialize (s:: ClusterSerializer , t:: Type{<:RemoteChannel} )
292298 rr = deserialize_rr (s,t)
293299 # call ctor to make sure this rr gets added to the client_refs table
294300 RemoteChannel {channel_type(rr)} (rr. where, RRID (rr. whence, rr. id))
295301end
296302
297303function deserialize_rr (s, t)
298- rr = invoke (deserialize, Tuple{AbstractSerializer , DataType}, s, t)
304+ rr = invoke (deserialize, Tuple{ClusterSerializer , DataType}, s, t)
299305 if rr. where == myid ()
300306 # send_add_client() is not executed when the ref is being
301307 # serialized to where it exists
@@ -304,6 +310,18 @@ function deserialize_rr(s, t)
304310 rr
305311end
306312
313+ # Future and RemoteChannel are serializable only in a running cluster.
314+ # Serialize zeroed-out values to non ClusterSerializer objects
315+ function serialize (s:: AbstractSerializer , :: Future )
316+ zero_fut = Future ((0 ,0 ,0 ,Nullable {Any} ()))
317+ invoke (serialize, Tuple{AbstractSerializer, Any}, s, zero_fut)
318+ end
319+
320+ function serialize (s:: AbstractSerializer , :: RemoteChannel )
321+ zero_rc = RemoteChannel {Channel{Any}} ((0 ,0 ,0 ))
322+ invoke (serialize, Tuple{AbstractSerializer, Any}, s, zero_rc)
323+ end
324+
307325
308326# make a thunk to call f on args in a way that simulates what would happen if
309327# the function were sent elsewhere
0 commit comments