📄 trackio.c.htm
字号:
<a class="hl" name="60"> 60 </a> * Progress call back data.<a class="l" name="61"> 61 </a> */</span><a class="l" name="62"> 62 </a><b>static</b> <a href="/source/s?defs=mutex_t">mutex_t</a> <a href="/source/s?defs=pcb_mutex">pcb_mutex</a>;<a class="l" name="63"> 63 </a><b>static</b> <a href="/source/s?defs=cond_t">cond_t</a> <a href="/source/s?defs=pcb_cond">pcb_cond</a>;<a class="l" name="64"> 64 </a><b>static</b> <a href="/source/s?defs=uchar_t">uchar_t</a> <a href="/source/s?defs=pcb_user_abort">pcb_user_abort</a>, <a href="/source/s?defs=pcb_done">pcb_done</a>, <a href="/source/s?defs=pcb_synch_initialized">pcb_synch_initialized</a>;<a class="l" name="65"> 65 </a><b>static</b> <a href="/source/s?defs=int64_t">int64_t</a> <a href="/source/s?defs=pcb_completed_io_size">pcb_completed_io_size</a>;<a class="l" name="66"> 66 </a><b>static</b> <b>int</b> (*<a href="/source/s?defs=pcb_cb">pcb_cb</a>)(<a href="/source/s?defs=int64_t">int64_t</a>, <a href="/source/s?defs=int64_t">int64_t</a>);<a class="l" name="67"> 67 </a><b>static</b> <a href="/source/s?defs=int64_t">int64_t</a> <a href="/source/s?defs=pcb_arg">pcb_arg</a>;<a class="l" name="68"> 68 </a><a class="l" name="69"> 69 </a><b>static</b> <b>void</b><a class="hl" name="70"> 70 </a><a href="/source/s?defs=fini_tio_data">fini_tio_data</a>(<b>void</b>)<a class="l" name="71"> 71 </a>{<a class="l" name="72"> 72 </a> <b>int</b> i;<a class="l" name="73"> 73 </a> <b>for</b> (i = <span class="n">0</span>; i < <a href="/source/s?defs=NIOBS">NIOBS</a>; i++) {<a class="l" name="74"> 74 </a> <b>if</b> (<a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_buf">iob_buf</a>) {<a class="l" name="75"> 75 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_buf">iob_buf</a>);<a class="l" name="76"> 76 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_buf">iob_buf</a> = <a href="/source/s?defs=NULL">NULL</a>;<a class="l" name="77"> 77 </a> }<a class="l" name="78"> 78 </a> }<a class="l" name="79"> 79 </a> <b>if</b> (<a href="/source/s?defs=tio_synch_initialized">tio_synch_initialized</a> == <span class="n">1</span>) {<a class="hl" name="80"> 80 </a> (<b>void</b>) <a href="/source/s?defs=mutex_destroy">mutex_destroy</a>(&<a href="/source/s?defs=tio_mutex">tio_mutex</a>);<a class="l" name="81"> 81 </a> (<b>void</b>) <a href="/source/s?defs=cond_destroy">cond_destroy</a>(&<a href="/source/s?defs=tio_cond">tio_cond</a>);<a class="l" name="82"> 82 </a> <a href="/source/s?defs=tio_synch_initialized">tio_synch_initialized</a> = <span class="n">0</span>;<a class="l" name="83"> 83 </a> }<a class="l" name="84"> 84 </a> <a href="/source/s?defs=tio_abort">tio_abort</a> = <a href="/source/s?defs=tio_done">tio_done</a> = <span class="n">0</span>;<a class="l" name="85"> 85 </a>}<a class="l" name="86"> 86 </a><a class="l" name="87"> 87 </a><b>static</b> <b>void</b><a class="l" name="88"> 88 </a><a href="/source/s?defs=init_tio_data">init_tio_data</a>(<b>int</b> <a href="/source/s?defs=bsize">bsize</a>)<a class="l" name="89"> 89 </a>{<a class="hl" name="90"> 90 </a> <b>int</b> i;<a class="l" name="91"> 91 </a><a class="l" name="92"> 92 </a> (<b>void</b>) <a href="/source/s?defs=memset">memset</a>(<a href="/source/s?defs=tio_iobs">tio_iobs</a>, <span class="n">0</span>, <b>sizeof</b> (<a href="/source/s?defs=tio_iobs">tio_iobs</a>));<a class="l" name="93"> 93 </a> <b>for</b> (i = <span class="n">0</span>; i < <a href="/source/s?defs=NIOBS">NIOBS</a>; i++) {<a class="l" name="94"> 94 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_buf">iob_buf</a> = (<a href="/source/s?defs=uchar_t">uchar_t</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<a href="/source/s?defs=bsize">bsize</a>);<a class="l" name="95"> 95 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_total_size">iob_total_size</a> = <a href="/source/s?defs=bsize">bsize</a>;<a class="l" name="96"> 96 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_state">iob_state</a> = <a href="/source/s?defs=IOBS_EMPTY">IOBS_EMPTY</a>;<a class="l" name="97"> 97 </a> }<a class="l" name="98"> 98 </a> (<b>void</b>) <a href="/source/s?defs=mutex_init">mutex_init</a>(&<a href="/source/s?defs=tio_mutex">tio_mutex</a>, <a href="/source/s?defs=USYNC_THREAD">USYNC_THREAD</a>, <span class="n">0</span>);<a class="l" name="99"> 99 </a> (<b>void</b>) <a href="/source/s?defs=cond_init">cond_init</a>(&<a href="/source/s?defs=tio_cond">tio_cond</a>, <a href="/source/s?defs=USYNC_THREAD">USYNC_THREAD</a>, <span class="n">0</span>);<a class="hl" name="100"> 100 </a> <a href="/source/s?defs=tio_synch_initialized">tio_synch_initialized</a> = <span class="n">1</span>;<a class="l" name="101"> 101 </a> <a href="/source/s?defs=tio_abort">tio_abort</a> = <a href="/source/s?defs=tio_done">tio_done</a> = <span class="n">0</span>;<a class="l" name="102"> 102 </a> <a href="/source/s?defs=tio_got_ctrl_c">tio_got_ctrl_c</a> = <span class="n">0</span>;<a class="l" name="103"> 103 </a>}<a class="l" name="104"> 104 </a><a class="l" name="105"> 105 </a><b>static</b> <b>void</b><a class="l" name="106"> 106 </a><a href="/source/s?defs=init_pcb_data">init_pcb_data</a>(<b>void</b>)<a class="l" name="107"> 107 </a>{<a class="l" name="108"> 108 </a> (<b>void</b>) <a href="/source/s?defs=mutex_init">mutex_init</a>(&<a href="/source/s?defs=pcb_mutex">pcb_mutex</a>, <a href="/source/s?defs=USYNC_THREAD">USYNC_THREAD</a>, <span class="n">0</span>);<a class="l" name="109"> 109 </a> (<b>void</b>) <a href="/source/s?defs=cond_init">cond_init</a>(&<a href="/source/s?defs=pcb_cond">pcb_cond</a>, <a href="/source/s?defs=USYNC_THREAD">USYNC_THREAD</a>, <span class="n">0</span>);<a class="hl" name="110"> 110 </a> <a href="/source/s?defs=pcb_user_abort">pcb_user_abort</a> = <a href="/source/s?defs=pcb_done">pcb_done</a> = <span class="n">0</span>;<a class="l" name="111"> 111 </a> <a href="/source/s?defs=pcb_completed_io_size">pcb_completed_io_size</a> = <span class="n">0</span>;<a class="l" name="112"> 112 </a> <a href="/source/s?defs=pcb_synch_initialized">pcb_synch_initialized</a> = <span class="n">1</span>;<a class="l" name="113"> 113 </a>}<a class="l" name="114"> 114 </a><a class="l" name="115"> 115 </a><b>static</b> <b>void</b><a class="l" name="116"> 116 </a><a href="/source/s?defs=fini_pcb_data">fini_pcb_data</a>(<b>void</b>)<a class="l" name="117"> 117 </a>{<a class="l" name="118"> 118 </a> <b>if</b> (<a href="/source/s?defs=pcb_synch_initialized">pcb_synch_initialized</a> == <span class="n">1</span>) {<a class="l" name="119"> 119 </a> (<b>void</b>) <a href="/source/s?defs=mutex_destroy">mutex_destroy</a>(&<a href="/source/s?defs=pcb_mutex">pcb_mutex</a>);<a class="hl" name="120"> 120 </a> (<b>void</b>) <a href="/source/s?defs=cond_destroy">cond_destroy</a>(&<a href="/source/s?defs=pcb_cond">pcb_cond</a>);<a class="l" name="121"> 121 </a> <a href="/source/s?defs=pcb_synch_initialized">pcb_synch_initialized</a> = <span class="n">0</span>;<a class="l" name="122"> 122 </a> }<a class="l" name="123"> 123 </a> <a href="/source/s?defs=pcb_user_abort">pcb_user_abort</a> = <a href="/source/s?defs=pcb_done">pcb_done</a> = <span class="n">0</span>;<a class="l" name="124"> 124 </a> <a href="/source/s?defs=pcb_completed_io_size">pcb_completed_io_size</a> = <span class="n">0</span>;<a class="l" name="125"> 125 </a>}<a class="l" name="126"> 126 </a><a class="l" name="127"> 127 </a><span class="c">/* ARGSUSED */</span><a class="l" name="128"> 128 </a><b>static</b> <b>void</b> *<a class="l" name="129"> 129 </a><a href="/source/s?defs=write_to_cd">write_to_cd</a>(<b>void</b> *<a href="/source/s?defs=arg">arg</a>)<a class="hl" name="130"> 130 </a>{<a class="l" name="131"> 131 </a> <b>int</b> i;<a class="l" name="132"> 132 </a><a class="l" name="133"> 133 </a> i = <span class="n">0</span>;<a class="l" name="134"> 134 </a>#<b>ifndef</b> <a href="/source/s?defs=lint">lint</a><a class="l" name="135"> 135 </a> <b>while</b> (<span class="n">1</span>) {<a class="l" name="136"> 136 </a>#<b>endif</b><a class="l" name="137"> 137 </a> (<b>void</b>) <a href="/source/s?defs=mutex_lock">mutex_lock</a>(&<a href="/source/s?defs=tio_mutex">tio_mutex</a>);<a class="l" name="138"> 138 </a> <b>while</b> ((<a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_state">iob_state</a> != <a href="/source/s?defs=IOBS_READY">IOBS_READY</a>) &&<a class="l" name="139"> 139 </a> (<a href="/source/s?defs=tio_abort">tio_abort</a> == <span class="n">0</span>)) {<a class="hl" name="140"> 140 </a> <span class="c">/* Wait for buffer to become ready */</span><a class="l" name="141"> 141 </a> (<b>void</b>) <a href="/source/s?defs=cond_wait">cond_wait</a>(&<a href="/source/s?defs=tio_cond">tio_cond</a>, &<a href="/source/s?defs=tio_mutex">tio_mutex</a>);<a class="l" name="142"> 142 </a> }<a class="l" name="143"> 143 </a> <b>if</b> (<a href="/source/s?defs=tio_abort">tio_abort</a> == <span class="n">1</span>) {<a class="l" name="144"> 144 </a> <span class="c">/* Do a flush cache before aborting */</span><a class="l" name="145"> 145 </a> (<b>void</b>) <a href="/source/s?defs=flush_cache">flush_cache</a>(<a href="/source/s?defs=tio_fd">tio_fd</a>);<a class="l" name="146"> 146 </a> (<b>void</b>) <a href="/source/s?defs=mutex_unlock">mutex_unlock</a>(&<a href="/source/s?defs=tio_mutex">tio_mutex</a>);<a class="l" name="147"> 147 </a> <a href="/source/s?defs=thr_exit">thr_exit</a>((<b>void</b> *)<span class="n">1</span>);<a class="l" name="148"> 148 </a> }<a class="l" name="149"> 149 </a> <a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_state">iob_state</a> = <a href="/source/s?defs=IOBS_UNDER_DEVICE_IO">IOBS_UNDER_DEVICE_IO</a>;<a class="hl" name="150"> 150 </a><a class="l" name="151"> 151 </a> <span class="c">/* If no more data, then close the track */</span><a class="l" name="152"> 152 </a> <b>if</b> (<a href="/source/s?defs=tio_iobs">tio_iobs</a>[i].<a href="/source/s?defs=iob_data_size">iob_data_size</a> == <span class="n">0</span>) {<a class="l" name="153"> 153 </a> <b>int</b> <a href="/source/s?defs=retry">retry</a> = <span class="n">20</span>;<a class="l" name="154"> 154 </a><a class="l" name="155"> 155 </a> <span class="c">/* Some drives misbehave if flush_cache is not done */</span><a class="l" name="156"> 156 </a> (<b>void</b>) <a href="/source/s?defs=flush_cache">flush_cache</a>(<a href="/source/s?defs=tio_fd">tio_fd</a>);<a class="l" name="157"> 157 </a><a class="l" name="158"> 158 </a> <b>if</b> (<a href="/source/s?defs=write_mode">write_mode</a> == <a href="/source/s?defs=TAO_MODE">TAO_MODE</a>) {<a class="l" name="159"> 159 </a> <span class="c">/* Its important to try hard to close track */</span><a class="hl" name="160"> 160 </a> <b>if</b> (<a href="/source/s?defs=simulation">simulation</a>)<a class="l" name="161"> 161 </a> <a href="/source/s?defs=retry">retry</a> = <span class="n">5</span>;<a class="l" name="162"> 162 </a><a class="l" name="163"> 163 </a> <b>for</b> (; <a href="/source/s?defs=retry">retry</a> > <span class="n">0</span>; <a href="/source/s?defs=retry">retry</a>--) {<a class="l" name="164"> 164 </a><a class="l" name="165"> 165 </a> <span class="c">/* OK to hold mutex when close_track */</span><a class="l" name="166"> 166 </a> <b>if</b> (<a href="/source/s?defs=close_track">close_track</a>(<a href="/source/s?defs=tio_fd">tio_fd</a>,<a class="l" name="167"> 167 </a> <a href="/source/s?defs=tio_trackno">tio_trackno</a>, <span class="n">0</span>, <span class="n">0</span>))<a class="l" name="168"> 168 </a> <b>break</b>;<a class="l" name="169"> 169 </a><a class="hl" name="170"> 170 </a> (<b>void</b>) <a href="/source/s?defs=sleep">sleep</a>(<span class="n">1</span>);<a class="l" name="171"> 171 </a> }<a class="l" name="172"> 172 </a> }<a class="l" name="173"> 173 </a><a class="l" name="174"> 174 </a> <span class="c">/* Some drives don't allow close track in test write */</span><a class="l" name="175"> 175 </a> <b>if</b> ((<a href="/source/s?defs=retry">retry</a> == <span class="n">0</span>) && (<a href="/source/s?defs=simulation">simulation</a> == <span class="n">0</span>)) {<a class="l" name="176"> 176 </a> <b>if</b> (<a href="/source/s?defs=errno">errno</a>)<a class="l" name="177"> 177 </a> <a href="/source/s?defs=tio_errno">tio_errno</a> = <a href="/source/s?defs=errno">errno</a>;<a class="l" name="178"> 178 </a> <b>else</b><a class="l" name="179"> 179 </a> <a href="/source/s?defs=tio_errno">tio_errno</a> = -<span class="n">1</span>;<a class="hl" name="180"> 180 </a> }<a class="l" name="181"> 181 </a><a class="l" name="182"> 182 </a> <a href="/source/s?defs=tio_done">tio_done</a> = <span class="n">1</span>;<a class="l" name="183"> 183 </a> (<b>void</b>) <a href="/source/s?defs=cond_broadcast">cond_broadcast</a>(&<a href="/source/s?defs=tio_cond">tio_cond</a>);<a class="l" name="184"> 184 </a> (<b>void</b>) <a href="/source/s?defs=mutex_unlock">mutex_unlock</a>(&<a href="/source/s?defs=tio_mutex">tio_mutex</a>);<a class="l" name="185"> 185 </a> <a href="/source/s?defs=thr_exit">thr_exit</a>((<b>void</b> *)<span class="n">0</span>);<a class="l" name="186"> 186 </a> }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -