2017-01-03 7 views
2

필자는 (FFI 노력의 일환으로) 몇 가지 ExternalStrctures를 구현했으며, 일부는 외부 메모리 교정을 위해 마무리 작업을 구현하려고합니다.Cuis/Squeak/Pharo에서 완결 (테스트 용)하는 방법?

나는 그것에 대한 몇 가지 테스트를 작성하려고하고 있으며, 가비지 수집을 강제로 여러 번 수행하여도 Smalltalk garbageCollect으로 최종화가 (절대적으로) 트리거되지 않는다고합니다.

파이널 라이저에서 호출하는 함수에 외부 중단 점 (gdb 사용)을 배치했지만 중단 점이 결코 적중되지 않았는지 확인하십시오. 나는 (많은 GC를 실행 한 후에) 객체에 대한 모든 참조를 검사했으며 유일한 참조는 WeakRegistry (allInstances를 사용하여 객체에 있음)입니다.

강제 종료 할 수있는 방법이 있습니까 (Cuis/Pharo/Squeak)?

+0

본 적이 있습니까? Object >> #toFinalizeSend : to : with :? –

+0

나는 고마워. 제 이해는'#toFinalizeSend : to : with'가 원래의 마무리 동작을 대체하지만 강제 종료는 대체하지 않는다는 것입니다. 최종화가 실행되었음을 알리기 위해 사용할 수는 있지만 종료를 강제하지는 않습니다. 나는 내가 다른 방법으로 문제를 해결하는 것이 흥미로울 수 있다고 생각한다. Nice :-) – gera

+1

최종 결정을하는 프로세스에 문제가 있음을 발견했습니다. 어떤 이유로 자동으로 시작되지 않습니다 (이미지를 저장하면 비활성화됩니다). 지금은 그것을 다시 시작하기 위해 수동으로'WeakArray restartFinalizationProcess'를하고, 그 후에는'Smalltalk garbageCollect'가 강제로 종료합니다. 프로세스를 올바르게 설치하는 방법을 이해하면 질문에 답할 것입니다. – gera

답변

3

Smalltalk garbageCollect은 항상 종료를 트리거해야합니다. 객체가 새로운 경우는, Smalltalk garbageCollectMost가 그것을 트리거 할 가능성이 있습니다 (VM에 따라서).

마무리는 이미지의 프로세스에 의해 구현됩니다. 해당 프로세스가 어떤 이유로 실행되지 않으면 종료되지 않습니다.

또한 VM이 이미지를 마무리 할 이미지를 보내도록 다양한 방법이 있습니다. 초기에 최종 프로세스는 모든 약한 객체를 스캔해야했지만 강력했지만 비효율적이었습니다. 요즘 VM과 이미지는 객체를 찾기위한 메소드에 동의해야합니다. 일치하지 않는 경우 최종 결정이 신뢰할 수 없습니다.

+0

감사 Bert! 확실성을 갖는 것은 매우 좋습니다. 당신이 말한 것을 발견했습니다. 파이널 라이즈 프로세스가 실행되지 않고 자동으로 시작되지 않습니다. 필자는 수동으로 'WeakArray restartFinalizationProcess'를 실행하여 최종 테스트를 시작해야합니다.이 테스트는 작동합니다. – gera

0

OpenCL.pck.st 패키지의 #testFinalization은 적어도 시작하기위한 작업 실험으로는 도움이 될 수 있다고 생각합니다.

+0

그 코드 중 일부를 여기 붙여 넣을 수 있습니까? 그게 더 편리 할거야. –

+0

글쎄,이 테스트는 'Smalltlak garbegeCollectMost'를 수행 한 후에 종료 효과가 발생한다고 주장합니다. 여기에 코드를 붙여 넣으려면 OpenCL 패키지 디자인에 대한 세부 사항이 필요합니다. 실제로는이 질문과 관련이 없습니다. 내 원래의 대답은 전혀 질문에 대답하지 않는다, 그것은 단지 어디서 볼 것인지 제안이다. –