void pgstrom_setup_opencl_devinfo(List *dev_list) { pgstrom_platform_info *pl_info; pgstrom_platform_info *pl_info_sh; pgstrom_device_info **dev_array; ListCell *cell; Size length; int index; Assert(devinfo_shm_values->num_devices == 0); Assert(TopShmemContext != NULL); /* copy platform info into shared memory segment */ pl_info = ((pgstrom_device_info *) linitial(dev_list))->pl_info; length = offsetof(pgstrom_platform_info, buffer[pl_info->buflen]); pl_info_sh = pgstrom_shmem_alloc(TopShmemContext, length); if (!pl_info_sh) elog(ERROR, "out of shared memory"); memcpy(pl_info_sh, pl_info, length); PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_profile); PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_version); PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_name); PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_vendor); PLDEVINFO_SHIFT(pl_info_sh, pl_info, pl_extensions); /* copy device info into shared memory segment */ length = sizeof(pgstrom_device_info *) * list_length(dev_list); dev_array = pgstrom_shmem_alloc(TopShmemContext, length); if (!dev_array) elog(ERROR, "out of shared memory"); index = 0; foreach (cell, dev_list) { pgstrom_device_info *dev_info = lfirst(cell); pgstrom_device_info *dest; length = offsetof(pgstrom_device_info, buffer[dev_info->buflen]); dest = pgstrom_shmem_alloc(TopShmemContext, length); if (!dest) elog(ERROR, "out of shared memory"); memcpy(dest, dev_info, length); /* pointer adjustment */ dest->pl_info = pl_info_sh; PLDEVINFO_SHIFT(dest, dev_info, dev_device_extensions); PLDEVINFO_SHIFT(dest, dev_info, dev_name); PLDEVINFO_SHIFT(dest, dev_info, dev_opencl_c_version); PLDEVINFO_SHIFT(dest, dev_info, dev_profile); PLDEVINFO_SHIFT(dest, dev_info, dev_vendor); PLDEVINFO_SHIFT(dest, dev_info, dev_version); PLDEVINFO_SHIFT(dest, dev_info, driver_version); dev_array[index++] = dest; }
/* * Debugging facilities for shmem.c */ Datum pgstrom_shmem_alloc_func(PG_FUNCTION_ARGS) { #ifdef PGSTROM_DEBUG Size size = PG_GETARG_INT64(0); void *address; address = pgstrom_shmem_alloc(size); PG_RETURN_INT64((Size) address); #else elog(ERROR, "%s is not implemented for production release", __FUNCTION__); PG_RETURN_NULL(); #endif }