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 <doc.aron...@gmail.com> 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 <doc.aron...@gmail.com> 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 (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/cocoadev%40mikeabdullah.net

This email sent to cocoa...@mikeabdullah.net

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to