Start keys and primary keys are purposely designed to be interchangeable.
Many programs no longer have to handle any page keys.
In many cases the parameter string and argument string do not have to be copied by the user.
No general key slot is needed to hold the parameter page key.
Sympathetic domains can share parameter pages. This cuts the cost of some of the terminal domain clusters, such as terminal support systems {(p2,tssc)}, by a factor of three.
Another solution is to invent a new kind of resume key, called a null resume key. When a jumpee's indicated parameter address required calling a segment keeper, the jumpee would be made busy, the segment keeper would get a null resume key to the jumpee and the jumper would be left with its process. When a null resume key is jumped to, the jumpee is made available and no process is left there. This would, in turn, cause the original jumper to retry the original jump. If a null resume key is jumped to with a nonzero code, that code is placed in the trap code of the designated domain.
The external returner might use this resume key to get a prompt space bank that would be used to support the cost of keeping the string.
This might involve a difficult recursion problem -- the space bank may use the external returner who uses the space bank.
A similar strategy would be to have a class of external returners. The kernel would find a key to a returner in the jumpee's domain root. Such a returner would have to be somehow manifestly prompt to the kernel.
It turns out in this case that a small change to this keeper overcame this deficiency.
I think the keeper FSX doesn't have this undesirable property.
Other segment keepers have been invented but not written {(p3,expseg)} that must make pages go for long periods of time.
If the restart key is used to attempt to trap the referencer, the signal is lost.
There would be a new state, X, for a domain that would presumably be a variant on the waiting state.
When a gate jump is impeded by a parameter string that occupies an absent or read-only page and there is a segment keeper, the jumpee is put into state X, a restart key to the jumper is placed in some newly allocated slot of the jumpee, and a fault key to the jumpee is provided to the segment keeper.
When a resume key is used to jump to a domain in state X the jump is to the resume key found therein instead, but first any fault code is installed in the jumpee.
See (parmfault) for another idea.
Presume two new kinds of resume key, the available resume key and the waiting resume key collectively called "idle resume keys". Resume keys that are not idle resume keys {old style resume keys} are called "running resume keys". Presume also a superwaiting state of a domain. {Slot 13 holds DK(2).} Changes to the kernel specification are:
If a jump is made to domain D and the argument string requires a part of the parameter string that cannot be stored into D's address segment, and a segmnet keeper might fix this situation then: an available or waiting resume key {depending on whether D was available or waiting} is produced to D for the segment keeper, and D is placed in the superwaiting state,
Start keys and running resume keys cannot enter superwaiting domains. The jumper becomes stalled instead.
When an {available or waiting} resume key is used to jump to a domain D, the order code {of the jump} becomes D's trap code {replacing the old trap code}. D becomes available or waiting. {Using idle resume keys does not cause resume keys to be destroyed.} Domains enqueued on D are awakened.
C gets a waiting resume key WE for D. After consideration C decides that no store should be allowed and invokes WE with an order code indicating refusal.
The order code becomes B's trap code and B changes to "waiting".
A is awakened and reinvokes the resume key to B.
We now have a invocation of a waiting domain with a trap code. B's domain keeper D is called with a waiting resume key WE to B.
D sees in B the trap code provided by the segment keeper. If D is DDT a status command might indicate that the domain was superbusy {slot 13 holds DK(2)}.
If a user should type ";n" DDT would try to invoke the resume key WE. This would change D to the waiting state and unstall A.
If the problem with the segment keeper had been overcome {segment replaced or some such} A would reinvoke its resume key and we should be off and running just as we should.
If the original problem was not fixed we would again appear to fault on the SVC.
It seems natural that invocations of idle resume keys should zap all copies of idle resume keys. I know of no economical way to do this.
Extending the limit much beyond 4096 seems to require that the jump no longer be a single unit of operation.
Programs to monitor traffic at a gate would either become slow or complex.
Domains would have a new state of having partially emitted or absorbed a parameter string. Two domains would somehow have to be bound together, presumably with keys, to ensure the integrity of the jump. The relationship of such domain with other gate keys would have to be determined.
We might provide a type of jump that would make the domain act as if it were sending or receiving a long string in contiguous storage via byte stream conventions. The advantage over byte streams is that when the kernel encountered a jumper and jumpee both using this of jump, more than a single page of data might be copied at once.
We do not see the end of the ramifications of this idea.
See {(p3,ejp)} for a protocol that allows domains to pass long strings and many keys.
Limitations
Neither parameter strings nor argument strings may use more than one page.
{arcane}See also (p1,strdes) and (p1,whyreal) for information on pathologies of string jumps.