UnixWare:
"qprocsoff disabled the put(D2str) and srv(D2str) routines of the driver or
module whose read queue is pointed to by rq. It removes the queue's service
routines from the list of service routines to be run and waits until any
concurrent put or srv procedures are finished. When the routines are
disabled in a module, messages flow around the module as if it were not
present in the stream.
Interesting semantics. They don't say what happens to the messages if the routines are for a driver rather than a pushable module.
qprocsoff must be called by the close(D2str) routine of a driver or module
before deallocating any resources on which the driver/module's put() and
srv() routines depend. Drivers or modules should call qprocsoff exactly
once to disable put and service procedures. One additional effect of
calling qprocsoff is that both the read and write queues are flushed."
My point precisely. The routine is called exactly once, from the driver/module close routine.
If the module's close routine is being called it is because the stream is being dismantled, so there is no point in jumping through hoops to route messages around the module.
The other possibility is that an I_POP is being executed, which I hope has enough lock protection that messages cannot flow into the module during this operation.
As I said before, "Works as implemented."
-- Dave
