| 1921 | } |
| 1922 | |
| 1923 | bool process(iocp_result_t *result) { |
| 1924 | // No queue of completions for the reaper. Just process |
| 1925 | // serialized by the lock assuming all actions are "short". |
| 1926 | // That may be wrong, and if so the real fix is not a |
| 1927 | // consumer/producer setup but just replace the reaper with a |
| 1928 | // multi threaded alternative. |
| 1929 | csguard g(&lock_); |
| 1930 | iocpdesc_t *iocpd = result->iocpd; |
| 1931 | if (is_write_result(result)) { |
| 1932 | csguard wg(global_wlock_); |
| 1933 | do_complete(result); |
| 1934 | } |
| 1935 | else do_complete(result); |
| 1936 | // result may now be NULL |
| 1937 | bool rval = (iocpd->ops_in_progress == 0); |
| 1938 | pni_iocp_reap_check(iocpd); |
| 1939 | return rval; |
| 1940 | } |
| 1941 | |
| 1942 | // Called when all competing threads have terminated except our own reap_check timer. |
| 1943 | void final_shutdown() { |
no test coverage detected