Add missing mutex/semaphore destroy overrides

Override NPU driver weak function prototypes to properly free
up resources after use.

Change-Id: I4f3141d6106e5feeb1523452ca5fe2dbe66903be
Signed-off-by: Jonny Svärd <jonny.svaerd@arm.com>
diff --git a/applications/message_handler_openamp/core_driver_mutex.cpp b/applications/message_handler_openamp/core_driver_mutex.cpp
index 7948bd0..5f2e6cc 100644
--- a/applications/message_handler_openamp/core_driver_mutex.cpp
+++ b/applications/message_handler_openamp/core_driver_mutex.cpp
@@ -1,5 +1,5 @@
 /*
- * SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
+ * SPDX-FileCopyrightText: Copyright 2022-2024 Arm Limited and/or its affiliates <open-source-office@arm.com>
  * SPDX-License-Identifier: Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the License); you may
@@ -24,11 +24,15 @@
 #include <stdio.h>
 
 extern "C" {
-
 void *ethosu_mutex_create(void) {
     return xSemaphoreCreateMutex();
 }
 
+void ethosu_mutex_destroy(void *mutex) {
+    SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(mutex);
+    vSemaphoreDelete(handle);
+}
+
 int ethosu_mutex_lock(void *mutex) {
     SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(mutex);
     if (xSemaphoreTake(handle, portMAX_DELAY) != pdTRUE) {
@@ -51,6 +55,11 @@
     return xSemaphoreCreateCounting(255, 0);
 }
 
+void ethosu_semaphore_destroy(void *sem) {
+    SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(sem);
+    vSemaphoreDelete(handle);
+}
+
 int ethosu_semaphore_take(void *sem, uint64_t timeout) {
     SemaphoreHandle_t handle = reinterpret_cast<SemaphoreHandle_t>(sem);
     if (xSemaphoreTake(handle, (TickType_t)timeout) != pdTRUE) {