A method and apparatus for preventing the occurrence of deadlocks from the
execution of unresolvable system bus operations. In general, each snooper
speculatively accepts a given operation when it has a snoop buffer
available. However, rather than unconditionally processing the operation,
the snooper waits to determine if another participant retried the
operation due to unavailability of a snoop buffer. If some snooping
participant retrys an operation, all snoopers that speculatively accepted
an operation for processing abandon said operation. If no snooping
participant retrys the operation, sufficient snooping resources were
available for all necessary caches to begin processing the operation and
the initiator can consider the operation completed. In other words, no
operation is processed until all the necessary snooping resources are
available to accept the operation. This prevents the system from getting
into the ping-pong deadlock. Snoopers can safely assume that each
presentation of an operation must be propagated and that no operation will
have been fully or partially processed by some other snooper. The
operation cannot proceed until all of the available resources are
available and once available, the operation is propagated only once by
those snooping resources.