The Preemption Discipline resource attribute specifies whether a higher priority transaction can preempt a server processing lower priority transactions. This resource attribute has two possible values: Allow_Preemption and Dont_Preempt.
If preemption is enabled and the Queue Discipline resource attribute is set to Last_In_First_Out (LIFO), then transactions can preempt other transactions of equal or lower priority. When the Queue Discipline is First_In_First_Out (FIFO), equal priority transactions cannot be preempted, only strictly lower priorities will be preempted.
If the number of servers is greater than one, the servers are searched to determine which is processing the lowest priority transaction. If there is only one, it is preempted. If there are more than one, one server is preempted. When transactions are preempted, if the Server Mechanism is either Round_Robin or Processor_Sharing and another server is processing the same priority as the server that was preempted, the transactions that were being processed by the preempted server will share the other server(s) processing the same priority.
If preempted transaction(s) cannot share another server, they are dealt with based on their Preempt Response. The Preempt Response is a transaction attribute that can be Resume, Restart, or Discard. Transactions with their preempt response set to Resume are placed back in the queue with their remaining service time set to their original service time required minus the service time they accumulated prior to being preempted plus the value of the Resume Overhead transaction attribute.
The Resume Overhead specifies the wasted service time when a preempted transaction resumes service. If a preempted transaction’s preempt response attribute is Restart, the transaction is placed back in the queue, and its remaining service time is set equal to the original service time required by the transaction. Finally, if the preempt response is Reject, a rejected transaction’s associated data structure (from the InArbitraryDS input) is sent out the RejectDS output at the Service block it originally entered.