资源监控在扫描线程中处理;线程页面化参数使用宏定义控制;减少CIS缓冲区数量(至4个)
This commit is contained in:
parent
e264cd6556
commit
ca0ab06dcc
|
@ -42,7 +42,7 @@ protected:
|
||||||
size_t length;
|
size_t length;
|
||||||
};
|
};
|
||||||
|
|
||||||
const int v4l_buffer_count = 6;
|
const int v4l_buffer_count = 4;
|
||||||
int buf_size_ = 0;
|
int buf_size_ = 0;
|
||||||
int v4l_width = 3100;
|
int v4l_width = 3100;
|
||||||
int v4l_height = 3100;
|
int v4l_height = 3100;
|
||||||
|
|
|
@ -36,9 +36,16 @@ imgproc_mgr::imgproc_mgr(device_option* devopts, void(*sender)(SENDER_PROTO), vo
|
||||||
)
|
)
|
||||||
: opts_(devopts), img_sender_(sender), sender_param_(sp)
|
: opts_(devopts), img_sender_(sender), sender_param_(sp)
|
||||||
, res_(res), res_param_(rp)
|
, res_(res), res_param_(rp)
|
||||||
|
#ifndef USE_THREAD_PAGED_DATA
|
||||||
|
, raw_("cis-img")
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
ADD_THIS_JSON();
|
ADD_THIS_JSON();
|
||||||
|
|
||||||
|
#ifndef USE_THREAD_PAGED_DATA
|
||||||
|
raw_.enable_wait_log(false);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (opts_)
|
if (opts_)
|
||||||
opts_->add_ref();
|
opts_->add_ref();
|
||||||
else
|
else
|
||||||
|
@ -119,7 +126,11 @@ void imgproc_mgr::process(image_processor* prc, std::vector<PROCIMGINFO>* in, st
|
||||||
void imgproc_mgr::send_image(LPPAGEDPARAM obj, LPPACKIMAGE head, cv::Mat& mat, void* info, size_t info_l, bool last)
|
void imgproc_mgr::send_image(LPPAGEDPARAM obj, LPPACKIMAGE head, cv::Mat& mat, void* info, size_t info_l, bool last)
|
||||||
{
|
{
|
||||||
PACKIMAGE h(*head);
|
PACKIMAGE h(*head);
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
std::shared_ptr<std::vector<uchar>> compd(obj->mean.encoder->encode(&h, mat));
|
std::shared_ptr<std::vector<uchar>> compd(obj->mean.encoder->encode(&h, mat));
|
||||||
|
#else
|
||||||
|
std::shared_ptr<std::vector<uchar>> compd(last_->encode(&h, mat));
|
||||||
|
#endif
|
||||||
image_packet_ptr ptr = nullptr;
|
image_packet_ptr ptr = nullptr;
|
||||||
|
|
||||||
if(last)
|
if(last)
|
||||||
|
@ -131,14 +142,21 @@ void imgproc_mgr::send_image(LPPAGEDPARAM obj, LPPACKIMAGE head, cv::Mat& mat, v
|
||||||
h.prc_stage = head->prc_stage;
|
h.prc_stage = head->prc_stage;
|
||||||
h.prc_time = head->prc_time;
|
h.prc_time = head->prc_time;
|
||||||
}
|
}
|
||||||
ptr = new image_packet(&h, compd, obj->mean.scan_id, info, info_l);
|
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
|
ptr = new image_packet(&h, compd, obj->mean.scan_id, info, info_l);
|
||||||
ptr->set_session_id(obj->mean.session);
|
ptr->set_session_id(obj->mean.session);
|
||||||
obj->mean.sender(ptr, obj->mean.sender_param);
|
obj->mean.sender(ptr, obj->mean.sender_param);
|
||||||
|
#else
|
||||||
|
ptr = new image_packet(&h, compd, scan_id_, info, info_l);
|
||||||
|
ptr->set_session_id(session_id_);
|
||||||
|
img_sender_(ptr, sender_param_);
|
||||||
|
#endif
|
||||||
ptr->release();
|
ptr->release();
|
||||||
}
|
}
|
||||||
void imgproc_mgr::real_dump_image(DUMP_PROTO)
|
void imgproc_mgr::real_dump_image(DUMP_PROTO)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
if(arr)
|
if(arr)
|
||||||
{
|
{
|
||||||
for(auto& v: *arr)
|
for(auto& v: *arr)
|
||||||
|
@ -148,6 +166,16 @@ void imgproc_mgr::real_dump_image(DUMP_PROTO)
|
||||||
{
|
{
|
||||||
imgproc_mgr::send_image(obj, info, *mat, infoex, infexl, last);
|
imgproc_mgr::send_image(obj, info, *mat, infoex, infexl, last);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if(arr)
|
||||||
|
{
|
||||||
|
((imgproc_mgr*)param)->send_image(nullptr, *arr, last);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
((imgproc_mgr*)param)->send_image(obj, info, *mat, infoex, infexl, last);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
void imgproc_mgr::empty_dump_image(DUMP_PROTO)
|
void imgproc_mgr::empty_dump_image(DUMP_PROTO)
|
||||||
{}
|
{}
|
||||||
|
@ -156,8 +184,10 @@ void imgproc_mgr::start_workers(int cnt)
|
||||||
{
|
{
|
||||||
workers_.stop(nullptr);
|
workers_.stop(nullptr);
|
||||||
|
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
for(auto& v: params_)
|
for(auto& v: params_)
|
||||||
v->free();
|
v->free();
|
||||||
|
#endif
|
||||||
|
|
||||||
auto thrd = [this](void* param) -> void
|
auto thrd = [this](void* param) -> void
|
||||||
{
|
{
|
||||||
|
@ -178,7 +208,8 @@ void imgproc_mgr::start_workers(int cnt)
|
||||||
|
|
||||||
for(int i = 0; i < cnt; ++i)
|
for(int i = 0; i < cnt; ++i)
|
||||||
{
|
{
|
||||||
LPPAGEDPARAM param = nullptr;
|
LPPAGEDPARAM param = (LPPAGEDPARAM)i;
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
if(i < params_.size())
|
if(i < params_.size())
|
||||||
param = params_[i];
|
param = params_[i];
|
||||||
else
|
else
|
||||||
|
@ -219,6 +250,8 @@ void imgproc_mgr::start_workers(int cnt)
|
||||||
param->mean.processors[ind++] = prc;
|
param->mean.processors[ind++] = prc;
|
||||||
param->mean.processors[ind] = nullptr;
|
param->mean.processors[ind] = nullptr;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
char n[40] = {0};
|
char n[40] = {0};
|
||||||
|
|
||||||
sprintf(n, "thread_worker%d", i + 1);
|
sprintf(n, "thread_worker%d", i + 1);
|
||||||
|
@ -234,14 +267,22 @@ uint32_t imgproc_mgr::add_busy_worker(int inc)
|
||||||
}
|
}
|
||||||
void imgproc_mgr::thread_worker(void* param)
|
void imgproc_mgr::thread_worker(void* param)
|
||||||
{
|
{
|
||||||
LPPAGEDPARAM para = (LPPAGEDPARAM)param;
|
|
||||||
RAWIMG img;
|
RAWIMG img;
|
||||||
int cpu = (para->mean.ind % (CPU_CORES - CPU_MAJOR_CNT)) + CPU_MINOR_0;
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
|
LPPAGEDPARAM para = (LPPAGEDPARAM)param;
|
||||||
|
int ind = para->mean.ind;
|
||||||
|
#else
|
||||||
|
int ind = (int)(long)param;
|
||||||
|
void(*dump)(DUMP_PROTO) = dump_img_ ? &imgproc_mgr::real_dump_image : &imgproc_mgr::empty_dump_image;
|
||||||
|
LPPAGEDPARAM para = (LPPAGEDPARAM)(void*)dump;
|
||||||
|
#endif
|
||||||
|
int cpu = (ind % (CPU_CORES - CPU_MAJOR_CNT)) + CPU_MINOR_0;
|
||||||
|
|
||||||
utils::to_log(LOG_LEVEL_DEBUG, "set image process thread %d to CPU %d = %d\n"
|
utils::to_log(LOG_LEVEL_DEBUG, "set image process thread %d to CPU %d = %d\n"
|
||||||
, para->mean.ind + 1, cpu, utils::set_cpu_affinity(cpu));
|
, ind + 1, cpu, utils::set_cpu_affinity(cpu));
|
||||||
|
|
||||||
add_busy_worker();
|
add_busy_worker();
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
while(para->mean.run)
|
while(para->mean.run)
|
||||||
{
|
{
|
||||||
if(para->mean.res)
|
if(para->mean.res)
|
||||||
|
@ -265,9 +306,34 @@ void imgproc_mgr::thread_worker(void* param)
|
||||||
process(&img, para);
|
process(&img, para);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
while(run_)
|
||||||
|
{
|
||||||
|
if(res_)
|
||||||
|
{
|
||||||
|
while(!res_(TASK_IMG_PROCESSOR, true, 3000, res_param_))
|
||||||
|
{
|
||||||
|
if(!run_)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!run_)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(raw_.take(img, true))
|
||||||
|
{
|
||||||
|
#ifdef REBUILD_IN_CIS_THREAD
|
||||||
|
if(img.img && img.imgs.size() == 0)
|
||||||
|
#else
|
||||||
|
if(img.img && !img.data)
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
process(&img, para, ind);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
add_busy_worker(-1);
|
add_busy_worker(-1);
|
||||||
}
|
}
|
||||||
void imgproc_mgr::process(RAWIMG* img, LPPAGEDPARAM param)
|
void imgproc_mgr::process(RAWIMG* img, LPPAGEDPARAM param, int thrd_sn)
|
||||||
{
|
{
|
||||||
if(img->img)
|
if(img->img)
|
||||||
{
|
{
|
||||||
|
@ -275,20 +341,35 @@ void imgproc_mgr::process(RAWIMG* img, LPPAGEDPARAM param)
|
||||||
chronograph watch;
|
chronograph watch;
|
||||||
|
|
||||||
#ifdef REBUILD_IN_CIS_THREAD
|
#ifdef REBUILD_IN_CIS_THREAD
|
||||||
|
void(*dump)(DUMP_PROTO) = (void(*)(DUMP_PROTO))param;
|
||||||
src = &img->imgs;
|
src = &img->imgs;
|
||||||
|
utils::to_log(LOG_LEVEL_ALL, "Rebuild paper %d spend %u milliseconds.\n", img->imgs[0].info.pos.paper_ind, img->imgs[0].info.prc_time);
|
||||||
#else
|
#else
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
if(param->mean.dumpi)
|
if(param->mean.dumpi)
|
||||||
|
#else
|
||||||
|
if(dump_img_)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
cv::Mat mat(img->info.width, img->info.height, CV_8UC1, img->data->ptr());
|
cv::Mat mat(img->info.width, img->info.height, CV_8UC1, img->data->ptr());
|
||||||
send_image(param, &img->info, mat, nullptr, 0, false);
|
send_image(param, &img->info, mat, nullptr, 0, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
if(param->mean.rebld)
|
if(param->mean.rebld)
|
||||||
{
|
{
|
||||||
param->mean.rebld->do_rebuild(&img->info, img->data->ptr(), in);
|
param->mean.rebld->do_rebuild(&img->info, img->data->ptr(), in);
|
||||||
utils::to_log(LOG_LEVEL_ALL, "Thread %d Rebuild paper %d spend %llu milliseconds.\n", param->mean.ind + 1, img->info.pos.paper_ind, watch.elapse_ms());
|
utils::to_log(LOG_LEVEL_ALL, "Thread %d Rebuild paper %d spend %llu milliseconds.\n", thrd_sn + 1, img->info.pos.paper_ind, watch.elapse_ms());
|
||||||
param->mean.dump(param, &in, nullptr, nullptr, nullptr, 0, false, param->mean.dump_param);
|
param->mean.dump(param, &in, nullptr, nullptr, nullptr, 0, false, param->mean.dump_param);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if(do_rebuild_)
|
||||||
|
{
|
||||||
|
first_->do_rebuild(&img->info, img->data->ptr(), in);
|
||||||
|
utils::to_log(LOG_LEVEL_ALL, "Thread %d Rebuild paper %d spend %llu milliseconds.\n", thrd_sn + 1, img->info.pos.paper_ind, watch.elapse_ms());
|
||||||
|
dump(nullptr, &in, nullptr, nullptr, nullptr, 0, false, this);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PROCIMGINFO i;
|
PROCIMGINFO i;
|
||||||
|
@ -299,6 +380,7 @@ void imgproc_mgr::process(RAWIMG* img, LPPAGEDPARAM param)
|
||||||
img->data->release(); // page fault
|
img->data->release(); // page fault
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
for(auto& v: param->mean.processors)
|
for(auto& v: param->mean.processors)
|
||||||
{
|
{
|
||||||
if(!v)
|
if(!v)
|
||||||
|
@ -315,6 +397,20 @@ void imgproc_mgr::process(RAWIMG* img, LPPAGEDPARAM param)
|
||||||
param->mean.dump(param, src, nullptr, nullptr, nullptr, 0, false, param->mean.dump_param);
|
param->mean.dump(param, src, nullptr, nullptr, nullptr, 0, false, param->mean.dump_param);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
for(auto& v: processors_)
|
||||||
|
{
|
||||||
|
if(v->is_enable())
|
||||||
|
{
|
||||||
|
process(v, src, dst);
|
||||||
|
src->clear();
|
||||||
|
swp = src;
|
||||||
|
src = dst;
|
||||||
|
dst = swp;
|
||||||
|
dump(param, src, nullptr, nullptr, nullptr, 0, false, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
send_image(param, *src, true);
|
send_image(param, *src, true);
|
||||||
}
|
}
|
||||||
|
@ -331,14 +427,19 @@ void imgproc_mgr::process(RAWIMG* img, LPPAGEDPARAM param)
|
||||||
over.data = nullptr;
|
over.data = nullptr;
|
||||||
#endif
|
#endif
|
||||||
over.img = true;
|
over.img = true;
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
for(auto& v: params_)
|
for(auto& v: params_)
|
||||||
v->mean.que->save(over, true);
|
v->mean.que->save(over, true);
|
||||||
|
#else
|
||||||
|
for(int i = 0; i < working_cnt_; ++i)
|
||||||
|
raw_.save(over, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
ptr->set_session_id(session_id_);
|
ptr->set_session_id(session_id_);
|
||||||
while((que = add_busy_worker(0)) > 1)
|
while((que = add_busy_worker(0)) > 1)
|
||||||
{
|
{
|
||||||
if(wait++ == 0)
|
if(wait++ == 0)
|
||||||
utils::to_log(LOG_LEVEL_DEBUG, "Received scan completed (in thread %d) event while processing %u paper(s), wait ...\n", param->mean.ind + 1, que - 1);
|
utils::to_log(LOG_LEVEL_DEBUG, "Received scan completed (in thread %d) event while processing %u paper(s), wait ...\n", thrd_sn + 1, que - 1);
|
||||||
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
std::this_thread::sleep_for(std::chrono::milliseconds(5));
|
||||||
}
|
}
|
||||||
|
@ -415,9 +516,11 @@ int imgproc_mgr::clear(void)
|
||||||
v->release();
|
v->release();
|
||||||
processors_.clear();
|
processors_.clear();
|
||||||
|
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
for(auto& v: params_)
|
for(auto& v: params_)
|
||||||
delete v;
|
delete v;
|
||||||
params_.clear();
|
params_.clear();
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -434,20 +537,23 @@ int imgproc_mgr::process(LPPACKIMAGE info, dyn_mem_ptr data, bool img)
|
||||||
#ifdef REBUILD_IN_CIS_THREAD
|
#ifdef REBUILD_IN_CIS_THREAD
|
||||||
if(img)
|
if(img)
|
||||||
{
|
{
|
||||||
|
LPPAGEDPARAM paged = nullptr;
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
|
paged = params_[0];
|
||||||
|
#endif
|
||||||
if(dump_img_)
|
if(dump_img_)
|
||||||
{
|
{
|
||||||
cv::Mat mat(info->width, info->height, CV_8UC1, data->ptr());
|
cv::Mat mat(info->width, info->height, CV_8UC1, data->ptr());
|
||||||
send_image(params_[0], info, mat, nullptr, 0, false);
|
send_image(paged, info, mat, nullptr, 0, false);
|
||||||
}
|
}
|
||||||
if(do_rebuild_)
|
if(do_rebuild_)
|
||||||
{
|
{
|
||||||
chronograph watch;
|
chronograph watch;
|
||||||
first_->do_rebuild(info, data->ptr(), ri.imgs);
|
first_->do_rebuild(info, data->ptr(), ri.imgs);
|
||||||
rebuild_cis += watch.elapse_ms();
|
rebuild_cis += ri.imgs[0].info.prc_time;
|
||||||
scan_count++;
|
scan_count++;
|
||||||
utils::to_log(LOG_LEVEL_ALL, "Rebuild paper %d spend %llu milliseconds.\n", info->pos.paper_ind, watch.elapse_ms());
|
|
||||||
if(dump_img_)
|
if(dump_img_)
|
||||||
send_image(params_[0], ri.imgs, false);
|
send_image(paged, ri.imgs, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -476,8 +582,11 @@ int imgproc_mgr::process(LPPACKIMAGE info, dyn_mem_ptr data, bool img)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ri.img = img;
|
ri.img = img;
|
||||||
// if(!img)
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
params_[ind]->mean.que->save(ri, true);
|
params_[ind]->mean.que->save(ri, true);
|
||||||
|
#else
|
||||||
|
raw_.save(ri, true);
|
||||||
|
#endif
|
||||||
++put_ind_;
|
++put_ind_;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -486,12 +595,17 @@ int imgproc_mgr::process(LPPACKIMAGE info, dyn_mem_ptr data, bool img)
|
||||||
void imgproc_mgr::stop(void)
|
void imgproc_mgr::stop(void)
|
||||||
{
|
{
|
||||||
run_ = false;
|
run_ = false;
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
for(auto& v: params_)
|
for(auto& v: params_)
|
||||||
{
|
{
|
||||||
v->mean.run = false;
|
v->mean.run = false;
|
||||||
if(v->mean.que)
|
if(v->mean.que)
|
||||||
v->mean.que->trigger();
|
v->mean.que->trigger();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
for(int i = 0; i < working_cnt_; ++i)
|
||||||
|
raw_.trigger();
|
||||||
|
#endif
|
||||||
|
|
||||||
workers_.stop(nullptr);
|
workers_.stop(nullptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <base/data.h>
|
#include <base/data.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
#define DUMP_PROTO union _page_thrd_data_4k* obj, std::vector<PROCIMGINFO>* arr, LPPACKIMAGE info, cv::Mat* mat, char* infoex, size_t infexl, bool last, void* param
|
#define DUMP_PROTO union _page_thrd_data_4k* obj, std::vector<PROCIMGINFO>* arr, LPPACKIMAGE info, cv::Mat* mat, char* infoex, size_t infexl, bool last, void* param
|
||||||
|
|
||||||
class device_option;
|
class device_option;
|
||||||
|
@ -74,7 +75,11 @@ class imgproc_mgr : public sane_opt_provider
|
||||||
}
|
}
|
||||||
void free(void);
|
void free(void);
|
||||||
}PAGEDPARAM, *LPPAGEDPARAM;
|
}PAGEDPARAM, *LPPAGEDPARAM;
|
||||||
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
std::vector<LPPAGEDPARAM> params_;
|
std::vector<LPPAGEDPARAM> params_;
|
||||||
|
#else
|
||||||
|
safe_fifo<RAWIMG> raw_;
|
||||||
|
#endif
|
||||||
|
|
||||||
refer_guard<rebuild> first_;
|
refer_guard<rebuild> first_;
|
||||||
refer_guard<img_encoder> last_;
|
refer_guard<img_encoder> last_;
|
||||||
|
@ -101,14 +106,17 @@ class imgproc_mgr : public sane_opt_provider
|
||||||
static bool sort_image_packet(image_packet_ptr l, image_packet_ptr r);
|
static bool sort_image_packet(image_packet_ptr l, image_packet_ptr r);
|
||||||
static data_source_ptr scan_finished_packet(uint32_t scanid, uint32_t err = 0);
|
static data_source_ptr scan_finished_packet(uint32_t scanid, uint32_t err = 0);
|
||||||
static void process(image_processor* prc, std::vector<PROCIMGINFO>* in, std::vector<PROCIMGINFO>* out);
|
static void process(image_processor* prc, std::vector<PROCIMGINFO>* in, std::vector<PROCIMGINFO>* out);
|
||||||
static void send_image(LPPAGEDPARAM obj, LPPACKIMAGE head, cv::Mat& mat, void* info = nullptr, size_t info_l = 0, bool last = true);
|
#ifdef USE_THREAD_PAGED_DATA
|
||||||
|
static
|
||||||
|
#endif
|
||||||
|
void send_image(LPPAGEDPARAM obj, LPPACKIMAGE head, cv::Mat& mat, void* info = nullptr, size_t info_l = 0, bool last = true);
|
||||||
static void real_dump_image(DUMP_PROTO);
|
static void real_dump_image(DUMP_PROTO);
|
||||||
static void empty_dump_image(DUMP_PROTO);
|
static void empty_dump_image(DUMP_PROTO);
|
||||||
|
|
||||||
void start_workers(int cnt);
|
void start_workers(int cnt);
|
||||||
uint32_t add_busy_worker(int inc = 1);
|
uint32_t add_busy_worker(int inc = 1);
|
||||||
void thread_worker(void* param);
|
void thread_worker(void* param);
|
||||||
void process(RAWIMG* img, LPPAGEDPARAM param);
|
void process(RAWIMG* img, LPPAGEDPARAM param, int thrd_sn);
|
||||||
void send_image(LPPAGEDPARAM obj, std::vector<PROCIMGINFO>& imgs, bool last);
|
void send_image(LPPAGEDPARAM obj, std::vector<PROCIMGINFO>& imgs, bool last);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -593,7 +593,6 @@ dyn_mem_ptr async_scanner::handle_scan_start(LPPACK_BASE pack, uint32_t* used, p
|
||||||
scan_id_ = pack->pack_id;
|
scan_id_ = pack->pack_id;
|
||||||
scan_err_ = 0;
|
scan_err_ = 0;
|
||||||
reply_start_ = false;
|
reply_start_ = false;
|
||||||
res_mgr_->start();
|
|
||||||
|
|
||||||
auto receiver = [this](dyn_mem_ptr data, bool img, LPPACKIMAGE lpinfo) -> void
|
auto receiver = [this](dyn_mem_ptr data, bool img, LPPACKIMAGE lpinfo) -> void
|
||||||
{
|
{
|
||||||
|
@ -618,7 +617,10 @@ dyn_mem_ptr async_scanner::handle_scan_start(LPPACK_BASE pack, uint32_t* used, p
|
||||||
cis_->close();
|
cis_->close();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
system("echo performance > /sys/devices/system/cpu/cpu5/cpufreq/scaling_governor");
|
system("echo performance > /sys/devices/system/cpu/cpu5/cpufreq/scaling_governor");
|
||||||
|
res_mgr_->start();
|
||||||
|
}
|
||||||
BASE_PACKET_REPLY(*((LPPACK_BASE)reply->ptr()), pack->cmd + 1, pack->pack_id, scan_err_);
|
BASE_PACKET_REPLY(*((LPPACK_BASE)reply->ptr()), pack->cmd + 1, pack->pack_id, scan_err_);
|
||||||
((LPPACK_BASE)reply->ptr())->payload_len = config.length() + 2;
|
((LPPACK_BASE)reply->ptr())->payload_len = config.length() + 2;
|
||||||
strcpy(((LPPACK_BASE)reply->ptr())->payload, config.c_str());
|
strcpy(((LPPACK_BASE)reply->ptr())->payload, config.c_str());
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
resource_mgr::resource_mgr()
|
resource_mgr::resource_mgr()
|
||||||
{
|
{
|
||||||
|
#ifdef USE_MONITOR_THREAD
|
||||||
thread_.reset(new std::thread(&resource_mgr::thread_monitor, this));
|
thread_.reset(new std::thread(&resource_mgr::thread_monitor, this));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
resource_mgr::~resource_mgr()
|
resource_mgr::~resource_mgr()
|
||||||
{
|
{
|
||||||
|
@ -47,6 +49,7 @@ std::string resource_mgr::task_type(_task task)
|
||||||
|
|
||||||
void resource_mgr::start(void)
|
void resource_mgr::start(void)
|
||||||
{
|
{
|
||||||
|
printf("\tstart resource monitor with mem limit = %llu\n", mem_limit_);
|
||||||
monitor_ = true;
|
monitor_ = true;
|
||||||
}
|
}
|
||||||
void resource_mgr::stop(void)
|
void resource_mgr::stop(void)
|
||||||
|
@ -59,6 +62,11 @@ void resource_mgr::set_memory_limit(uint64_t max_size)
|
||||||
}
|
}
|
||||||
bool resource_mgr::is_resource_enable(_task task, bool wait, int to_ms)
|
bool resource_mgr::is_resource_enable(_task task, bool wait, int to_ms)
|
||||||
{
|
{
|
||||||
|
#ifndef USE_MONITOR_THREAD
|
||||||
|
if(task == TASK_CAPTURER)
|
||||||
|
utils::get_memory_usage(nullptr, (uint64_t*)&mem_now_, nullptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
if(wait && mem_now_ > mem_limit_)
|
if(wait && mem_now_ > mem_limit_)
|
||||||
{
|
{
|
||||||
chronograph watch;
|
chronograph watch;
|
||||||
|
|
|
@ -8,12 +8,14 @@
|
||||||
#include <base/utils.h>
|
#include <base/utils.h>
|
||||||
#include <base/packet.h>
|
#include <base/packet.h>
|
||||||
|
|
||||||
|
// #define USE_MONITOR_THREAD
|
||||||
|
|
||||||
class resource_mgr
|
class resource_mgr
|
||||||
{
|
{
|
||||||
volatile bool run_ = true;
|
volatile bool run_ = true;
|
||||||
volatile bool monitor_ = false;
|
volatile bool monitor_ = false;
|
||||||
uint64_t mem_limit_ = SIZE_GB(2);
|
uint64_t mem_limit_ = SIZE_GB(3);
|
||||||
uint64_t mem_now_ = 0;
|
volatile uint64_t mem_now_ = 0;
|
||||||
std::unique_ptr<std::thread> thread_;
|
std::unique_ptr<std::thread> thread_;
|
||||||
|
|
||||||
void thread_monitor(void);
|
void thread_monitor(void);
|
||||||
|
@ -31,38 +33,3 @@ public:
|
||||||
bool is_resource_enable(_task task, bool wait = false, int to_ms = 0);
|
bool is_resource_enable(_task task, bool wait = false, int to_ms = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
// watch.reset();
|
|
||||||
// bool first = true;
|
|
||||||
// while(scanning_)
|
|
||||||
// {
|
|
||||||
// if(res_(TASK_CAPTURER, true, 3))
|
|
||||||
// {
|
|
||||||
// if(!first)
|
|
||||||
// {
|
|
||||||
// uint64_t now = 0;
|
|
||||||
|
|
||||||
// utils::get_memory_usage(nullptr, &now, nullptr);
|
|
||||||
// utils::to_log(LOG_LEVEL_DEBUG, "Resources OK: %lld\n", now);
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// if(first)
|
|
||||||
// {
|
|
||||||
// uint64_t now = 0;
|
|
||||||
|
|
||||||
// first = false;
|
|
||||||
// utils::get_memory_usage(nullptr, &now, nullptr);
|
|
||||||
// utils::to_log(LOG_LEVEL_WARNING, "Resources have reached their maximum limit: %lld\n", now);
|
|
||||||
// }
|
|
||||||
// if(watch.elapse_s() >= 3)
|
|
||||||
// {
|
|
||||||
// uint64_t now = 0;
|
|
||||||
|
|
||||||
// utils::get_memory_usage(nullptr, &now, nullptr);
|
|
||||||
// utils::to_log(LOG_LEVEL_FATAL, "Resources is not enough(memory = %lld) for continue scanning, exit scanning now.\n", now);
|
|
||||||
// auto_scan_ = scanning_ = false;
|
|
||||||
// err = SCANNER_ERR_INSUFFICIENT_MEMORY;
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// std::this_thread::sleep_for(std::chrono::milliseconds(3));
|
|
||||||
// }
|
|
|
@ -402,6 +402,7 @@ public:
|
||||||
#define FUNCTION_PROTO_PARAMETERS dyn_mem_ptr, uint32_t*, packet_data_base_ptr*
|
#define FUNCTION_PROTO_PARAMETERS dyn_mem_ptr, uint32_t*, packet_data_base_ptr*
|
||||||
#define FUNCTION_PROTO_COMMAND_HANDLE dyn_mem_ptr(FUNCTION_PROTO_PARAMETERS)
|
#define FUNCTION_PROTO_COMMAND_HANDLE dyn_mem_ptr(FUNCTION_PROTO_PARAMETERS)
|
||||||
|
|
||||||
|
// #define USE_THREAD_PAGED_DATA
|
||||||
#define REBUILD_IN_CIS_THREAD
|
#define REBUILD_IN_CIS_THREAD
|
||||||
|
|
||||||
#define SENDER_PROTO data_source_ptr ptr, void* param
|
#define SENDER_PROTO data_source_ptr ptr, void* param
|
||||||
|
|
|
@ -8,9 +8,9 @@
|
||||||
|
|
||||||
#include <math.h> // for fabs
|
#include <math.h> // for fabs
|
||||||
|
|
||||||
#define SIZE_KB(n) ((n) * 1024)
|
#define SIZE_KB(n) ((long)(n) * 1024)
|
||||||
#define SIZE_MB(n) SIZE_KB((n) * 1024)
|
#define SIZE_MB(n) SIZE_KB((long)(n) * 1024)
|
||||||
#define SIZE_GB(n) SIZE_MB((n) * 1024)
|
#define SIZE_GB(n) SIZE_MB((long)(n) * 1024)
|
||||||
|
|
||||||
#define USEC_2_NS(us) ((long)(us) * 1000)
|
#define USEC_2_NS(us) ((long)(us) * 1000)
|
||||||
#define MSEC_2_US(ms) ((long)(ms) * 1000)
|
#define MSEC_2_US(ms) ((long)(ms) * 1000)
|
||||||
|
|
|
@ -60,8 +60,8 @@ add_packagedirs("sdk")
|
||||||
add_defines("BUILD_AS_DEVICE")
|
add_defines("BUILD_AS_DEVICE")
|
||||||
add_defines("VER_MAIN=2")
|
add_defines("VER_MAIN=2")
|
||||||
add_defines("VER_FAMILY=200")
|
add_defines("VER_FAMILY=200")
|
||||||
add_defines("VER_DATE=20240301")
|
add_defines("VER_DATE=20240308")
|
||||||
add_defines("VER_BUILD=20")
|
add_defines("VER_BUILD=8")
|
||||||
|
|
||||||
target("conf")
|
target("conf")
|
||||||
set_kind("phony")
|
set_kind("phony")
|
||||||
|
|
Loading…
Reference in New Issue