Skip to content

Commit a1721c9

Browse files
committed
Rework range handling
1 parent c29aa89 commit a1721c9

File tree

2 files changed

+45
-28
lines changed

2 files changed

+45
-28
lines changed

range.c

+34-23
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ static int test_for_data_overlap(const struct ReportRecord *rec, struct list_hea
1919
{
2020
int ret=0;
2121
const struct Range *csum = &rec->checksum;
22-
struct ReportRecord *rr;
23-
list_for_each_entry(rr, records, list) {
22+
struct ReportRecordList *rrl;
23+
list_for_each_entry(rrl, records, list) {
24+
struct ReportRecord *rr = &rrl->rr;
2425
const struct RangeList *rl;
2526
if (strncmp(rec->name, rr->name, MAX_NAME_LENGTH)) {
2627
list_for_each_entry(rl, &rr->data.list, list) {
@@ -30,9 +31,8 @@ static int test_for_data_overlap(const struct ReportRecord *rec, struct list_hea
3031
rec->index, rec->name, rr->index, rr->name,
3132
csum->start, csum->end,
3233
data->start, data->end);
33-
rr->deps ++;
34+
rr->dep_errs ++;
3435
ret ++;
35-
// exit(-1);
3636
}
3737
}
3838
}
@@ -45,8 +45,9 @@ static int test_for_data_overlap(const struct ReportRecord *rec, struct list_hea
4545
static int test_for_csum_overlap(struct ReportRecord *rec, struct list_head *records, const struct Range *data)
4646
{
4747
int ret=0;
48-
struct ReportRecord *rr;
49-
list_for_each_entry(rr, records, list) {
48+
struct ReportRecordList *rrl;
49+
list_for_each_entry(rrl, records, list) {
50+
struct ReportRecord *rr = &rrl->rr;
5051
if (strncmp(rec->name, rr->name, MAX_NAME_LENGTH)) {
5152
const struct Range *csum = &rr->checksum;
5253
if (MAX(csum->start, data->start)<=MIN(csum->end, data->end)) {
@@ -64,18 +65,26 @@ static int test_for_csum_overlap(struct ReportRecord *rec, struct list_head *rec
6465

6566
struct ReportRecord *CreateRecord(const char *name, uint32_t start, int len)
6667
{
67-
struct ReportRecord *rr = calloc(1, sizeof(struct ReportRecord));
68+
struct ReportRecordList *rrl = calloc(1, sizeof(struct ReportRecordList));
69+
struct ReportRecord *rr = &rrl->rr;
6870
//fprintf(stderr,"******* CREATE %s *******\n", name);
6971
rr->name = strndup(name, MAX_NAME_LENGTH);
7072
INIT_LIST_HEAD(&rr->data.list);
7173
rr->checksum.start = start;
7274
rr->checksum.end = start+len-1;
73-
rr->index = list_entry(Records.prev, struct ReportRecord, list)->index+1;
75+
76+
if (!list_empty(&Records)) {
77+
struct ReportRecordList *prev =
78+
list_entry(Records.prev, struct ReportRecordList, list);
79+
rr->index = prev->rr.index+1;
80+
} else {
81+
rr->index = 1;
82+
}
83+
7484

7585
// check if this new checksum is in existing data ranges
7686
test_for_data_overlap(rr, &Records);
77-
78-
list_add_tail(&rr->list, &Records);
87+
list_add_tail(&rrl->list, &Records);
7988
return rr;
8089
}
8190

@@ -128,42 +137,44 @@ void AddRangeStartLength(struct ReportRecord *rr, uint32_t start, int len)
128137
list_add_tail(&rl->list, &rr->data.list);
129138
}
130139

131-
static void FreeRecord(struct ReportRecord *rr)
140+
static void FreeRecord(struct ReportRecordList *rrl)
132141
{
133142
struct RangeList *rl, *tmp;
134-
list_for_each_entry_safe(rl, tmp, &rr->data.list, list) {
143+
list_for_each_entry_safe(rl, tmp, &rrl->rr.data.list, list) {
135144
//struct RangeList *rl = list_entry(e, struct RangeList, list);
136145
list_del(&rl->list);
137146
free(rl);
138147
}
148+
struct ReportRecord *rr = &rrl->rr;
139149
if (rr->name) free(rr->name);
140150
if (rr->msg.pbuf) free(rr->msg.pbuf);
141-
free(rr);
151+
free(rrl);
142152
}
143153

144154
void PrintAllRecords(FILE *fh)
145155
{
146-
struct ReportRecord *rr;
147-
list_for_each_entry(rr, &Records, list) {
148-
PrintRecord(fh, rr);
156+
struct ReportRecordList *rrl;
157+
list_for_each_entry(rrl, &Records, list) {
158+
PrintRecord(fh, &rrl->rr);
149159
}
150160
}
151161

152162
void FreeAllRecords(void)
153163
{
154-
struct ReportRecord *rr, *tmp;
155-
list_for_each_entry_safe(rr, tmp, &Records, list) {
156-
list_del(&rr->list);
157-
FreeRecord(rr);
164+
struct ReportRecordList *rrl, *tmp;
165+
list_for_each_entry_safe(rrl, tmp, &Records, list) {
166+
list_del(&rrl->list);
167+
FreeRecord(rrl);
158168
}
159169
}
160170

161171
int ProcessRecordDeps(void)
162172
{
163173
int errs=0;
164-
struct ReportRecord *rr;
165-
list_for_each_entry(rr, &Records, list) {
166-
if (rr->deps) {
174+
struct ReportRecordList *rrl;
175+
list_for_each_entry(rrl, &Records, list) {
176+
struct ReportRecord *rr = &rrl->rr;
177+
if (rr->dep_errs) {
167178
if (rr->callback) {
168179
errs += rr->callback(rr->cb_data, rr);
169180
} else {

range.h

+11-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef _RANGE_H
22
#define _RANGE_H
33

4+
#include <stdio.h>
45
#include <stdint.h>
56

67
#include "str.h"
@@ -18,16 +19,21 @@ struct RangeList {
1819
};
1920

2021
struct ReportRecord {
21-
struct list_head list; /* MSVC doesn't have typeof, so list must always be first */
22-
22+
int index;
2323
char *name; /* name of this region */
2424
struct RangeList data; /* data ranges that it spans */
2525
struct Range checksum; /* range of checksum data */
26-
struct strbuf msg; /* error messages */
27-
int deps; /* other checksums found later that are in one of my ranges */
26+
struct strbuf msg; /* dependency messages */
27+
int dep_errs; /* number of other checksums found later that are in my data */
28+
2829
int (*callback)(void *, struct ReportRecord *);
2930
void *cb_data; /* pointer passed to callback */
30-
int index;
31+
};
32+
33+
struct ReportRecordList {
34+
struct list_head list; /* MSVC doesn't have typeof, so list must always
35+
be first */
36+
struct ReportRecord rr;
3137
};
3238

3339
extern struct ReportRecord *CreateRecord(const char *name, uint32_t start, int len);

0 commit comments

Comments
 (0)