mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-17 22:46:15 +02:00
eeshow/: simple caching of sheets
We only reuse previous sheets if ...
- they have no sub-sheets, and
- all the libraries are identical.
This reduces the -N-150 time from 8.3 s (caching only libraries) to 4.3 s.
Since we only need to know whether there are sub-sheets, but not what
exactly they are, we can also partially undo the previous commit,
77c0e07590
This commit is contained in:
parent
77c0e07590
commit
8f352832e0
@ -161,7 +161,7 @@ static void *diff_init(int argc, char *const *argv)
|
|||||||
for (arg = optind; arg != argc - 1; arg++)
|
for (arg = optind; arg != argc - 1; arg++)
|
||||||
if (!lib_parse(&new_lib, argv[arg], &sch_file))
|
if (!lib_parse(&new_lib, argv[arg], &sch_file))
|
||||||
goto fail_parse;
|
goto fail_parse;
|
||||||
if (!sch_parse(&new_sch, &sch_file, &new_lib))
|
if (!sch_parse(&new_sch, &sch_file, &new_lib, NULL))
|
||||||
goto fail_parse;
|
goto fail_parse;
|
||||||
file_close(&sch_file);
|
file_close(&sch_file);
|
||||||
|
|
||||||
|
13
eeshow/gui.c
13
eeshow/gui.c
@ -66,6 +66,7 @@ struct gui_hist {
|
|||||||
|
|
||||||
/* caching support */
|
/* caching support */
|
||||||
void **oids; /* file object IDs */
|
void **oids; /* file object IDs */
|
||||||
|
struct sch_ctx sch_ctx;
|
||||||
struct lib lib; /* combined library */
|
struct lib lib; /* combined library */
|
||||||
|
|
||||||
struct gui_hist *next;
|
struct gui_hist *next;
|
||||||
@ -964,7 +965,6 @@ static const struct sheet *parse_files(struct gui_hist *hist,
|
|||||||
int n_args, char **args, bool recurse, const struct gui_hist *prev)
|
int n_args, char **args, bool recurse, const struct gui_hist *prev)
|
||||||
{
|
{
|
||||||
char *rev = NULL;
|
char *rev = NULL;
|
||||||
struct sch_ctx sch_ctx;
|
|
||||||
struct file sch_file;
|
struct file sch_file;
|
||||||
struct file lib_files[n_args - 1];
|
struct file lib_files[n_args - 1];
|
||||||
int libs_open, i;
|
int libs_open, i;
|
||||||
@ -974,13 +974,13 @@ static const struct sheet *parse_files(struct gui_hist *hist,
|
|||||||
if (hist->vcs_hist)
|
if (hist->vcs_hist)
|
||||||
rev = vcs_git_get_rev(hist->vcs_hist);
|
rev = vcs_git_get_rev(hist->vcs_hist);
|
||||||
|
|
||||||
sch_init(&sch_ctx, recurse);
|
sch_init(&hist->sch_ctx, recurse);
|
||||||
ok = file_open_revision(&sch_file, rev, args[n_args - 1], NULL);
|
ok = file_open_revision(&sch_file, rev, args[n_args - 1], NULL);
|
||||||
|
|
||||||
if (rev)
|
if (rev)
|
||||||
free(rev);
|
free(rev);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
sch_free(&sch_ctx);
|
sch_free(&hist->sch_ctx);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1010,7 +1010,8 @@ static const struct sheet *parse_files(struct gui_hist *hist,
|
|||||||
if (!lib_parse_file(&hist->lib, lib_files +i))
|
if (!lib_parse_file(&hist->lib, lib_files +i))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (!sch_parse(&sch_ctx, &sch_file, &hist->lib))
|
if (!sch_parse(&hist->sch_ctx, &sch_file, &hist->lib,
|
||||||
|
libs_cached ? &prev->sch_ctx : NULL))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
for (i = 0; i != libs_open; i++)
|
for (i = 0; i != libs_open; i++)
|
||||||
@ -1024,12 +1025,12 @@ static const struct sheet *parse_files(struct gui_hist *hist,
|
|||||||
* with - when sharing unchanged item - possibly many duplicate
|
* with - when sharing unchanged item - possibly many duplicate
|
||||||
* pointers.
|
* pointers.
|
||||||
*/
|
*/
|
||||||
return sch_ctx.sheets;
|
return hist->sch_ctx.sheets;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
while (libs_open--)
|
while (libs_open--)
|
||||||
file_close(lib_files + libs_open);
|
file_close(lib_files + libs_open);
|
||||||
sch_free(&sch_ctx);
|
sch_free(&hist->sch_ctx);
|
||||||
lib_free(&hist->lib);
|
lib_free(&hist->lib);
|
||||||
file_close(&sch_file);
|
file_close(&sch_file);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -215,7 +215,7 @@ found:
|
|||||||
|
|
||||||
optind = 0; /* reset getopt */
|
optind = 0; /* reset getopt */
|
||||||
|
|
||||||
if (!sch_parse(&sch_ctx, &sch_file, &lib))
|
if (!sch_parse(&sch_ctx, &sch_file, &lib, NULL))
|
||||||
return 1;
|
return 1;
|
||||||
file_close(&sch_file);
|
file_close(&sch_file);
|
||||||
|
|
||||||
|
@ -288,9 +288,9 @@ static struct sheet *new_sheet(struct sch_ctx *ctx)
|
|||||||
sheet->next_obj = &sheet->objs;
|
sheet->next_obj = &sheet->objs;
|
||||||
sheet->next = NULL;
|
sheet->next = NULL;
|
||||||
|
|
||||||
sheet->children = NULL;
|
sheet->has_children = 0;
|
||||||
sheet->next_child = &sheet->children;
|
|
||||||
sheet->next_sib = NULL;
|
sheet->oid = NULL;
|
||||||
|
|
||||||
sheet->parent = ctx->curr_sheet;
|
sheet->parent = ctx->curr_sheet;
|
||||||
ctx->curr_sheet = sheet;
|
ctx->curr_sheet = sheet;
|
||||||
@ -312,27 +312,44 @@ static void end_sheet(struct sch_ctx *ctx)
|
|||||||
static bool parse_line(const struct file *file, void *user, const char *line);
|
static bool parse_line(const struct file *file, void *user, const char *line);
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
static const struct sheet *recurse_sheet(struct sch_ctx *ctx,
|
static const struct sheet *recurse_sheet(struct sch_ctx *ctx,
|
||||||
const struct file *related)
|
const struct file *related)
|
||||||
{
|
{
|
||||||
const char *name = ctx->obj.u.sheet.file;
|
const char *name = ctx->obj.u.sheet.file;
|
||||||
struct sheet *sheet;
|
struct sheet *sheet;
|
||||||
struct file file;
|
struct file file;
|
||||||
|
void *oid;
|
||||||
bool res;
|
bool res;
|
||||||
|
|
||||||
if (!file_open(&file, name, related))
|
if (!file_open(&file, name, related))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sheet = new_sheet(ctx);
|
sheet = new_sheet(ctx);
|
||||||
|
oid = file_oid(&file);
|
||||||
|
sheet->oid = oid;
|
||||||
|
|
||||||
|
if (ctx->prev && oid) {
|
||||||
|
const struct sheet *other;
|
||||||
|
|
||||||
|
for (other = ctx->prev->sheets; other; other = other->next)
|
||||||
|
if (!other->has_children &&
|
||||||
|
file_oid_eq(other->oid, oid)) {
|
||||||
|
end_sheet(ctx);
|
||||||
|
sheet->title = other->title;
|
||||||
|
sheet->objs = other->objs;
|
||||||
|
return sheet;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ctx->state = sch_descr;
|
ctx->state = sch_descr;
|
||||||
res = file_read(&file, parse_line, ctx);
|
res = file_read(&file, parse_line, ctx);
|
||||||
file_close(&file);
|
file_close(&file);
|
||||||
if (!res)
|
if (!res)
|
||||||
return NULL; /* caller MUST clean up */
|
return NULL; /* leave it to caller to clean up */
|
||||||
end_sheet(ctx);
|
end_sheet(ctx);
|
||||||
|
|
||||||
*ctx->curr_sheet->next_child = sheet;
|
ctx->curr_sheet->has_children = 1;
|
||||||
ctx->curr_sheet->next_child = &sheet->next_sib;
|
|
||||||
sheet->next_sib = NULL;
|
|
||||||
|
|
||||||
return sheet;
|
return sheet;
|
||||||
}
|
}
|
||||||
@ -560,9 +577,11 @@ static bool parse_line(const struct file *file, void *user, const char *line)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool sch_parse(struct sch_ctx *ctx, struct file *file, const struct lib *lib)
|
bool sch_parse(struct sch_ctx *ctx, struct file *file, const struct lib *lib,
|
||||||
|
const struct sch_ctx *prev)
|
||||||
{
|
{
|
||||||
ctx->lib = lib;
|
ctx->lib = lib;
|
||||||
|
ctx->prev = prev;
|
||||||
return file_read(file, parse_line, ctx);
|
return file_read(file, parse_line, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -611,6 +630,7 @@ static void free_sheet(struct sheet *sch)
|
|||||||
if (!sch)
|
if (!sch)
|
||||||
return;
|
return;
|
||||||
free((char *) sch->title);
|
free((char *) sch->title);
|
||||||
|
free(sch->oid);
|
||||||
for (obj = sch->objs; obj; obj = next) {
|
for (obj = sch->objs; obj; obj = next) {
|
||||||
next = obj->next;
|
next = obj->next;
|
||||||
switch (obj->type) {
|
switch (obj->type) {
|
||||||
|
13
eeshow/sch.h
13
eeshow/sch.h
@ -99,9 +99,10 @@ struct sheet {
|
|||||||
struct sheet *parent;
|
struct sheet *parent;
|
||||||
struct sheet *next;
|
struct sheet *next;
|
||||||
|
|
||||||
struct sheet *children; /* "child" sub-sheets */
|
bool has_children; /* aka sub-sheets */
|
||||||
struct sheet **next_child;
|
|
||||||
struct sheet *next_sib; /* siblings sub-sheets of this sheet */
|
/* caching */
|
||||||
|
void *oid;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sch_ctx {
|
struct sch_ctx {
|
||||||
@ -115,6 +116,9 @@ struct sch_ctx {
|
|||||||
struct sheet *sheets;
|
struct sheet *sheets;
|
||||||
struct sheet **next_sheet;
|
struct sheet **next_sheet;
|
||||||
|
|
||||||
|
/* for caching */
|
||||||
|
const struct sch_ctx *prev;
|
||||||
|
|
||||||
const struct lib *lib;
|
const struct lib *lib;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -122,7 +126,8 @@ struct sch_ctx {
|
|||||||
void decode_alignment(struct text *txt, char hor, char vert);
|
void decode_alignment(struct text *txt, char hor, char vert);
|
||||||
|
|
||||||
void sch_render(const struct sheet *sheet);
|
void sch_render(const struct sheet *sheet);
|
||||||
bool sch_parse(struct sch_ctx *ctx, struct file *file, const struct lib *lib);
|
bool sch_parse(struct sch_ctx *ctx, struct file *file, const struct lib *lib,
|
||||||
|
const struct sch_ctx *prev);
|
||||||
void sch_init(struct sch_ctx *ctx, bool recurse);
|
void sch_init(struct sch_ctx *ctx, bool recurse);
|
||||||
void sch_free(struct sch_ctx *ctx);
|
void sch_free(struct sch_ctx *ctx);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user