From 3da2b0a430ceba8727a8d970bc8c46027310f5cd Mon Sep 17 00:00:00 2001 From: Odilitime Date: Sat, 27 Jun 2026 21:04:23 -0700 Subject: [PATCH] Add mlx_array_detach to break graph links before free Expose mlx::core::array::detach() in the C API so callers can release weight buffers without leaving sibling references in shared ArrayDesc nodes. No-op when arr.ctx is null, matching mlx_array_free behavior. --- mlx/c/array.cpp | 12 ++++++++++++ mlx/c/array.h | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/mlx/c/array.cpp b/mlx/c/array.cpp index 7c7342d3..f4ec6dfc 100644 --- a/mlx/c/array.cpp +++ b/mlx/c/array.cpp @@ -34,6 +34,18 @@ extern "C" int mlx_array_free(mlx_array arr) { return 0; } +extern "C" int mlx_array_detach(mlx_array arr) { + try { + if (arr.ctx) { + static_cast(arr.ctx)->detach(); + } + } catch (std::exception& e) { + mlx_error(e.what()); + return 1; + } + return 0; +} + extern "C" mlx_array mlx_array_new(void) { try { return mlx_array_(); diff --git a/mlx/c/array.h b/mlx/c/array.h index a3b382bb..dee011f1 100644 --- a/mlx/c/array.h +++ b/mlx/c/array.h @@ -81,6 +81,16 @@ mlx_array mlx_array_new(void); */ int mlx_array_free(mlx_array arr); +/** + * Detach an array from the MLX computation graph. + * + * Clears sibling links so the array can be freed without leaving dangling + * references in shared ArrayDesc nodes. Call before mlx_array_free when + * releasing model weights or other arrays that may still be linked in the + * graph. + */ +int mlx_array_detach(mlx_array arr); + /** * New array from a bool scalar. */