• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Thread safe?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Thread safe?


  • Subject: Re: Thread safe?
  • From: "Adam R. Maxwell" <email@hidden>
  • Date: Sat, 29 Mar 2008 10:54:28 -0700


On Mar 29, 2008, at 6:44 AM, Trygve Inda wrote:
I am finding it hard to determine in many cases exactly what is thread safe
as this is not complete:


http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/Thr
eadSafetySummary/chapter_950_section_2.html

Can I call the following from a thread?

segImageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
                              pixelsWide:100
                              pixelsHigh:100
                              bitsPerSample:8
                              samplesPerPixel:4
                              hasAlpha:YES
                              isPlanar:NO
                              colorSpaceName:NSDeviceRGBColorSpace
                              bitmapFormat:NSAlphaFirstBitmapFormat
                              bytesPerRow:100 * 4
                              bitsPerPixel:32];
   segBaseAddr = [segImageRep bitmapData];

Yes. See

http://www.cocoabuilder.com/archive/message/cocoa/2007/11/15/193191

ISTR having problems specifying a nonzero bytesPerRow and passing NULL for the bitmap data, so you might need to either manage the buffer yourself or pass zero for bytesPerRow to allow NSBitmapImageRep to pad it appropriately.


[segImageRep dealloc];

You should never call dealloc directly (well, unless you've overridden -retain/-release to handle your own refcounting).


How about:

NSImage *    image = [[[NSImage alloc] initWithContentsOfFile:path]
autorelease];

   [NSGraphicsContext saveGraphicsState];
   [NSGraphicsContext setCurrentContext:[NSGraphicsContext
graphicsContextWithBitmapImageRep:segImageRep]];

   [image drawInRect:NSMakeRect(0, 0, [image size].width, [image
size].height) fromRect:NSMakeRect(0, 0, [image size].width, [image
size].height) operation:NSCompositeCopy fraction:1.0];

[NSGraphicsContext restoreGraphicsState];

Drawing into an NSImage is explicitly documented to be thread safe in the article you linked to, and each thread has its own graphics context. The post I linked to does indicate that you might want to use [image setCacheMode:NSImageCacheNever]. If your goal is just to get an NSBitmapImageRep from a file, it's probably easier just to use +imageRepWithContentsOfFile:.


--
adam
On Mar 29, 2008, at 6:44 AM, Trygve Inda wrote:
I am finding it hard to determine in many cases exactly what is thread safe
as this is not complete:


http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/Thr
eadSafetySummary/chapter_950_section_2.html

Can I call the following from a thread?

segImageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL
                              pixelsWide:100
                              pixelsHigh:100
                              bitsPerSample:8
                              samplesPerPixel:4
                              hasAlpha:YES
                              isPlanar:NO
                              colorSpaceName:NSDeviceRGBColorSpace
                              bitmapFormat:NSAlphaFirstBitmapFormat
                              bytesPerRow:100 * 4
                              bitsPerPixel:32];
   segBaseAddr = [segImageRep bitmapData];

Yes. See

http://www.cocoabuilder.com/archive/message/cocoa/2007/11/15/193191

ISTR having problems specifying a nonzero bytesPerRow and passing NULL for the bitmap data, so you might need to either manage the buffer yourself or pass zero for bytesPerRow to allow NSBitmapImageRep to pad it appropriately.


[segImageRep dealloc];

You should never call dealloc directly (well, unless you've overridden -retain/-release to handle your own refcounting).


How about:

NSImage *    image = [[[NSImage alloc] initWithContentsOfFile:path]
autorelease];

   [NSGraphicsContext saveGraphicsState];
   [NSGraphicsContext setCurrentContext:[NSGraphicsContext
graphicsContextWithBitmapImageRep:segImageRep]];

   [image drawInRect:NSMakeRect(0, 0, [image size].width, [image
size].height) fromRect:NSMakeRect(0, 0, [image size].width, [image
size].height) operation:NSCompositeCopy fraction:1.0];

[NSGraphicsContext restoreGraphicsState];

Drawing into an NSImage is explicitly documented to be thread safe in the article you linked to, and each thread has its own graphics context. The post I linked to does indicate that you might want to use [image setCacheMode:NSImageCacheNever]. If your goal is just to get an NSBitmapImageRep from a file, it's probably easier just to use +imageRepWithContentsOfFile:.


--
adam
_______________________________________________

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


  • Follow-Ups:
    • Re: Thread safe?
      • From: Thomas Engelmeier <email@hidden>
    • Re: Thread safe?
      • From: Trygve Inda <email@hidden>
References: 
 >Thread safe? (From: Trygve Inda <email@hidden>)

  • Prev by Date: Core Data migration
  • Next by Date: Use of a int type property
  • Previous by thread: Re: Thread safe?
  • Next by thread: Re: Thread safe?
  • Index(es):
    • Date
    • Thread