我一直在测试wiki中的示例代码,发现libdispatch在OS X(Lion 10.7.3,Xcode 4.3.2)和Linux(手动编译和安装)中分配大量内存而不释放它)。
代码创建一个SIGHUP信号源,其处理程序调用100_000写入日志文件。对日志的写入在串行队列中排队。
第一次运行显示正常的内存使用情况(Linux和OS X均为8-9 MiB)。发送“kill -1”后,每次发送SIGHUP信号时内存使用量都会增加1-20MiB。
我尝试使用-fobj-arc进行编译而没有它,但结果是一样的。我删除了br_log函数中的NSString用法,但泄漏不存在:它位于libdispatch内部。
我尝试了valgrind和Xcode Instruments,但没有发现泄漏。提前谢谢,
//
// main.m
// test02
//
// Created by Aldrin Martoq on 4/29/12.
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#include <unistd.h>
#import <Foundation/Foundation.h>
#import <dispatch/dispatch.h>
static FILE *log_file = NULL;
static NSString *log_filename = @"/tmp/br.log";
static dispatch_queue_t log_queue;
void br_log(NSString *format, ...) {
@autoreleasepool {
va_list ap;
va_start(ap, format);
NSString *s = [[NSString alloc] initWithFormat:format arguments:ap];
va_end(ap);
if (log_file == NULL) {
log_queue = dispatch_queue_create("cl.martoq.log_queue", NULL);
log_file = fopen([log_filename cStringUsingEncoding:NSUTF8StringEncoding], "a");
NSLog(@"Log file created: %@", log_filename);
}
dispatch_async(log_queue, ^{
@autoreleasepool {
const char *c = [s cStringUsingEncoding:NSUTF8StringEncoding];
fputs(c, log_file);
fputs("\n", log_file);
fflush(log_file);
[s release];
}
});
}
}
void br_setup() {
signal(SIGHUP, SIG_IGN);
dispatch_source_t sig_src = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, SIGHUP, 0, dispatch_get_main_queue());
dispatch_source_set_event_handler(sig_src, ^{
dispatch_async(dispatch_get_main_queue(), ^{
printf("Caught SIGHUP\n");
for (int i = 0; i < 100000; i++) {
br_log(@"prueba: %d", i);
}
});
});
dispatch_resume(sig_src);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
br_setup();
dispatch_main();
}
return 0;
}
答案 0 :(得分:0)
您如何衡量内存使用量的增长?我无法使用'堆'工具在Mac OS X上重现它。
您可能会看到libdispatch延续缓存的临时效果,这些是为每个dispatch_async()分配的小缓冲区,并且基于每个线程缓存速度。一旦临时调度工作线程退出(在您的示例中仅在SIGHUP之后几秒,至少在Mac OS X上),该缓存将被释放。
另请注意,您不需要从源事件处理程序中调度dispas_async(),因为您此时已经在主队列中(源的目标队列)
顺便说一下,您已经在libdispatch-dev@lists.macosforge.org上询问了这个问题,我已在那里做出回应,请不要同时在多个论坛上提出同样的问题。