From c666bea6b65babce5bf6e7046cc55e3611ad3ffe Mon Sep 17 00:00:00 2001 From: Jay Cho Date: Sun, 31 May 2026 20:08:19 +0900 Subject: [PATCH 1/2] [Tizen.Multimedia.Camera] Split Camera.ValidateState into allocation-free overloads ValidateState was declared with `params CameraState[] required` and used `required.Contains(curState)` for the check. Every call allocated a new 1- or 2-element array plus a LINQ enumerator, even though all 10 call sites pass exactly 1 or 2 constants. Replaces the single params method with explicit 1-arg and 2-arg overloads that compare with `!=` directly. The error path is hoisted into a private helper that keeps the original `params` formatting so the thrown message is unchanged. Existing call sites bind to the new overloads with no source change. Fixes #7623 --- src/Tizen.Multimedia.Camera/Camera/Camera.cs | 22 +++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Tizen.Multimedia.Camera/Camera/Camera.cs b/src/Tizen.Multimedia.Camera/Camera/Camera.cs index 1e73a181a45..39387170340 100644 --- a/src/Tizen.Multimedia.Camera/Camera/Camera.cs +++ b/src/Tizen.Multimedia.Camera/Camera/Camera.cs @@ -215,20 +215,32 @@ internal void ValidateNotDisposed() } #endregion Dispose support - internal void ValidateState(params CameraState[] required) + internal void ValidateState(CameraState required) { ValidateNotDisposed(); - Debug.Assert(required.Length > 0); + var curState = _state; + if (curState != required) + { + ThrowInvalidState(curState, required); + } + } + + internal void ValidateState(CameraState required1, CameraState required2) + { + ValidateNotDisposed(); var curState = _state; - if (!required.Contains(curState)) + if (curState != required1 && curState != required2) { - throw new InvalidOperationException($"The camera is not in a valid state. " + - $"Current State : { curState }, Valid State : { string.Join(", ", required) }."); + ThrowInvalidState(curState, required1, required2); } } + private static void ThrowInvalidState(CameraState curState, params CameraState[] required) => + throw new InvalidOperationException($"The camera is not in a valid state. " + + $"Current State : { curState }, Valid State : { string.Join(", ", required) }."); + internal void SetState(CameraState state) { _state = state; From db340584bf560448e71dd9bbadb24156b29d8b20 Mon Sep 17 00:00:00 2001 From: Jay Cho Date: Mon, 1 Jun 2026 21:03:27 +0900 Subject: [PATCH 2/2] Address review feedback Mark ThrowInvalidState with NoInlining attribute to keep the ValidateState hot path eligible for JIT inlining. Applied-Human-Comments: 3330111735 --- src/Tizen.Multimedia.Camera/Camera/Camera.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Tizen.Multimedia.Camera/Camera/Camera.cs b/src/Tizen.Multimedia.Camera/Camera/Camera.cs index 39387170340..ac513744989 100644 --- a/src/Tizen.Multimedia.Camera/Camera/Camera.cs +++ b/src/Tizen.Multimedia.Camera/Camera/Camera.cs @@ -237,6 +237,7 @@ internal void ValidateState(CameraState required1, CameraState required2) } } + [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] private static void ThrowInvalidState(CameraState curState, params CameraState[] required) => throw new InvalidOperationException($"The camera is not in a valid state. " + $"Current State : { curState }, Valid State : { string.Join(", ", required) }.");