mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-14 10:09:48 +00:00
Momoize the results of isinstalledpkg()
PR: bin/116452 Submitted by: wollmann MFC after: 7 days
This commit is contained in:
parent
f4bb4fc8f3
commit
2704bd0e13
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=173291
@ -306,6 +306,17 @@ matchbyorigin(const char *origin, int *retval)
|
||||
return store->store;
|
||||
}
|
||||
|
||||
/*
|
||||
* Small linked list to memoize results of isinstalledpkg(). A hash table
|
||||
* would be faster but for n ~= 1000 may be overkill.
|
||||
*/
|
||||
struct iip_memo {
|
||||
LIST_ENTRY(iip_memo) iip_link;
|
||||
char *iip_name;
|
||||
int iip_result;
|
||||
};
|
||||
LIST_HEAD(, iip_memo) iip_memo = LIST_HEAD_INITIALIZER(iip_memo);
|
||||
|
||||
/*
|
||||
*
|
||||
* Return 1 if the specified package is installed,
|
||||
@ -314,18 +325,53 @@ matchbyorigin(const char *origin, int *retval)
|
||||
int
|
||||
isinstalledpkg(const char *name)
|
||||
{
|
||||
char buf[FILENAME_MAX];
|
||||
char buf2[FILENAME_MAX];
|
||||
int result;
|
||||
char *buf, *buf2;
|
||||
struct iip_memo *memo;
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s/%s", LOG_DIR, name);
|
||||
if (!isdir(buf) || access(buf, R_OK) == FAIL)
|
||||
return 0;
|
||||
LIST_FOREACH(memo, &iip_memo, iip_link) {
|
||||
if (strcmp(memo->iip_name, name) == 0)
|
||||
return memo->iip_result;
|
||||
}
|
||||
|
||||
buf2 = NULL;
|
||||
asprintf(&buf, "%s/%s", LOG_DIR, name);
|
||||
if (buf == NULL)
|
||||
goto errout;
|
||||
if (!isdir(buf) || access(buf, R_OK) == FAIL) {
|
||||
result = 0;
|
||||
} else {
|
||||
asprintf(&buf2, "%s/%s", buf, CONTENTS_FNAME);
|
||||
if (buf2 == NULL)
|
||||
goto errout;
|
||||
|
||||
snprintf(buf2, sizeof(buf2), "%s/%s", buf, CONTENTS_FNAME);
|
||||
if (!isfile(buf2) || access(buf2, R_OK) == FAIL)
|
||||
return -1;
|
||||
if (!isfile(buf2) || access(buf2, R_OK) == FAIL)
|
||||
result = -1;
|
||||
else
|
||||
result = 1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
free(buf);
|
||||
buf = strdup(name);
|
||||
if (buf == NULL)
|
||||
goto errout;
|
||||
free(buf2);
|
||||
buf2 = NULL;
|
||||
|
||||
memo = malloc(sizeof *memo);
|
||||
if (memo == NULL)
|
||||
goto errout;
|
||||
memo->iip_name = buf;
|
||||
memo->iip_result = result;
|
||||
LIST_INSERT_HEAD(&iip_memo, memo, iip_link);
|
||||
return result;
|
||||
|
||||
errout:
|
||||
if (buf != NULL)
|
||||
free(buf);
|
||||
if (buf2 != NULL)
|
||||
free(buf2);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user