loader: Simplify handle allocation and refcounting.

This commit is contained in:
Adam Jackson 2009-01-26 07:47:46 -05:00
parent 0bad0552bf
commit 28b6b1519c

View File

@ -77,20 +77,9 @@
extern void *xorg_symbols[]; extern void *xorg_symbols[];
/*
* handles are used to identify files that are loaded. Even archives
* are counted as a single file.
*/
#define MAX_HANDLE 256 #define MAX_HANDLE 256
#define HANDLE_FREE 0
#define HANDLE_USED 1
static char freeHandles[MAX_HANDLE];
static int refCount[MAX_HANDLE]; static int refCount[MAX_HANDLE];
/*
* modules are used to identify compilation units (ie object modules).
* Archives contain multiple modules, each of which is treated seperately.
*/
static int moduleseq = 0; static int moduleseq = 0;
/* Prototypes for static functions. */ /* Prototypes for static functions. */
@ -250,7 +239,7 @@ LoaderOpen(const char *module, const char *cname, int handle,
* Find a free handle. * Find a free handle.
*/ */
new_handle = 1; new_handle = 1;
while (freeHandles[new_handle] && new_handle < MAX_HANDLE) while (refCount[new_handle] && new_handle < MAX_HANDLE)
new_handle++; new_handle++;
if (new_handle == MAX_HANDLE) { if (new_handle == MAX_HANDLE) {
@ -262,7 +251,6 @@ LoaderOpen(const char *module, const char *cname, int handle,
return -1; return -1;
} }
freeHandles[new_handle] = HANDLE_USED;
refCount[new_handle] = 1; refCount[new_handle] = 1;
tmp = _LoaderListPush(); tmp = _LoaderListPush();
@ -276,7 +264,7 @@ LoaderOpen(const char *module, const char *cname, int handle,
if ((tmp->private = DLLoadModule(tmp, flags)) == NULL) { if ((tmp->private = DLLoadModule(tmp, flags)) == NULL) {
xf86Msg(X_ERROR, "Failed to load %s\n", module); xf86Msg(X_ERROR, "Failed to load %s\n", module);
_LoaderListPop(new_handle); _LoaderListPop(new_handle);
freeHandles[new_handle] = HANDLE_FREE; refCount[new_handle] = 0;
if (errmaj) if (errmaj)
*errmaj = LDR_NOLOAD; *errmaj = LDR_NOLOAD;
if (errmin) if (errmin)
@ -293,7 +281,7 @@ LoaderHandleOpen(int handle)
if (handle < 0 || handle >= MAX_HANDLE) if (handle < 0 || handle >= MAX_HANDLE)
return -1; return -1;
if (freeHandles[handle] != HANDLE_USED) if (!refCount[handle])
return -1; return -1;
refCount[handle]++; refCount[handle]++;
@ -342,8 +330,6 @@ LoaderUnload(int handle)
free(tmp); free(tmp);
} }
freeHandles[handle] = HANDLE_FREE;
return 0; return 0;
} }