Hi,
no there's no thread safe API to do what you want. You'd need a new function
CPLErrorHandler CPLSetErrorHandlerEx2( CPLErrorHandler
pfnErrorHandlerNew, void* pUserData, void** ppOldUserData )
to do that.
But as you mention threads that might compete to set an error handler,
using CPLSetErrorHandlerEx() is probably not the best strategy. You'd be
better with CPLPushErrorHandler() / CPLPopErrorHandler() that only
affects the current thread.
Even
Le 12/09/2021 à 16:03, Rajsekar Manokaran a écrit :
Hi,
In the gdal rust bindings (https://github.com/georust/gdal
<https://github.com/georust/gdal>), we're trying to facilitate the use
of CPLSetErrorHandlerEx and related APIs. While setting a handler, we
may pass a heap allocated data pointer to the second argument, which
is then read via the CPLGetErrorHandlerUserData in the handler and
passed to the user.
However, while removing or setting another handler, we're unable to
find a race-free method to get the associated user data of the
previous handler. This is needed to properly deallocate the memory.
Is there an atomic way to get both the previous handler (as returned
by CPLSetErrorHandler), along with the associated user data? The
issue with making two calls, is that another thread might make changes
in between the two calls.
We could synchronize in our API, but it still has the same issue if
the user parallely used the C APIs directly or via a different interface.
Relevant PR in rust gdal bindings:
https://github.com/georust/gdal/pull/215
<https://github.com/georust/gdal/pull/215>
-
Regards
_______________________________________________
gdal-dev mailing list
[email protected]
https://lists.osgeo.org/mailman/listinfo/gdal-dev
--
http://www.spatialys.com
My software is free, but my time generally not.
_______________________________________________
gdal-dev mailing list
[email protected]
https://lists.osgeo.org/mailman/listinfo/gdal-dev