project/개발 업무

Actor에서 Class + OSAllocatedUnfairLock

lgvv 2025. 8. 6. 02:26

Actor에서 Class + OSAllocatedUnfairLock

 

상태 보호를 위해서 actor로 작성된 객체를 class + OSAllocatedUnfairLock으로 변경

프로파일링 과정에서 특정 메서드의 호출 빈도가 높아지는 경우 지속적으로 CPU Usage가 높게 잡히는 부분이 있어서 확인

 

Actor 기반으로 작성한 메서드를 실행했을 때

completeTaskClousre로 나타나는 영역에서 Weight를 많이 차지함.


해당 메서드의 구현부는 swiftlang / swift에 존재.

https://github.com/swiftlang/swift/blob/main/stdlib/public/Concurrency/Task.cpp

 

 

간단한 Task를 컨텍스트에 넣어서 클로저로부터 최종 반환을 처리하는 함수

 

/// The function that we put in the context of a simple task
/// to handle the final return from a closure.
SWIFT_CC(swiftasync)
static void completeTaskWithClosure(SWIFT_ASYNC_CONTEXT AsyncContext *context,
                                    SWIFT_CONTEXT SwiftError *error) {
  // 클로저 컨텍스트를 해제하기 위해, AsyncContext의 앞에 붙어 있는 AsyncContextPrefix로 이동
  // 힙이라서 포인트를 앞쪽 메모리 영역으로 이동시킴 (낮은 주소 -> 높은 주소로 메모리 할당)
  auto asyncContextPrefix = reinterpret_cast<AsyncContextPrefix *>(
      reinterpret_cast<char *>(context) - sizeof(AsyncContextPrefix));

  // 클로저 컨텍스트를 메모리 해제
  swift_release((HeapObject *)asyncContextPrefix->closureContext);

  // Task의 정리 작업 후 Task 객체를 해제
  return completeTaskAndRelease(context, error);
}

 

 

 

Class + OSAllocatedUnfairLock으로 작성한 메서드를 실행했을 때

completeTaskClousre 영역이 사라져서 CPU Usage 감소

 

 

 

(참고)

https://github.com/swiftlang/swift/blob/main/stdlib/public/Concurrency/Task.cpp

 

swift/stdlib/public/Concurrency/Task.cpp at main · swiftlang/swift

The Swift Programming Language. Contribute to swiftlang/swift development by creating an account on GitHub.

github.com