static int drm_tegra_wrap(struct drm_tegra **drmp, int fd, bool close) { struct drm_tegra *drm; if (fd < 0 || !drmp) return -EINVAL; drm = calloc(1, sizeof(*drm)); if (!drm) return -ENOMEM; drm->close = close; drm->fd = fd; drm_tegra_bo_cache_init(&drm->bo_cache, false); drm->handle_table = drmHashCreate(); drm->name_table = drmHashCreate(); DRMINITLISTHEAD(&drm->mmap_cache.list); if (!drm->handle_table || !drm->name_table) return -ENOMEM; drm_tegra_setup_debug(drm); *drmp = drm; return 0; }
static struct fd_device * fd_device_new_impl(int fd) { struct fd_device *dev; drmVersionPtr version; /* figure out if we are kgsl or msm drm driver: */ version = drmGetVersion(fd); if (!version) { ERROR_MSG("cannot get version: %s", strerror(errno)); return NULL; } if (!strcmp(version->name, "kgsl")) { DEBUG_MSG("kgsl DRM device"); dev = kgsl_device_new(fd); } else if (!strcmp(version->name, "msm")) { DEBUG_MSG("msm DRM device"); dev = msm_device_new(fd); } else { ERROR_MSG("unknown device: %s", version->name); dev = NULL; } if (!dev) return NULL; atomic_set(&dev->refcnt, 1); dev->fd = fd; dev->handle_table = drmHashCreate(); dev->name_table = drmHashCreate(); init_cache_buckets(dev); return dev; }
struct etna_device * etna_device_new(int fd) { struct etna_device *dev = calloc(sizeof(*dev), 1); if (!dev) return NULL; atomic_set(&dev->refcnt, 1); dev->fd = fd; dev->handle_table = drmHashCreate(); dev->name_table = drmHashCreate(); init_cache_buckets(dev); return dev; }
void hash_create(struct locked_hash_table *table) { pthread_rwlock_init(&table->lock, NULL); table->table = drmHashCreate(); if (!table->table) { ERROR_MSG("failed to create hash table"); exit(1); } }
static struct omap_device * omap_device_new_impl(int fd) { struct omap_device *dev = calloc(sizeof(*dev), 1); if (!dev) return NULL; dev->fd = fd; atomic_set(&dev->refcnt, 1); dev->handle_table = drmHashCreate(); return dev; }
struct fd_device * fd_device_new(int fd) { struct fd_device *dev = NULL; int key = fd; pthread_mutex_lock(&table_lock); if (!dev_table) dev_table = drmHashCreate(); if (drmHashLookup(dev_table, key, (void **)&dev)) { dev = fd_device_new_impl(fd); if (dev) drmHashInsert(dev_table, key, dev); } else { dev = fd_device_ref(dev); } pthread_mutex_unlock(&table_lock); return dev; }
drm_public struct omap_device * omap_device_new(int fd) { struct omap_device *dev = NULL; pthread_mutex_lock(&table_lock); if (!dev_table) dev_table = drmHashCreate(); if (drmHashLookup(dev_table, fd, (void **)&dev)) { /* not found, create new device */ dev = omap_device_new_impl(fd); drmHashInsert(dev_table, fd, dev); } else { /* found, just incr refcnt */ dev = omap_device_ref(dev); } pthread_mutex_unlock(&table_lock); return dev; }
int main(void) { HashTablePtr table; unsigned long i; int ret = 0; printf("\n***** 256 consecutive integers ****\n"); table = drmHashCreate(); for (i = 0; i < 256; i++) drmHashInsert(table, i, (void *)(i << 16 | i)); for (i = 0; i < 256; i++) ret |= check_table(table, i, (void *)(i << 16 | i)); compute_dist(table); drmHashDestroy(table); printf("\n***** 1024 consecutive integers ****\n"); table = drmHashCreate(); for (i = 0; i < 1024; i++) drmHashInsert(table, i, (void *)(i << 16 | i)); for (i = 0; i < 1024; i++) ret |= check_table(table, i, (void *)(i << 16 | i)); compute_dist(table); drmHashDestroy(table); printf("\n***** 1024 consecutive page addresses (4k pages) ****\n"); table = drmHashCreate(); for (i = 0; i < 1024; i++) drmHashInsert(table, i*4096, (void *)(i << 16 | i)); for (i = 0; i < 1024; i++) ret |= check_table(table, i*4096, (void *)(i << 16 | i)); compute_dist(table); drmHashDestroy(table); printf("\n***** 1024 random integers ****\n"); table = drmHashCreate(); srandom(0xbeefbeef); for (i = 0; i < 1024; i++) drmHashInsert(table, random(), (void *)(i << 16 | i)); srandom(0xbeefbeef); for (i = 0; i < 1024; i++) ret |= check_table(table, random(), (void *)(i << 16 | i)); srandom(0xbeefbeef); for (i = 0; i < 1024; i++) ret |= check_table(table, random(), (void *)(i << 16 | i)); compute_dist(table); drmHashDestroy(table); printf("\n***** 5000 random integers ****\n"); table = drmHashCreate(); srandom(0xbeefbeef); for (i = 0; i < 5000; i++) drmHashInsert(table, random(), (void *)(i << 16 | i)); srandom(0xbeefbeef); for (i = 0; i < 5000; i++) ret |= check_table(table, random(), (void *)(i << 16 | i)); srandom(0xbeefbeef); for (i = 0; i < 5000; i++) ret |= check_table(table, random(), (void *)(i << 16 | i)); compute_dist(table); drmHashDestroy(table); return ret; }