diff --git a/libqdmetadata/qdMetaData.cpp b/libqdmetadata/qdMetaData.cpp index 4635540c..6b5b30e1 100644 --- a/libqdmetadata/qdMetaData.cpp +++ b/libqdmetadata/qdMetaData.cpp @@ -64,6 +64,13 @@ static int validateAndMap(private_handle_t* handle) { return 0; } +static void unmapAndReset(private_handle_t *handle) { + if (private_handle_t::validate(handle) == 0 && handle->base_metadata) { + munmap(reinterpret_cast(handle->base_metadata), getMetaDataSize()); + handle->base_metadata = 0; + } +} + int setMetaData(private_handle_t *handle, DispParamType paramType, void *param) { auto err = validateAndMap(handle); @@ -349,3 +356,17 @@ int copyMetaDataVaToVa(MetaData_t *src_data, MetaData_t *dst_data) { return 0; } +int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType, + void *param) { + auto ret = setMetaData(handle, paramType, param); + unmapAndReset(handle); + return ret; +} + +int getMetaDataAndUnmap(struct private_handle_t *handle, + enum DispFetchParamType paramType, + void *param) { + auto ret = getMetaData(handle, paramType, param); + unmapAndReset(handle); + return ret; +} diff --git a/libqdmetadata/qdMetaData.h b/libqdmetadata/qdMetaData.h index ad2a2a9c..f081f6bf 100644 --- a/libqdmetadata/qdMetaData.h +++ b/libqdmetadata/qdMetaData.h @@ -210,6 +210,14 @@ int clearMetaDataVa(struct MetaData_t *data, enum DispParamType paramType); unsigned long getMetaDataSize(); +// Map, access metadata and unmap. Used by clients that do not import/free but +// clone and delete native_handle +int setMetaDataAndUnmap(struct private_handle_t *handle, enum DispParamType paramType, + void *param); +int getMetaDataAndUnmap(struct private_handle_t *handle, + enum DispFetchParamType paramType, + void *param); + #ifdef __cplusplus } #endif