home *** CD-ROM | disk | FTP | other *** search
Wrap
ppppuuuutttt((((DDDD2222)))) ppppuuuutttt((((DDDD2222)))) NNNNAAAAMMMMEEEE _pppp_uuuu_tttt - receive messages from the preceding queue SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS _####_iiii_nnnn_cccc_llll_uuuu_dddd_eeee _<<<<_ssss_yyyy_ssss_////_tttt_yyyy_pppp_eeee_ssss_...._hhhh_>>>> _####_iiii_nnnn_cccc_llll_uuuu_dddd_eeee _<<<<_ssss_yyyy_ssss_////_ssss_tttt_rrrr_eeee_aaaa_mmmm_...._hhhh_>>>> _####_iiii_nnnn_cccc_llll_uuuu_dddd_eeee _<<<<_ssss_yyyy_ssss_////_ssss_tttt_rrrr_oooo_pppp_tttt_ssss_...._hhhh_>>>> _####_iiii_nnnn_cccc_llll_uuuu_dddd_eeee _<<<<_ssss_yyyy_ssss_////_dddd_dddd_iiii_...._hhhh_>>>> _iiii_nnnn_tttt _p_r_e_f_i_x_rrrr_pppp_uuuu_tttt_((((_qqqq_uuuu_eeee_uuuu_eeee______tttt _****_q_,,,, _mmmm_bbbb_llll_kkkk______tttt _****_m_p_))))_;;;; _////_**** _rrrr_eeee_aaaa_dddd _ssss_iiii_dddd_eeee _****_//// _iiii_nnnn_tttt _p_r_e_f_i_x_wwww_pppp_uuuu_tttt_((((_qqqq_uuuu_eeee_uuuu_eeee______tttt _****_q_,,,, _mmmm_bbbb_llll_kkkk______tttt _****_m_p_))))_;;;; _////_**** _wwww_rrrr_iiii_tttt_eeee _ssss_iiii_dddd_eeee _****_//// AAAArrrrgggguuuummmmeeeennnnttttssss _q Pointer to the queue. _m_p Pointer to the message block. DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN The primary task of the _pppp_uuuu_tttt routine is to coordinate the passing of messages from one queue to the next in a stream. The _pppp_uuuu_tttt routine is called by the preceding component (module, driver, or stream head) in the stream. _pppp_uuuu_tttt routines are designated ``write'' or ``read'' depending on the direction of message flow. RRRReeeettttuuuurrrrnnnn VVVVaaaalllluuuueeeessss Ignored UUUUSSSSAAAAGGGGEEEE This entry point is required in all STREAMS drivers and modules. Both modules and drivers must have write _pppp_uuuu_tttt routines. Modules must have read _pppp_uuuu_tttt routines, but drivers don't really need them because their interrupt handler can do the work intended for the read _pppp_uuuu_tttt routine. A message is passed to the _pppp_uuuu_tttt routine. If immediate processing is desired, the _pppp_uuuu_tttt routine can process the message, or it can enqueue it so that the service routine [see _ssss_rrrr_vvvv(D2)] can process it later. The _pppp_uuuu_tttt routine must do at least one of the following when it receives a message: pass the message to the next component in the stream by calling the _pppp_uuuu_tttt_nnnn_eeee_xxxx_tttt(D3) function process the message, if immediate processing is required (for example, high priority messages) enqueue the message with the _pppp_uuuu_tttt_qqqq(D3) function for deferred processing by the service routine Typically, the _pppp_uuuu_tttt routine will switch on the message type, which is contained in _mmmm_pppp_----_>>>>_bbbb______dddd_aaaa_tttt_aaaa_pppp_----_>>>>_dddd_bbbb______tttt_yyyy_pppp_eeee, taking different actions depending on the message type. For example, a _pppp_uuuu_tttt routine might process high priority messages and enqueue normal messages. PPPPaaaaggggeeee 1111 ppppuuuutttt((((DDDD2222)))) ppppuuuutttt((((DDDD2222)))) The _pppp_uuuu_tttt_qqqq function can be used as a module's _pppp_uuuu_tttt routine when no special processing is required and all messages are to be enqueued for the service routine. Although it can be done in the service routine, drivers and modules usually handle queue flushing in their _pppp_uuuu_tttt routines. The canonical flushing algorithm for driver write put routines is as follows: _qqqq_uuuu_eeee_uuuu_eeee______tttt _****_qqqq_;;;; _////_**** _tttt_hhhh_eeee _wwww_rrrr_iiii_tttt_eeee _qqqq_uuuu_eeee_uuuu_eeee _****_//// _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_BBBB_AAAA_NNNN_DDDD_)))) _{{{{ _////_**** _iiii_ffff _dddd_rrrr_iiii_vvvv_eeee_rrrr _rrrr_eeee_cccc_oooo_gggg_nnnn_iiii_zzzz_eeee_ssss _bbbb_aaaa_nnnn_dddd_ssss _****_//// _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_WWWW_)))) _{{{{ _ffff_llll_uuuu_ssss_hhhh_bbbb_aaaa_nnnn_dddd_((((_qqqq_,,,, _FFFF_LLLL_UUUU_SSSS_HHHH_DDDD_AAAA_TTTT_AAAA_,,,, _****_((((_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _++++ _1111_))))_))))_;;;; _****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&&_==== _~~~~_FFFF_LLLL_UUUU_SSSS_HHHH_WWWW_;;;; _}}}} _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_RRRR_)))) _{{{{ _ffff_llll_uuuu_ssss_hhhh_bbbb_aaaa_nnnn_dddd_((((_RRRR_DDDD_((((_qqqq_))))_,,,, _FFFF_LLLL_UUUU_SSSS_HHHH_DDDD_AAAA_TTTT_AAAA_,,,, _****_((((_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _++++ _1111_))))_))))_;;;; _qqqq_rrrr_eeee_pppp_llll_yyyy_((((_qqqq_,,,, _mmmm_pppp_))))_;;;; _}}}} _eeee_llll_ssss_eeee _{{{{ _ffff_rrrr_eeee_eeee_mmmm_ssss_gggg_((((_mmmm_pppp_))))_;;;; _}}}} _}}}} _eeee_llll_ssss_eeee _{{{{ _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_WWWW_)))) _{{{{ _ffff_llll_uuuu_ssss_hhhh_qqqq_((((_qqqq_,,,, _FFFF_LLLL_UUUU_SSSS_HHHH_DDDD_AAAA_TTTT_AAAA_))))_;;;; _****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&&_==== _~~~~_FFFF_LLLL_UUUU_SSSS_HHHH_WWWW_;;;; _}}}} _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_RRRR_)))) _{{{{ _ffff_llll_uuuu_ssss_hhhh_qqqq_((((_RRRR_DDDD_((((_qqqq_))))_,,,, _FFFF_LLLL_UUUU_SSSS_HHHH_DDDD_AAAA_TTTT_AAAA_))))_;;;; _qqqq_rrrr_eeee_pppp_llll_yyyy_((((_qqqq_,,,, _mmmm_pppp_))))_;;;; _}}}} _eeee_llll_ssss_eeee _{{{{ _ffff_rrrr_eeee_eeee_mmmm_ssss_gggg_((((_mmmm_pppp_))))_;;;; _}}}} _}}}} The canonical flushing algorithm for module write put routines is as follows: _qqqq_uuuu_eeee_uuuu_eeee______tttt _****_qqqq_;;;; _////_**** _tttt_hhhh_eeee _wwww_rrrr_iiii_tttt_eeee _qqqq_uuuu_eeee_uuuu_eeee _****_//// _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_BBBB_AAAA_NNNN_DDDD_)))) _{{{{ _////_**** _iiii_ffff _mmmm_oooo_dddd_uuuu_llll_eeee _rrrr_eeee_cccc_oooo_gggg_nnnn_iiii_zzzz_eeee_ssss _bbbb_aaaa_nnnn_dddd_ssss _****_//// _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_WWWW_)))) _ffff_llll_uuuu_ssss_hhhh_bbbb_aaaa_nnnn_dddd_((((_qqqq_,,,, _FFFF_LLLL_UUUU_SSSS_HHHH_DDDD_AAAA_TTTT_AAAA_,,,, _****_((((_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _++++ _1111_))))_))))_;;;; _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_RRRR_)))) _ffff_llll_uuuu_ssss_hhhh_bbbb_aaaa_nnnn_dddd_((((_RRRR_DDDD_((((_qqqq_))))_,,,, _FFFF_LLLL_UUUU_SSSS_HHHH_DDDD_AAAA_TTTT_AAAA_,,,, _****_((((_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _++++ _1111_))))_))))_;;;; _}}}} _eeee_llll_ssss_eeee _{{{{ _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_WWWW_)))) _ffff_llll_uuuu_ssss_hhhh_qqqq_((((_qqqq_,,,, _FFFF_LLLL_UUUU_SSSS_HHHH_DDDD_AAAA_TTTT_AAAA_))))_;;;; _iiii_ffff _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_RRRR_)))) _ffff_llll_uuuu_ssss_hhhh_qqqq_((((_RRRR_DDDD_((((_qqqq_))))_,,,, _FFFF_LLLL_UUUU_SSSS_HHHH_DDDD_AAAA_TTTT_AAAA_))))_;;;; _}}}} _iiii_ffff _((((_!!!!_SSSS_AAAA_MMMM_EEEE_SSSS_TTTT_RRRR_((((_qqqq_))))_)))) _{{{{ _ssss_wwww_iiii_tttt_cccc_hhhh _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _FFFF_LLLL_UUUU_SSSS_HHHH_RRRR_WWWW_)))) _{{{{ PPPPaaaaggggeeee 2222 ppppuuuutttt((((DDDD2222)))) ppppuuuutttt((((DDDD2222)))) _cccc_aaaa_ssss_eeee _FFFF_LLLL_UUUU_SSSS_HHHH_RRRR_:::: _****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _==== _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _~~~~_FFFF_LLLL_UUUU_SSSS_HHHH_RRRR_)))) _|||| _FFFF_LLLL_UUUU_SSSS_HHHH_WWWW_;;;; _bbbb_rrrr_eeee_aaaa_kkkk_;;;; _cccc_aaaa_ssss_eeee _FFFF_LLLL_UUUU_SSSS_HHHH_WWWW_:::: _****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _==== _((((_****_mmmm_pppp_----_>>>>_bbbb______rrrr_pppp_tttt_rrrr _&&&& _~~~~_FFFF_LLLL_UUUU_SSSS_HHHH_WWWW_)))) _|||| _FFFF_LLLL_UUUU_SSSS_HHHH_RRRR_;;;; _bbbb_rrrr_eeee_aaaa_kkkk_;;;; _}}}} _}}}} _pppp_uuuu_tttt_nnnn_eeee_xxxx_tttt_((((_qqqq_,,,, _mmmm_pppp_))))_;;;; The algorithms for the read side are similar. In both examples, the _FFFF_LLLL_UUUU_SSSS_HHHH_BBBB_AAAA_NNNN_DDDD flag need only be checked if the driver or module cares about priority bands. Drivers and modules should not call _pppp_uuuu_tttt routines directly. Drivers should free any messages they do not recognize. Modules should pass on any messages they do not recognize. Drivers should fail any unrecognized _MMMM______IIII_OOOO_CCCC_TTTT_LLLL messages by converting them into _MMMM______IIII_OOOO_CCCC_NNNN_AAAA_KKKK messages and sending them upstream. Modules should pass on any unrecognized _MMMM______IIII_OOOO_CCCC_TTTT_LLLL messages. SSSSyyyynnnncccchhhhrrrroooonnnniiiizzzzaaaattttiiiioooonnnn CCCCoooonnnnssssttttrrrraaaaiiiinnnnttttssss _pppp_uuuu_tttt routines do not have user context and so may not call any function that sleeps. RRRREEEEFFFFEEEERRRREEEENNNNCCCCEEEESSSS _dddd_aaaa_tttt_aaaa_bbbb(D4), _ffff_llll_uuuu_ssss_hhhh_bbbb_aaaa_nnnn_dddd(D3), _ffff_llll_uuuu_ssss_hhhh_qqqq(D3), _mmmm_ssss_gggg_bbbb(D4), _pppp_uuuu_tttt_cccc_tttt_llll(D3), _pppp_uuuu_tttt_cccc_tttt_llll_1111(D3), _pppp_uuuu_tttt_nnnn_eeee_xxxx_tttt(D3), _pppp_uuuu_tttt_qqqq(D3), _qqqq_rrrr_eeee_pppp_llll_yyyy(D3), _qqqq_uuuu_eeee_uuuu_eeee(D4), _ssss_rrrr_vvvv(D2) PPPPaaaaggggeeee 3333