2010-05-14 4 views
0

Hoooboy,Управление памятью OpenGL/Carbon/Cocoa Autorelease

У меня есть еще одна проблема с памятью.

Я создаю окно с углеродом (AGL), на C++, и это говорит мне, что я autorelease -в его без пула на месте.

э-э ... что?

Я думал, что Углерод существует вне NSAutoreleasePool ...

Когда я звоню glEnable(GL_TEXTURE_2D) делать некоторые вещи, это дает мне EXC_BAD_ACCESS предупреждение - но если AGL окно никогда не получает release «D, то не должен» Он существует? Установка set objc-non-blocking-mode на (gdb) не вызывает проблем.

Так что, я думаю, мой вопрос: ЧТО ТАКОЕ С УГЛЕРОМ/COCOA/NSAutoreleasePool?

И ... есть ли какие-либо ресурсы для Objective-C++? Потому что дерьмо, как это, продолжает происходить со мной.

Спасибо,

-Stephen

--- КОД ---

Test Draw Функция

void Channel::frameDraw(const uint32_t frameID) 
{ 
    eq::Channel::frameDraw(frameID); 
      getWindow()->makeCurrent(false); 
    glEnable(GL_TEXTURE_2D); // Throws Error Here 
} 

Make Current (следующий код из Эквалайзер API, который является LGPL Зрение)

void Window::makeCurrent(const bool useCache) const 
{ 
    if(useCache && getPipe()->isCurrent(this)) 
     return; 

    _osWindow->makeCurrent(); 
} 

void AGLWindow::makeCurrent() const 
{ 
    aglSetCurrentContext(_aglContext); 
    AGLWindowIF::makeCurrent(); 

    if(_aglContext) 
    { 
     EQ_GL_ERROR("After aglSetCurrentContext"); 
    } 
} 

_aglContext - действительная ячейка памяти (т. а не NULL), когда я выхожу.

-S!

--- ОШИБКА ---

859 2958110720 //Users/slate/Documents/equalizer/XCode/../lib/client/aglWindow.cpp:367 278 Created AGL context 0x4867200 shared with 0 
*** __NSAutoreleaseNoPool(): Object 0x1fc4a950 of class NSCarbonWindowContentView autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x1fc4b120 of class NSCFArray autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x1f410f50 of class NSMutableParagraphStyle autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x45063f0 of class NSCFDictionary autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x2f2ed50 of class NSPathStore2 autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0x44bf380 of class NSCFData autoreleased with no pool in place - just leaking 
*** __NSAutoreleaseNoPool(): Object 0xa026cb08 of class NSCFString autoreleased with no pool in place - just leaking 
etc... 

--- СТЕК ---

#0 0x9252d3f1 in __NSAutoreleaseNoPool() 
#1 0x9243a794 in _CFAutoreleasePoolAddObject() 
#2 0x9243a4aa in -[NSObject(NSObject) autorelease]() 
#3 0x9372d023 in -[NSCarbonWindow initWithCarbonWindowRef:takingOwnership:disableOrdering:]() 
#4 0x9345bdee in _cocoaAppApplicationEventHandler() 
#5 0x920f00a9 in DispatchEventToHandlers() 
#6 0x920ef370 in SendEventToEventTargetInternal() 
#7 0x920ef1cf in SendEventToEventTargetWithOptions() 
#8 0x92114e44 in SendShowHideEvent() 
#9 0x921148b1 in _ShowHideWindows() 
#10 0x92177341 in ShowWindow() 
#11 0x2a01fab0 in eq::AGLWindow::configInitAGLWindow (this=0x400d260) at /Users/slate/Documents/equalizer/XCode/../lib/client/aglWindow.cpp:541 
#12 0x2a01f380 in eq::AGLWindow::configInitAGLDrawable (this=0x400d260) at /Users/slate/Documents/equalizer/XCode/../lib/client/aglWindow.cpp:393 
#13 0x2a01eb32 in eq::AGLWindow::configInit (this=0x400d260) at /Users/slate/Documents/equalizer/XCode/../lib/client/aglWindow.cpp:148 
#14 0x2a0a25b9 in eq::Window::configInitOSWindow (this=0x283795f0, initID=0) at /Users/slate/Documents/equalizer/XCode/../lib/client/window.cpp:435 
#15 0x2a09f31b in eq::Window::configInit (this=0x283795f0, initID=0) at /Users/slate/Documents/equalizer/XCode/../lib/client/window.cpp:394 
#16 0x2a0a1226 in eq::Window::_cmdConfigInit (this=0x283795f0, [email protected]) at /Users/slate/Documents/equalizer/XCode/../lib/client/window.cpp:720 
#17 0x2a0ae8d5 in eq::net::CommandFunc<eq::net::Dispatcher>::operator() (this=0x1ed023b4, [email protected]) at commandFunc.h:50 
#18 0x2a0adf4a in eq::net::Dispatcher::invokeCommand (this=0x283795f0, [email protected]) at /Users/slate/Documents/equalizer/XCode/../lib/net/dispatcher.cpp:121 
#19 0x2a102ec4 in eq::net::Session::_invokeObjectCommand (this=0x3061600, [email protected]) at /Users/slate/Documents/equalizer/XCode/../lib/net/session.cpp:622 
#20 0x2a10448c in eq::net::Session::invokeCommand (this=0x3061600, [email protected]) at /Users/slate/Documents/equalizer/XCode/../lib/net/session.cpp:575 
#21 0x2a0901d3 in eq::Pipe::_runThread (this=0x28377c00) at /Users/slate/Documents/equalizer/XCode/../lib/client/pipe.cpp:310 
#22 0x2a0987e4 in eq::Pipe::PipeThread::run (this=0x28377a80) at pipe.h:419 
#23 0x2a01a307 in eq::base::Thread::_runChild (this=0x28377a80) at /Users/slate/Documents/equalizer/XCode/../lib/base/thread.cpp:125 
#24 0x2a01a48d in eq::base::Thread::runChild (arg=0x28377a80) at /Users/slate/Documents/equalizer/XCode/../lib/base/thread.cpp:101 
#25 0x958aea19 in _pthread_start() 
#26 0x958ae89e in thread_start() 

спасибо за наконечник о настройке ENV NSAutoreleaseHaltNoPool = ДА. Почему здесь задействован _cocoaAppApplicationEventHandler? Я импортирую плагин AGL/Carbon в приложение CGL/Cocoa ... Какао получает весь углерод?

Согласно MacWindows.h

/* 
* [Mac]ShowWindow() 
* 
* Mac OS X threading: 
* Not thread safe 
* 
* Availability: 
* Mac OS X:   in version 10.0 and later in Carbon.framework [32-bit only] 
* CarbonLib:  in CarbonLib 1.0 and later 
* Non-Carbon CFM: in InterfaceLib 7.1 and later 
*/ 
#if TARGET_OS_MAC 
    #define MacShowWindow ShowWindow 
#endif 
extern void 
MacShowWindow(WindowRef window)        AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER; 

Это должно быть просто призыв прямо вверх Carbon ... так что я не знаю, почему какао пытается управлять им. Это просто кажется странным, что он здесь не работает, но он отлично работает в другом проекте. Все настройки конфигурации и т. Д. Одинаковы между проектами, поэтому мне просто трудно понять, почему это проблема.

-S!

+0

Просьба указать код. – JeremyP

+0

Выполнено и выполнено, хотя для этого вам понадобится 100 строк строк, которые создают AGLWindow, Window и сохраняют их в памяти. В чем проблема. Я ищу более распространенные ошибки с управлением памятью ObjC++ и конфликтом между CF и NSAutoreleasePool. -S! –

+0

Не могли бы вы отобразить строку ошибки, которая говорит 'autoreleasing without pool'? Это может дать нам некоторое представление о том, что вызывает ошибку. – Yuji

ответ

1

Тьфу,

Так что если кто-то ищут подобный ответ, я выложу то, что я нашел.

Ответ заключается в том, что окно Carbon создается как часть плагина Cocoa для приложения Cocoa. Следовательно, окно Carbon должно следовать всем правилам управления памятью как в Carbon , так и в Cocoa. Следовательно, почему создается ссылка на NSCarbonWindow и пытается добавить ее в пул автозаполнения.

1) Решение будет заключаться в том, чтобы не использовать Carbon (duh), так как Apple обескураживает его быстрее, чем Adobe. : P

2) Другим решением было бы вручную добавить окно Carbon Window и правильно управлять памятью. Поскольку я использую API-интерфейс Carbon, я не могу этого сделать.

3) Третьим решением было бы разделить программы на части. Используйте API-интерфейс Carbon в отдельном .app, чем плагин Cocoa. Это то, что мне нужно сделать, и просто передавать информацию через MachPorts или что-то между этими двумя приложениями.

Надеюсь, это поможет кому-то еще. Разумеется, личное предложение Mt - это № 1.

-Stephen

+0

Если что-то происходит внутри плагина Cocoa, должен быть установлен пул автозаполнения. Однако не сразу очевидно, чья ответственность в этом конкретном случае. –

+0

Да, есть пул авторезистов на месте, но код C++/Carbon существует в его собственном потоке или что-то, что не имеет доступа к пулу Autorelease, созданному в main.m. Например, когда я загружаю некоторые данные с помощью CoreData, я должен скопировать его в другой пул автозапуска - он не будет запираться в пуле основного приложения. Я не могу редактировать API-интерфейс Carbon, поэтому я застрял, делая что-то еще. –

Смежные вопросы