I have an issue with clRelease functions (clReleaseContext, …). I developped a C++ library to manage easily OpenCL functions and a test application to control its working.
This application works fine and all clRelease functions are call with success.
Then I developped an other library that uses the first lib to use OpenCL and a test application to control its working.
This application stops when I try to enter in the first clRelease functions namely clReleaseContext.
The same problem appears with Intel and NVidia OpenCL driver. So this is not a driver problem but a usage problem.
OpenCL -> LIB_A -> TEST_APP_A : OK
OpenCL -> LIB_A -> LIB_B -> TEST_APP_B : not OK
Is someone could help me to find the problem?
I have to precise that I use boost shared_ptr in all the library to manage pointers.
I found a solution but I still don’t understand the problem.
Here is the architecture:
class A is a singleton and creates the context.
class B is a singleton and have the member static A* instance.
If I remove the static member of A* in class B and I give the instantiation of A to other functions calls to clRelease functions work fine.
So this is the only way to avoid the issue, but I don’t understand why I can’t have a static instantiation of a singleton in a class.
On the face of it, I don’t know of any reason why you can’t use a singleton but I have the following suggestions:
[li]Check the error codes returned by every single OpenCL function. You probably do but I’m just being certain.[/li][li]Make sure that the number of calls to clReleaseContext for the context in A matches the number of times that clRetainContext was called plus one for creating the context (implicit retain).[/li][/list]