fix error in recall when hours more than 300
This commit is contained in:
@@ -2183,11 +2183,76 @@ int parse_file_names_by_fltnum(int fltnum, char* domname, char** filenames, int
|
||||
//WW2023-11-01 end
|
||||
|
||||
//补招部分////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////20250801
|
||||
/* 最小块,每次至少扩容这么多;也可以调大一点 */
|
||||
#define RECALL_CHUNK 64
|
||||
|
||||
/* 初始化 */
|
||||
void recall_xml_init(recall_xml_t *rx) // ★
|
||||
{
|
||||
rx->work_cnt = rx->work_cap = 0;
|
||||
rx->new_cnt = rx->new_cap = 0;
|
||||
rx->work_recalls = rx->new_recalls = nullptr;
|
||||
}
|
||||
|
||||
/* 若需要,扩容 `*arr` 直到能放下 needed 条记录 */
|
||||
static int ensure_cap(recall_t **arr, int *cap, int need)
|
||||
{
|
||||
if (need <= *cap) return 0;
|
||||
|
||||
int new_cap = (*cap) ? (*cap) : 16;
|
||||
while (new_cap < need) new_cap <<= 1;
|
||||
|
||||
/* C++ 里要显式转换 */
|
||||
void *mem = realloc(*arr, new_cap * sizeof(recall_t));
|
||||
if (!mem) return -1;
|
||||
|
||||
*arr = static_cast<recall_t *>(mem); // ★ 显式 static_cast
|
||||
*cap = new_cap;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* push 到 work / new 数组 */
|
||||
static int push_work(recall_xml_t *rx, const recall_t *rec)
|
||||
{
|
||||
if (ensure_cap(&rx->work_recalls, &rx->work_cap, rx->work_cnt + 1))
|
||||
return -1;
|
||||
rx->work_recalls[rx->work_cnt++] = *rec;
|
||||
return 0;
|
||||
}
|
||||
static int push_new(recall_xml_t *rx, const recall_t *rec)
|
||||
{
|
||||
if (ensure_cap(&rx->new_recalls, &rx->new_cap, rx->new_cnt + 1))
|
||||
return -1;
|
||||
rx->new_recalls[rx->new_cnt++] = *rec;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 释放内存(栈退出前或不用时调用) */
|
||||
void recall_xml_free(recall_xml_t *rx) // ★
|
||||
{
|
||||
for (int i = 0; i < rx->work_cnt; ++i)
|
||||
free(rx->work_recalls[i].line_id);
|
||||
for (int i = 0; i < rx->new_cnt; ++i)
|
||||
free(rx->new_recalls[i].line_id);
|
||||
|
||||
free(rx->work_recalls);
|
||||
free(rx->new_recalls);
|
||||
|
||||
recall_xml_init(rx); /* 复位为全 0,防止悬挂指针 */
|
||||
}
|
||||
////////////////////////////20250801
|
||||
|
||||
void parse_recall(recall_xml_t* recall_xml, QString parentTag, QDomElement& recall_e, char* id)
|
||||
{
|
||||
recall_t recall;
|
||||
//recall_t recall;//lnk20250801
|
||||
|
||||
recall.line_id = id;
|
||||
//recall.line_id = id;
|
||||
|
||||
recall_t recall = {0};
|
||||
|
||||
recall.line_id = strdup(id); /* malloc 字符串 */
|
||||
|
||||
QDateTime start_dt = QDateTime::fromString(recall_e.attribute("StartTime"), "yyyy-MM-dd hh:mm:ss");
|
||||
recall.start_time = start_dt.toMSecsSinceEpoch() / 1000;
|
||||
@@ -2201,10 +2266,12 @@ void parse_recall(recall_xml_t* recall_xml, QString parentTag, QDomElement& reca
|
||||
<< " " << recall.start_time << " " << recall.end_time;
|
||||
|
||||
if (parentTag == "Work") {
|
||||
recall_xml->work_recalls[recall_xml->work_recall_num++] = recall;
|
||||
//recall_xml->work_recalls[recall_xml->work_recall_num++] = recall;
|
||||
push_work(recall_xml, &recall);
|
||||
}
|
||||
else if (parentTag == "New") {
|
||||
recall_xml->new_recalls[recall_xml->new_recall_num++] = recall;
|
||||
//recall_xml->new_recalls[recall_xml->new_recall_num++] = recall;
|
||||
push_new(recall_xml, &recall);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2295,7 +2362,7 @@ int parse_recall_xml(recall_xml_t* recall_xml, char* id)
|
||||
return APR_SUCCESS;
|
||||
}
|
||||
|
||||
void process_recall_config(recall_xml_t* recall_xml)
|
||||
/*void process_recall_config(recall_xml_t* recall_xml)
|
||||
{
|
||||
int i, j;
|
||||
recall_t* recall;
|
||||
@@ -2328,13 +2395,18 @@ void process_recall_config(recall_xml_t* recall_xml)
|
||||
if (LD_info->autorecallflag != 0 || LD_info->autorecallcount == 0) { //
|
||||
if (LD_info->autorecallcount != 0) {
|
||||
for (int j = 0; j < LD_info->autorecallcount; j++) {
|
||||
delete LD_info->autorecall[j];
|
||||
delete[] LD_info->autorecall[j];//避免重复释放lnk20250801
|
||||
}
|
||||
delete LD_info->autorecall;
|
||||
LD_info->autorecallcount = 0;
|
||||
}
|
||||
LD_info->autorecallcount = recall_num;
|
||||
LD_info->autorecall = new autorecall_t * [recall_num];
|
||||
|
||||
for (int k = 0; k < recall_num; ++k) {
|
||||
LD_info->autorecall[k] = nullptr; //避免野指针lnk20250801
|
||||
}
|
||||
|
||||
for (int j = 0; j < recall_num; j++) {
|
||||
printf("\n %d ===== %d\n", recall[j].start_time, recall[j].end_time);
|
||||
LD_info->autorecall[j] = new autorecall_t[1];
|
||||
@@ -2352,10 +2424,104 @@ void process_recall_config(recall_xml_t* recall_xml)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//调试
|
||||
printf("== autorecall count = %d ==\n", LD_info->autorecallcount);
|
||||
for (int j = 0; j < LD_info->autorecallcount; ++j) {
|
||||
if (LD_info->autorecall[j] == nullptr) {
|
||||
printf("autorecall[%d] = nullptr !!!\n", j);
|
||||
} else {
|
||||
printf("autorecall[%d] = %p | start = %d, end = %d\n",
|
||||
j, LD_info->autorecall[j],
|
||||
LD_info->autorecall[j]->start, LD_info->autorecall[j]->end);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}*/
|
||||
void process_recall_config(recall_xml_t *rx)
|
||||
{
|
||||
if (rx->new_cnt) {
|
||||
/* 预留空间 */
|
||||
if (ensure_cap(&rx->work_recalls, &rx->work_cap,
|
||||
rx->work_cnt + rx->new_cnt))
|
||||
return; /* 内存不足,直接返回 */
|
||||
|
||||
memcpy(&rx->work_recalls[rx->work_cnt],
|
||||
rx->new_recalls,
|
||||
rx->new_cnt * sizeof(recall_t));
|
||||
rx->work_cnt += rx->new_cnt;
|
||||
rx->new_cnt = 0;
|
||||
}
|
||||
|
||||
/* work 列表为空,直接结束 */
|
||||
if (rx->work_cnt == 0)
|
||||
return;
|
||||
|
||||
|
||||
recall_t *recall = rx->work_recalls;
|
||||
int recall_num = rx->work_cnt;
|
||||
|
||||
LD_info_t *LD_info = find_LD_info_only_from_mp_id(recall[0].line_id);
|
||||
printf("\n recall[0].line_id == %s \n", recall[0].line_id);
|
||||
printf("\n recall[0].start_time == %lld \n", recall[0].start_time);
|
||||
|
||||
if (!LD_info || LD_info->read_flag == 0) {
|
||||
printf("\n Find LD_info == null \n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("\n Find LD_info != null \n");
|
||||
|
||||
/* 若正在补招中则跳过;否则装载新补招队列 */
|
||||
if (LD_info->autorecallflag != 0 || LD_info->autorecallcount == 0) {
|
||||
|
||||
/* 先释放旧队列 */
|
||||
if (LD_info->autorecallcount != 0) {
|
||||
for (int j = 0; j < LD_info->autorecallcount; ++j)
|
||||
delete[] LD_info->autorecall[j]; /* 原逻辑 */
|
||||
delete LD_info->autorecall;
|
||||
LD_info->autorecallcount = 0;
|
||||
}
|
||||
|
||||
/* 重新分配新队列,大小 = recall_num */
|
||||
LD_info->autorecallcount = recall_num;
|
||||
LD_info->autorecall = new autorecall_t*[recall_num];
|
||||
|
||||
for (int k = 0; k < recall_num; ++k)
|
||||
LD_info->autorecall[k] = nullptr;
|
||||
|
||||
for (int j = 0; j < recall_num; ++j) {
|
||||
LD_info->autorecall[j] = new autorecall_t[1];
|
||||
LD_info->autorecall[j]->start = recall[j].start_time;
|
||||
LD_info->autorecall[j]->end = recall[j].end_time;
|
||||
LD_info->autorecall[j]->need_steady = recall[j].need_steady;
|
||||
LD_info->autorecall[j]->need_voltage = recall[j].need_voltage;
|
||||
|
||||
printf("\n %lld ===== %lld\n",
|
||||
recall[j].start_time, recall[j].end_time);
|
||||
}
|
||||
LD_info->autorecallflag = 0; /* 重置“正在补招”标志 */
|
||||
}
|
||||
|
||||
/* 调试输出 */
|
||||
if(DEBUGOPEN){
|
||||
printf("== autorecall count = %d ==\n", LD_info->autorecallcount);
|
||||
for (int j = 0; j < LD_info->autorecallcount; ++j) {
|
||||
if (!LD_info->autorecall[j])
|
||||
printf("autorecall[%d] = nullptr !!!\n", j);
|
||||
else
|
||||
printf("autorecall[%d] = %p | start = %lld, end = %lld\n",
|
||||
j, LD_info->autorecall[j],
|
||||
LD_info->autorecall[j]->start,
|
||||
LD_info->autorecall[j]->end);
|
||||
}
|
||||
}
|
||||
}
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void WebSocketThread::run()
|
||||
@@ -5881,7 +6047,7 @@ void clearLDInfo(LD_info_t *ld_info) {
|
||||
for (int i = 0; i < ld_info->autorecallcount; ++i) {
|
||||
if (ld_info->autorecall[i] != nullptr) {
|
||||
memset(ld_info->autorecall[i], 0, sizeof(autorecall_t));
|
||||
delete ld_info->autorecall[i]; //删除数组元素空间,如果有正在补招的内容,则已经申请空间,需要释放
|
||||
delete[] ld_info->autorecall[i]; //删除数组元素空间,如果有正在补招的内容,则已经申请空间,需要释放lnk20250801
|
||||
}
|
||||
}
|
||||
delete ld_info->autorecall; //删除数组空间
|
||||
|
||||
Reference in New Issue
Block a user