package com.amd.aparapi.internal.opencl; import com.amd.aparapi.ProfileInfo; import java.util.HashMap; import java.util.List; import java.util.Map; import com.amd.aparapi.device.OpenCLDevice; import com.amd.aparapi.internal.jni.OpenCLJNI; public class OpenCLProgram extends OpenCLJNI{ private final long programId; private final long queueId; private final long contextId; private final long profileInfo = 0L; private final OpenCLDevice device; private final String source; /** * FIXME Why are these not ConcurrentHashMaps or at least synchronized at a finer grain? */ private final Map<Object, OpenCLMem> instanceToMem = new HashMap<Object, OpenCLMem>(); private final Map<Long, OpenCLMem> addressToMem = new HashMap<Long, OpenCLMem>(); /** * Minimal constructor */ public OpenCLProgram(OpenCLDevice _device, String _source) { programId = 0; queueId = 0; contextId = 0; device = _device; source = _source; } /** * Full constructor * * @param _programId * @param _queueId * @param _contextId * @param _device * @param _source */ public OpenCLProgram(long _programId, long _queueId, long _contextId, OpenCLDevice _device, String _source) { programId = _programId; queueId = _queueId; contextId = _contextId; device = _device; source = _source; } public OpenCLProgram createProgram(OpenCLDevice context) { return createProgram(context, source); } public OpenCLDevice getDevice() { return device; } public synchronized OpenCLMem getMem(Object _instance, long _address) { OpenCLMem mem = instanceToMem.get(_instance); if (mem == null) { mem = addressToMem.get(_instance); if (mem != null) { System.out.println("object has been moved, we need to remap the buffer"); remap(this, mem, _address); } } return (mem); } public synchronized void add(Object _instance, long _address, OpenCLMem _mem) { instanceToMem.put(_instance, _mem); addressToMem.put(_address, _mem); } public synchronized void remapped(Object _instance, long _address, OpenCLMem _mem, long _oldAddress) { addressToMem.remove(_oldAddress); addressToMem.put(_address, _mem); } public void dispose(){ disposeProgram(this); } public List<ProfileInfo> getProfileInfo(){ return(getProfileInfo(this)); } }