/** Called from the sigwait kernel thread after a pipeline thread has died. * Set the process that caused the fault as non-runnable and create a new pipeline thread. */ int pipeline_recover_thread(pipeline_t *obj) { hdebug("pipeline_id=%d\n",obj->id); obj->finished = 1; if (rtdal_process_seterror((r_proc_t) obj->running_process, SIG_RECV)) { aerror("setting process error\n"); return -1; } if (kernel_initialize_create_pipeline(obj, NULL)) { aerror("creating pipeline thread\n"); return -1; } return 0; }
int _run_cycle(void* context) { int i; oesr_context_t *ctx = (oesr_context_t*) context; nod_module_t *module = (nod_module_t*) ctx->module; nod_waveform_t *waveform = (nod_waveform_t*) module->parent.waveform; sdebug("context=0x%x, module_id=%d, changing_status=%d, cur_status=%d waveform_status=%d\n",context, module->parent.id, module->changing_status, module->parent.status, waveform->status.cur_status); if (waveform->status.cur_status == LOADED && module->parent.status == PARSED) { /* ack we have successfully been loaded */ module->parent.status = LOADED; /* register init and stop functions */ module->init = _call_init; module->stop = _call_stop; } /* Change only if finished previous status change */ if (!module->changing_status && module->parent.status != waveform->status.cur_status) { sdebug("next_tslot=%d, cur_tslot=%d\n",waveform->status.next_timeslot, rtdal_time_slot()); /* is it time to change? */ if (rtdal_time_slot() >= waveform->status.next_timeslot) { switch(waveform->status.cur_status) { case INIT: case STOP: break; case STEP: if (module->parent.status == RUN) { module->parent.status = waveform->status.cur_status; } else { module->parent.status = RUN; } break; case PAUSE: case RUN: /* These status does not need confirmation */ module->parent.status = waveform->status.cur_status; break; default: break; } } } if (!module->changing_status && module->parent.status == RUN) { #ifdef OESR_API_GETTIME /* save start time */ rtdal_time_get(&module->parent.execinfo.t_exec[1]); #endif /* run aloe cycle */ for (i=0;i<waveform->tslot_multiplicity;i++) { if (Run(context)) { sdebug("RUNERROR: module_id=%d\n",module->parent.id); /* set run-time error code */ if (rtdal_process_seterror(module->process,RUNERROR)) { aerror("rtdal_process_seterror"); } } } ctx->tstamp++; /* save end time */ #ifdef OESR_API_GETTIME rtdal_time_get(&module->parent.execinfo.t_exec[2]); rtdal_time_interval(module->parent.execinfo.t_exec); nod_module_execinfo_add_sample(&module->parent.execinfo); if (DEBUG_TIMEMOD_ID == module->parent.id || DEBUG_TIMEMOD_ID == -1) { tmdebug("%d,%d\n",module->parent.id, module->parent.execinfo.t_exec[0].tv_usec); } #endif /* compute execution time, exponential average, max, etc. and save data to mymodule.execinfo */ #ifdef kk /* stat reports */ for (i=0;i<nof_reporting_vars;i++) { module.reporting_variables[i].period_cnt++; /* save the first window samples only */ if (module.reporting_variables[i].period_cnt++<module.reporting_variables[i].window) module.reporting_variables[i].serialize(module.reporting_variables[i].report_packet); } /* send report every period */ if (module.reporting_variables[i].periodCnt++<module.reporting_variables[i].period) { rtdal.newTask(report_variable,&reporting_variables[i]); } } /* write logs */ for (i=0;i<nof_logs;i++) { if (logs[i].w_ptr) { rtdal.new_task(oesr_log._writelog,logs[i]); } } #endif }