调整整个锁的流程,在锁线程加上延时 暂时解决可能性的死锁(不一定待测试)

This commit is contained in:
13038267101 2022-12-12 18:18:53 +08:00
parent d5893e7cc5
commit 22a655c7e7
4 changed files with 127 additions and 23 deletions

View File

@ -155,7 +155,7 @@ hg_scanner::hg_scanner(ScannerSerial serial
, isremove_left_hole_threshold(0), isremove_right_hole_threshold(0), isremove_top_hole_threshold(0), isremove_low_hole_threshold(0)
, dump_usb_path_(""),is_kernelsnap_211209_(false), pid_(0), dump_img_(&hg_scanner::dump_image_empty), is_kernelsnap_220830_(false),is_kernelsnap3288_221106_(false)
, is_kernelsnap_221027_(false), memory_size_(1024/*USB+JPEG压缩及图像处理图队列总共1GB*/), isx86_Advan_(true), stop_fatal_(SCANNER_ERR_OK), is_auto_paper_scan(false)
,size_check(false), save_sleeptime_type_(false), is_kernelsnap_devsislock(false)
,size_check(false), save_sleeptime_type_(false), is_kernelsnap_devsislock(false), is_checksum_strat_scan(false)
{
#if !defined(_WIN32) && !defined(_WIN64) &&defined(x86_64)
isx86_Advan_ = false;
@ -322,6 +322,7 @@ void hg_scanner::thread_devslock_handle(void)
wait_devsislock_.wait();
while (is_firstopen_ && is_kernelsnap_devsislock)
{
std::this_thread::sleep_for(std::chrono::milliseconds(500));
ret = set_server_blacklist_lock();
hg_version_free_handle();
is_firstopen_ = false;
@ -461,46 +462,55 @@ int hg_scanner::set_server_blacklist_lock()
strcpy(snbuffer, sn.c_str());
strcpy(fvbuffer, fv.c_str());
sprintf(pidbuffer, "%0x", pid_);
HGResult ret = HGVersion_Islock_(HGVersion_mgr_, snbuffer, &islock);
if (ret != 0)
//优先从机器设备上进行校验
int ret = HGVersion_Islock_(HGVersion_mgr_, snbuffer, &islock);
int islock_file = 0;
if (ret != 0) //服务器没有连接到网络
{
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "net is 404:%d\n", ret);
return -1; //服务器没有连接到网络
ret = get_dev_islock_file(islock_file);
if (ret != SCANNER_ERR_OK || islock_file < 0); //设备文件和内容获取不到
{
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "net is :%d and not find devslistfile ,so scan with a checksum\n", 404);
ret = get_scan_islock(scan_islock);
if (ret == SCANNER_ERR_DEVICE_ISLOCK)
{
is_checksum_strat_scan = true; //通过校验码来进行扫描
}
return 1;
}
is_checksum_strat_scan = false;
islock_file == 0 ? set_scan_islock(0) : set_scan_islock(1);
return islock_file;
}
if (!islock)
{
set_dev_islock_file(0);
ret = get_scan_islock(scan_islock);
if (ret == SCANNER_ERR_DEVICE_ISLOCK)
{
ret = set_scan_islock(0); //解锁设备
ret = set_scan_islock(0);
if (ret != SCANNER_ERR_OK)
{
return ret;
}
ret = HGVersion_Postlog_(HGVersion_mgr_, pidbuffer, snbuffer, fv.substr(0, 4).c_str(), fvbuffer, islock); //发送日志到服务,第三个参数随意字符串但不能为NULL
if (ret != 0)
{
return -1; //服务器没有连接到网络
}
ret = HGVersion_Postlog_(HGVersion_mgr_, pidbuffer, snbuffer, fv.substr(0, 4).c_str(), fvbuffer, islock); //发送日志到服务,第三个参数随意字符串但不能为NULL
}
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "scanner go:%d\n", islock);
return 0;
}
ret = set_scan_islock(1); //锁定设备
set_dev_islock_file(1);
ret = set_scan_islock(1);
if (ret != SCANNER_ERR_OK)
{
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "Dev is locked err:%d\n", ret);
return ret;
}
ret = HGVersion_Postlog_(HGVersion_mgr_, pidbuffer, snbuffer, fv.substr(0,4).c_str(), fvbuffer, islock);
ret = HGVersion_Postlog_(HGVersion_mgr_, pidbuffer, snbuffer, fv.substr(0, 4).c_str(), fvbuffer, islock);
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "Dev is locked succeed:%d\n", ret);
if (ret != 0)
{
return -1; //服务器没有连接到网络
}
return ret = islock ? SCANNER_ERR_DEVICE_ISLOCK : SCANNER_ERR_OK;
return ret ;
}
void hg_scanner::hg_version_free_handle()
{
@ -3415,6 +3425,14 @@ int hg_scanner::clean_paper_road()
{
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner::get_dev_islock_file(int& islockfile)
{
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
int hg_scanner::set_dev_islock_file(int islockfile)
{
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
int hg_scanner::set_leaflet_scan(void)
{

View File

@ -264,7 +264,7 @@ protected:
virtual void thread_handle_usb_read(void) = 0;
virtual void thread_handle_islock_read();
int hg_version_init_handle();
int set_server_blacklist_lock();
int set_server_blacklist_lock(); // 0:不锁定 1:锁定
void hg_version_free_handle();
// adjust color or apply custom gamma
void adjust_color(hg_imgproc::HIMGPRC handle);
@ -273,6 +273,7 @@ protected:
hg_imgproc::HIMGPRC ImagePrc_pHandle_;
protected:
ScannerSerial serial_;
volatile bool is_checksum_strat_scan; //是否通过校验码来进行扫描,没有网络并且获取不到设备文件和设备文件信息时 才为true
volatile bool run_;
volatile bool user_cancel_;
platform_event wait_usb_;
@ -337,7 +338,6 @@ protected:
bool is_kernelsnap3288_221106_; //G300 3288 在221106版本支持真实dpi
bool is_kernelsnap_220430_; //待纸扫描
bool is_kernelsnap_devsislock;//支持设备锁的版本
SCANCONF img_conf_; //此参数外部不做任何改变请在writedown_image_configuration做修改
std::string img_type_;
@ -456,11 +456,13 @@ public:
virtual int get_device_log(string &log); //获取设备日志
virtual int set_devreboot(); //设置设备重启
virtual int set_devshtudown(); //设置设备关机
virtual int set_scan_islock(SANE_Bool set_islock); //设置设备是否锁定
virtual int get_scan_islock(SANE_Bool& islock); //获取设备是否锁定
virtual int set_scan_islock(SANE_Bool set_islock); //设置设备是否锁定 0解锁1锁定 ret
virtual int get_scan_islock(SANE_Bool& islock); //获取设备是否锁定 0解锁1锁定
virtual int set_scan_lock_check_val(string check_str); //获取设备是否锁定
virtual int firmware_upgrade(std::string filename); //固件升级
virtual int clean_paper_road(); //清理纸道
virtual int get_dev_islock_file(int &islockfile); //获取设备文件 设备锁状态 0 未上锁1 上锁。-1 未发现黑名单列表 -2列表当中没有信息
virtual int set_dev_islock_file(int islockfile); //设置设备文件 设备锁状态 0 未上锁1 上锁。
};
#ifdef UOS

View File

@ -392,7 +392,6 @@ void hg_scanner_239::init_version(void)
is_kernelsnap_220430_ = true;
else
is_kernelsnap_220430_ = false;
}
int hg_scanner_239::writedown_device_configuration(bool type, setting_hardware::HGSCANCONF_3399* dev_conf)
{
@ -1079,6 +1078,10 @@ int hg_scanner_239::start(void)
if (handled)
return ret;
if (is_checksum_strat_scan)
{
set_scan_lock_check_val("1AFE734C123F5FFCAD1113AD99A99006");
}
user_cancel_ = false;
ret = on_is_auto_paper(is_auto_paper_scan);
split3399_ = 0;
@ -1591,4 +1594,83 @@ int hg_scanner_239::clean_paper_road()
int ret = 0, len = 0;
ret = write_register(setting3399::SR_CLEAN_PAPER_ROAD, len);
return ret;
}
int hg_scanner_239::get_dev_islock_file(int& islockfile)
{
if (!is_kernelsnap_devsislock)
{
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "devs lock:%s \n", hg_scanner_err_name(SCANNER_ERR_DEVICE_NOT_SUPPORT));
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
string device_log_path = "/var/log/black_list_file.txt";
string str;
int ret = SCANNER_ERR_OK;
int buffersize = 0;
int len = device_log_path.size();
ret = write_register(setting3399::SR_SET_JSON_PATH, len);
if (ret == SCANNER_ERR_OK)
ret = io_->write_bulk(&device_log_path[0], &len);
if (ret == SCANNER_ERR_OK)
ret = read_register(setting3399::SR_GET_JSON_SIZE, &buffersize);
if (ret == SCANNER_ERR_OK && buffersize > 0)
ret = write_register(setting3399::SR_GET_JSON, buffersize);
if (ret == SCANNER_ERR_OK && buffersize > 0)
{
str.resize(buffersize);
ret = io_->read_bulk(&str[0], &buffersize);
}
if (ret == SCANNER_ERR_OK && str.size() > 0)
islockfile = std::stoi(str);
else
islockfile = -1;
VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "get list file is:%s ret:%s buffersize: %d\n", device_log_path.c_str(), hg_scanner_err_name(ret), buffersize);
return ret;
}
int hg_scanner_239::set_dev_islock_file(int islockfile)
{
if (!is_kernelsnap_devsislock)
{
VLOG_MINI_1(LOG_LEVEL_DEBUG_INFO, "devs lock:%s \n", hg_scanner_err_name(SCANNER_ERR_DEVICE_NOT_SUPPORT));
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
if (islockfile != 0 && islockfile != 1)
{
return SCANNER_ERR_INVALID_PARAMETER; //这个地方设置的参数必须保证正确
}
string device_log_path = "/var/log/black_list_file.txt";
string str = std::to_string(islockfile);
int ret = SCANNER_ERR_OK;
int buffersize = 0;
int len = device_log_path.size();
int lenstr = str.size();
io_->set_timeout(3000);
ret = write_register(setting3399::SR_SET_JSON_PATH, len);
if (ret != SCANNER_ERR_OK)
return ret;
ret = io_->write_bulk(&device_log_path[0], &len);
if (ret != SCANNER_ERR_OK)
return ret;
ret = write_register(setting3399::SR_SET_JSON, lenstr);
if (ret != SCANNER_ERR_OK)
return ret;
ret = io_->write_bulk(&str[0], &lenstr);
if (ret != SCANNER_ERR_OK)
return ret;
//VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "log path:%s ret:%s buffersize: %d\n", logpath.c_str(), hg_scanner_err_name(ret), buffersize);
//return ret;
return SCANNER_ERR_OK;
}

View File

@ -111,5 +111,7 @@ public:
virtual int set_scan_lock_check_val(string check_str);
virtual int firmware_upgrade(std::string filename);
virtual int clean_paper_road(); //清理纸道
virtual int get_dev_islock_file(int& islockfile); //获取设备文件 设备锁状态 0 未上锁1 上锁。
virtual int set_dev_islock_file(int islockfile); //设置设备文件 设备锁状态 0 未上锁1 上锁。
};