Progress chapter contains:
Each UPC++ function’s contract to the user contains its progress guarantee level. ...
For the user, understanding which functions perform these progress spins becomes crucial, since any invocation of user-level progress may execute rpcs or local callbacks.
Elsewhere there is wording like:
Serialization/deserialization may not call any UPC++ routine with a progress level other than none.
However, the progress contract currently only appears to be unambiguously specified for progress(), discharge() and flush(). If the intent is something like "when not explicitly stated all other functions have a progress level X", then this needs to be clearly and directly stated somewhere.
There's currently some imprecise wording about the "most common progress guarantee made by UPC++ functions", but that doesn't answer the question of the exact progress guarantee of any particular function whose API ref says nothing about progress.
In particular, I'd like to know the progress guarantee level of rput and rget initiation. For example, if an rput or rget RMA completes synchronously inside the initiation call (eg because the global_ptr was local()), is that initiation permitted to fulfill promises and fire callbacks before returning?
Same question if RMA injection encounters network backpressure.
Same question for loopback rpc injection or lpc to an active persona.
Related question for
dist_objectconstructors, which says:The verb "fire" here does not appear to be formally defined. Does that mean that user code in
.then()continuations chained on futures created bywhen_localmight actually run before the dist_object constructor returns? Or only that promises are fulfilled and chained callbacks will run within the nextprogress(progress_level_user)?Assuming the former, does that mean the dist_object constructor has a progress-level of user, implying that other, completely-unrelated callbacks in the ready state for active personas may also execute?