Re: Running out of memory on stack in C++ routine invoked within Cocoa NSOperation
Re: Running out of memory on stack in C++ routine invoked within Cocoa NSOperation
- Subject: Re: Running out of memory on stack in C++ routine invoked within Cocoa NSOperation
- From: Mike Abdullah <email@hidden>
- Date: Wed, 18 Feb 2009 11:00:42 +0000
Would this work?
- (void)main
{
[[NSThread currentThread] setStackSize:stackSize];
// Do usual work
}
Actually, with a bit more reading, apparently not. You'd need to set
the stack size before starting the thread, not after. In which case
your only option is to subclass NSOperation to create a custom
concurrent operation which creates its own special thread.
However, I can't help thinking that there's probably a better way to
achieve the desired result of the code without playing around like this.
On 18 Feb 2009, at 08:52, Leo Singer wrote:
OK, so there is a way to change the size of the stack for an NSThread.
But how do I do this for an NSOperationQueue?
NSThread has the following selector:
- (void) setStackSize:(NSInteger)s;
I need to find the equivalent selector for NSOperationQueue. Any
ideas out there?
Leo
#import <Cocoa/Cocoa.h>
@interface MemoryTortureController : NSObject {
}
- (IBAction)memoryTortureBackground: (id) sender;
- (IBAction)memoryTorture: (id) sender;
@end
@implementation MemoryTortureController
- (IBAction)memoryTortureBackground: (id) sender
{
NSThread* thread;
thread = [[NSThread alloc] initWithTarget: self
selector:
@selector(memoryTorture:)
object: sender];
// The magic line
[thread setStackSize:256000*8];
[thread start];
}
- (IBAction)memoryTorture: (id) sender
{
int bigmem[256000];
for (int i = 0 ; i < 256000 ; i ++)
bigmem[i] = 2*i;
}
@end
On Wed, Feb 18, 2009 at 3:31 AM, Leo Singer <email@hidden>
wrote:
Actually, if the big array and the loop are moved from the C++ method
into the Objective C selector - (void) main then the same
EXEC_BAD_ACCESS occurs. So the problem is not related to C++. The
following source code still exhibits the same problem:
//////////////// TestOperation.h /////////////////////
#import <Cocoa/Cocoa.h>
@interface TestOperation : NSOperation {
}
@end
//////////////// End of TestOperation.h /////////////////////
//////////////// TestOperation.mm /////////////////////
#import "TestOperation.h"
@implementation TestOperation
- (void) main
{
int bigArray[256000];
for (int j = 0 ; j < 256000 && ![self isCancelled] ; j ++)
{
bigArray[j] = 2*j;
}
}
@end
//////////////// End of TestOperation.mm /////////////////////
On Wed, Feb 18, 2009 at 3:16 AM, Leo Singer <email@hidden>
wrote:
Hi,
I have a C++ method that I am invoking from within the - (void) main
selector of an NSOperation. My Cocoa application is crashing
because
this particular C++ method puts a huge amount of data on the
stack. I
am getting an EXEC_BAD_ACCESS error. However, the same C++ routine
works fine if I call it from within a command line C++ program.
I have contrived some sample code to illustrate the problem.
TestOperation is an (Objective C) subclass of NSOperation; I am
running the NSOperation in a separate thread by putting it into an
NSOperationQueue. TestOperationImpl is a C++ class. The
NSOperation
is responsible for doing one thing only: calling the go() method
on an
instance of TestOperationImpl.
Note the very large array of ints that is declared inside
TestOperationImpl::go(). If it is changed to an array of shorts
or an
array of chars, then this example code works fine, no
EXEC_BAD_ACCESS.
Is there any way for me to give my application more memory, or at
least give more memory to the thread that is running this C++
method?
Thanks,
Leo
//////////////// TestOperation.h /////////////////////
#import <Cocoa/Cocoa.h>
class TestOperationImpl {
private:
bool cancelled;
public:
TestOperationImpl();
void go();
void cancel();
};
@interface TestOperation : NSOperation {
TestOperationImpl* testOpImpl;
}
- initWithController: (TestOperationController*) controller;
@end
//////////////// End of TestOperation.h /////////////////////
//////////////// TestOperation.mm /////////////////////
#import "TestOperation.h"
TestOperationImpl::TestOperationImpl(TestOperationController*
controller)
: cancelled(false)
{
}
void TestOperationImpl::go()
{
int bigArray[256000];
for (int j = 0 ; j < 256000 && !cancelled ; j ++)
{
bigArray[j] = 2*j;
}
}
void TestOperationImpl::cancel()
{
cancelled = true;
}
@implementation TestOperation
- initWithController: (TestOperationController*) ctrl
{
if (self = [self init])
testOpImpl = new TestOperationImpl(ctrl);
controller = ctrl;
return self;
}
- (void) dealloc
{
delete testOpImpl;
[super dealloc];
}
- (void) cancel
{
testOpImpl->cancel();
[super cancel];
}
- (void) main
{
testOpImpl->go();
}
@end
//////////////// End of TestOperation.mm /////////////////////
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden