diff options
author | Dave Airlie <airlied@linux.ie> | 2006-11-09 08:55:58 +1100 |
---|---|---|
committer | Dave Airlie <airlied@linux.ie> | 2006-11-09 08:55:58 +1100 |
commit | d51e1bb56ca2f7858cdeac6f61a7b747c1e15b1e (patch) | |
tree | 8429bf14870162d0a973918a35cc02cda908dc0e /libdrm/xf86drm.c | |
parent | 79038751ffe47ed1ce82766e027d98fd2f0e2c6a (diff) |
libdrm: add drmOpenOnce + drmCloseOnce to libdrm
Diffstat (limited to 'libdrm/xf86drm.c')
-rw-r--r-- | libdrm/xf86drm.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c index 05b40f7a..56450e80 100644 --- a/libdrm/xf86drm.c +++ b/libdrm/xf86drm.c @@ -3215,3 +3215,64 @@ int drmMMUnlock(int fd, unsigned memType) return ret; } + +#define DRM_MAX_FDS 16 +static struct { + char *BusID; + int fd; + int refcount; +} connection[DRM_MAX_FDS]; + +static int nr_fds = 0; + +int drmOpenOnce(void *unused, + const char *BusID, + int *newlyopened) +{ + int i; + int fd; + + for (i = 0; i < nr_fds; i++) + if (strcmp(BusID, connection[i].BusID) == 0) { + connection[i].refcount++; + *newlyopened = 0; + return connection[i].fd; + } + + fd = drmOpen(unused, BusID); + if (fd <= 0 || nr_fds == DRM_MAX_FDS) + return fd; + + connection[nr_fds].BusID = strdup(BusID); + connection[nr_fds].fd = fd; + connection[nr_fds].refcount = 1; + *newlyopened = 1; + + if (0) + fprintf(stderr, "saved connection %d for %s %d\n", + nr_fds, connection[nr_fds].BusID, + strcmp(BusID, connection[nr_fds].BusID)); + + nr_fds++; + + return fd; +} + +void drmCloseOnce(int fd) +{ + int i; + + for (i = 0; i < nr_fds; i++) { + if (fd == connection[i].fd) { + if (--connection[i].refcount == 0) { + drmClose(connection[i].fd); + free(connection[i].BusID); + + if (i < --nr_fds) + connection[i] = connection[nr_fds]; + + return; + } + } + } +} |