void _gop_dummy_submit_op(void *arg, op_generic_t *op) { int dolock = 0; log_printf(15, "gid=%d\n", gop_id(op)); // if (op->base.cb != NULL) { //** gop is on a q apr_thread_mutex_lock(gd_lock); push(gd_stack, op); apr_thread_cond_signal(gd_cond); apr_thread_mutex_unlock(gd_lock); return; // } //*-------* This isn't executed below ----------- if (apr_thread_mutex_trylock(op->base.ctl->lock) != APR_SUCCESS) dolock = 1; unlock_gop(op); //log_printf(15, "dolock=%d gid=%d err=%d APR_SUCCESS=%d\n", dolock, gop_id(op), err, APR_SUCCESS); op->base.started_execution = 1; gop_mark_completed(op, op->base.status); if (dolock == 1) { lock_gop(op); } //** lock_gop is a macro so need the {} return; }
void _hp_fail_tasks(host_portal_t *hp, op_status_t err_code) { op_generic_t *hsop; hp->workload = 0; //** Use the _get_hportal_op() To make sure we handle any coalescing while ((hsop = _get_hportal_op(hp)) != NULL) { hportal_unlock(hp); gop_mark_completed(hsop, err_code); hportal_lock(hp); } // while ((hsop = (op_generic_t *)tbx_stack_pop(hp->que)) != NULL) { // hportal_unlock(hp); // gop_mark_completed(hsop, err_code); // hportal_lock(hp); // } }
void *gd_thread_func(apr_thread_t *th, void *data) { op_generic_t *gop; apr_thread_mutex_lock(gd_lock); while (gd_shutdown == 0) { //** Execute everything on the stack while ((gop = (op_generic_t *)pop(gd_stack)) != NULL) { log_printf(15, "DUMMY gid=%d status=%d\n", gop_id(gop), gop->base.status.op_status); apr_thread_mutex_unlock(gd_lock); gop_mark_completed(gop, gop->base.status); apr_thread_mutex_lock(gd_lock); } //** Wait for more work apr_thread_cond_wait(gd_cond, gd_lock); } apr_thread_mutex_unlock(gd_lock); return(NULL); }