nanojpeg: receive/store results, merge identical neighbors

git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1816 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
hsc
2012-10-24 09:58:59 +00:00
parent 554d80139a
commit 4dcee177be

View File

@ -215,11 +215,55 @@ bool NanoJPEGCampaign::run()
}
}
}
campaignmanager.noMoreParameters();
cout << "experiments planned: " << dec << count_exp
<< " (" << count_exp_jobs << " jobs)" << endl;
cout << "known outcome ECs: " << dec << count_known
<< " (" << count_known_jobs << " jobs)" << endl;
// collect results
NanoJPEGExperimentData *res;
int rescount = 0;
while ((res = static_cast<NanoJPEGExperimentData *>(campaignmanager.getDone()))) {
rescount++;
NanoJPEGProtoMsg_Result const *prev_singleres = 0;
uint64_t bitmask = 0;
// one job contains multiple experiments
for (int idx = 0; idx < res->msg.result_size(); ++idx) {
NanoJPEGProtoMsg_Result const *cur_singleres = &res->msg.result(idx);
if (!prev_singleres) {
prev_singleres = cur_singleres;
bitmask = 1ULL << cur_singleres->bitnr();
continue;
}
// compatible? merge.
if (prev_singleres->resulttype() == cur_singleres->resulttype()
&& prev_singleres->latest_ip() == cur_singleres->latest_ip()
&& prev_singleres->psnr() == cur_singleres->psnr()
&& prev_singleres->details() == cur_singleres->details()) {
bitmask |= 1ULL << cur_singleres->bitnr();
continue;
}
add_result(res->msg.instr_ecstart(), res->msg.instr_offset(),
res->msg.instr_address(), (fail::GPRegisterId) res->msg.register_id(),
res->msg.timeout(), res->msg.injection_ip(),
bitmask, prev_singleres->resulttype(), prev_singleres->latest_ip(),
prev_singleres->psnr(), prev_singleres->details().c_str());
prev_singleres = cur_singleres;
bitmask = 1ULL << cur_singleres->bitnr();
}
add_result(res->msg.instr_ecstart(), res->msg.instr_offset(),
res->msg.instr_address(), (fail::GPRegisterId) res->msg.register_id(),
res->msg.timeout(), res->msg.injection_ip(),
bitmask, prev_singleres->resulttype(), prev_singleres->latest_ip(),
prev_singleres->psnr(), prev_singleres->details().c_str());
//delete res; // currently racy if jobs are reassigned
}
finalize_results();
return true;
}