diff --git a/display/buffer/hdi_service/BUILD.gn b/display/buffer/hdi_service/BUILD.gn index e2d64ac59a1a8947e317dbfe99fa3f054ebfbe09..3b1acb23aa4506310c4e91db22264732f2f402ef 100644 --- a/display/buffer/hdi_service/BUILD.gn +++ b/display/buffer/hdi_service/BUILD.gn @@ -35,6 +35,7 @@ ohos_shared_library("liballocator_service_1.0") { external_deps = [ "c_utils:utils", "drivers_interface_display:display_buffer_idl_headers", + "drivers_interface_display:display_buffer_idl_headers_1.2", "graphic_surface:buffer_handle", "hdf_core:libhdf_ipc_adapter", "hdf_core:libhdf_utils", diff --git a/display/buffer/hdi_service/include/allocator_service.h b/display/buffer/hdi_service/include/allocator_service.h index e7c2a9f5f5c6ed4cb41f8b6dc68b49ca43bc5a7c..4189d5c6eafb333bfe92c5efdda6327a87923189 100644 --- a/display/buffer/hdi_service/include/allocator_service.h +++ b/display/buffer/hdi_service/include/allocator_service.h @@ -36,6 +36,8 @@ private: int32_t LoadVdi(); void TimeBegin(struct timeval *firstTimeStamp); void TimeEnd(const char *func, int32_t time, struct timeval firstTimeStamp); + void WriteAllocPidToDma(int32_t fd); + void FreeMemVdi(BufferHandle* handle); std::mutex mutex_; void *libHandle_; IDisplayBufferVdi *vdiImpl_; diff --git a/display/buffer/hdi_service/src/allocator_service.cpp b/display/buffer/hdi_service/src/allocator_service.cpp index 65704676ab4bef74067083ba7ac6d94da569f38a..143000547d97587625d41bea8143a2667dbd0dd1 100644 --- a/display/buffer/hdi_service/src/allocator_service.cpp +++ b/display/buffer/hdi_service/src/allocator_service.cpp @@ -15,12 +15,16 @@ #include "allocator_service.h" +#include +#include +#include #include #include #include #include #include "display_log.h" #include "hdf_trace.h" +#include "hdf_remote_service.h" #undef LOG_TAG #define LOG_TAG "ALLOC_SRV" @@ -28,6 +32,7 @@ #define LOG_DOMAIN 0xD002515 #define TIME_1000 1000 #define TIME_10 10 +#define BUFF_SIZE 16 namespace OHOS { namespace HDI { @@ -128,41 +133,57 @@ void AllocatorService::TimeEnd(const char *func, int32_t time, struct timeval fi return; } +void AllocatorService::WriteAllocPidToDma(int32_t fd) +{ + pid_t remotePid = HdfRemoteGetCallingPid(); + char pidStr[BUFF_SIZE] = { 0 }; + if (sprintf_s(pidStr, BUFF_SIZE, "%d", remotePid) >= 0) { + ioctl(fd, DMA_BUF_SET_NAME_A, pidStr); + } +} + +void AllocatorService::FreeMemVdi(BufferHandle* handle) +{ + struct timeval firstTimeStamp; + TimeBegin(&firstTimeStamp); + { + HdfTrace traceTwo("FreeMem", "HDI:VDI:"); + vdiImpl_->FreeMem(*handle); + } + TimeEnd("FreeMem", TIME_10, firstTimeStamp); +} + int32_t AllocatorService::AllocMem(const AllocInfo& info, sptr& handle) { HdfTrace trace(__func__, "HDI:DISP:"); BufferHandle* buffer = nullptr; CHECK_NULLPOINTER_RETURN_VALUE(vdiImpl_, HDF_FAILURE); - HdfTrace traceOne("AllocMem-VDI", "HDI:VDI:"); struct timeval firstTimeStamp; TimeBegin(&firstTimeStamp); - int32_t ec = vdiImpl_->AllocMem(info, buffer); - TimeEnd("AllocMem", TIME_10, firstTimeStamp); - if (ec != HDF_SUCCESS) { - HDF_LOGE("%{public}s: AllocMem failed, ec = %{public}d", __func__, ec); - return ec; + { + HdfTrace traceOne("AllocMem-VDI", "HDI:VDI:"); + int32_t ec = vdiImpl_->AllocMem(info, buffer); + if (ec != HDF_SUCCESS) { + TimeEnd("AllocMem", TIME_10, firstTimeStamp); + HDF_LOGE("%{public}s: AllocMem failed, ec = %{public}d", __func__, ec); + return ec; + } } + TimeEnd("AllocMem", TIME_10, firstTimeStamp); + CHECK_NULLPOINTER_RETURN_VALUE(buffer, HDF_DEV_ERR_NO_MEMORY); + WriteAllocPidToDma(buffer->fd); handle = new NativeBuffer(); if (handle == nullptr) { HDF_LOGE("%{public}s: new NativeBuffer failed", __func__); - delete handle; - HdfTrace traceTwo("FreeMem-1", "HDI:VDI:"); - struct timeval firstTimeStamp; - TimeBegin(&firstTimeStamp); - vdiImpl_->FreeMem(*buffer); - TimeEnd("FreeMem", TIME_10, firstTimeStamp); + FreeMemVdi(buffer); return HDF_FAILURE; } handle->SetBufferHandle(buffer, true, [this](BufferHandle* freeBuffer) { - HdfTrace traceThree("FreeMem-2", "HDI:VDI:"); - struct timeval firstTimeStamp; - TimeBegin(&firstTimeStamp); - vdiImpl_->FreeMem(*freeBuffer); - TimeEnd("FreeMem", TIME_10, firstTimeStamp); + FreeMemVdi(freeBuffer); }); return HDF_SUCCESS; }