2014-02-13 1 views
0

Mac OS X에서 파일 시스템 알림이 필요하고/dev/fsevents에서 읽습니다. Mac OS X에서 fsevents 캡처의 샘플 코드 : http://www.codecollector.net/view/1066/raw_fsevents. 이 코드에서는/dev/fsevents에서 읽은 버퍼가 읽히는 즉시 처리되는 것을 볼 수 있습니다. 그러나 그렇게 할 때 처리 과정에서 지연이 발생하여 이벤트가 누락됩니다. 그래서 새로운 char 포인터를 만들고 memcpy는 버퍼를/dev/fsevents에서 읽고 새로운 char *을 큐에 추가하고 새로운 스레드에서 큐를 처리했습니다. 하지만 'print_event'처럼 'print_event'처럼 처리 할 때 'dump_entry'는 char * 포인터가 다시 정렬되고 처리 후 strlen()을 확인하면 0 바이트 또는 1 바이트 길이 만 표시됩니다. 따라서 처리 중에 메모리가 누출됩니다.Mac OS X의 fsevents watcher에서 메모리 누수

할당 된 char *을 삭제하는 방법에 대한 아이디어가 있으면 더 많은 메모리가 필요합니다. 이 점에 대해 의견을 나누십시오. 미리 감사드립니다.

답변

0

가장 흥미로운 점은 적어도 가장 일반적인 경우와 관련하여 상호 작용하도록 설계된 FSEvents 인터페이스를 사용하는 대신/dev/fsevents를 수동으로 처리하는 이유는 무엇입니까?/dev/fsevents는 직접 대화하는 것이 꽤 까다 롭습니다. Ars Technica did a nice writeup.

이런 종류의 코드의 경우 malloc과 memcpy에서 벗어날 수 있습니다. 대기열 관리에 많은 오버 헤드가 추가됩니다. 그리고 수동 스레드 관리에서 벗어날 수 있습니다. 이는 dispatch_data를 사용하여 GCD가 처리하도록 설계된 것과 같은 문제입니다. 복사를하지 않고도 처리하고 조작 할 수있는 변경 불가능한 메모리 블록을 만들 수 있습니다./dev/fsevents를 읽고 dispatch_data 객체를 다시 전달할 수 있도록 dispatch_source를 만들 수 있습니다. 예제는 동시성 프로그래밍 안내서의 Reading Data from a Descriptor 섹션을 참조하십시오.

"char * 포인터가 다시 정렬됩니다."라는 의미가 명확하지 않습니다. 자물쇠가없는 두 개의 스레드에서 동일한 변수를 수정한다는 의미입니까?

하지만 실제로 액세스 할 필요가 없다면 FSEvents 인터페이스를 살펴볼 것입니다.

+0

답장을 보내 주셔서 감사합니다. 그 전에는 FSEvents 인터페이스가 안정적이지 않고 이벤트가 누락 될 수 있으며 디렉토리 수준의 알림 만받을 수있는 것처럼 보였습니다 (각 디렉토리마다 큐에 넣어야 함). 그리고 char * 할당과 관련하여 char *, 'entry = (entry_t *) (buf + len - remaining)에 대한 몇 가지 변경 사항을 알 수 있습니다. '코드에서. 따라서 char *가 완전히 처리 될 때, 삭제를 확인하면 char * 길이가 0이라고 표시됩니다. 이는 dump_entry 및 print_event 함수 호출 중에 char * 포인터가 비어 있음을 의미합니다. 어떻게이 누출을 멈출 수 있니?. –

+0

malloc을 사용하여 새로운 메모리 포인터를 만들 때, 그것을 추적하십시오 (원래 포인터를 print_event로 전달하지 말고 복사본을 전달하십시오). 나중에 모든 메모리를 해제하기 위해 원래 포인터에서'free'를 호출 할 수 있습니다. –

+0

다른 사본을 가져 가면 너무 맘에 들어야 겠지 ..? –