Poking around some more...

If I drop into the debugger arbitrarily, before the crash, and check this same 
array, I noticed that it is nicely filled with NSCFNumbers. But, strangely, 
there are too many. The code that fills this array, is this:

- (void)                                
addCoincidenceToBeliefMemory:(int)coincidence
{
        if(coincidence == 0)
                return;
        int memDepth = [[self sequencer] memoryDepth] - 1;
        NSMutableArray* beliefMem = [self beliefMemory];
        NSNumber* memCoinc = [[NSNumber alloc] initWithInt:coincidence];
        [beliefMem insertObject:memCoinc atIndex:0];
        UInt memCount = [beliefMem count];
        if(memCount > memDepth)
                [beliefMem removeLastObject];
        [memCoinc release];
}


It's set up as a stack, so I can just grab the latest number from index 0. I 
know the memDepth, is **always** 5, because this is set elsewhere, and is never 
changed -- it's accessed by [[self sequencer] memoryDepth]. But I'm looking at 
the array right now, and it has 7 objects in it. How is that even possible?

Getting very confused... Help appreciated.

J.


On 2010-05-01, at 8:42 PM, James Maxwell wrote:

> ugh... okay, so changing the logic cured the crashes, but also negatively 
> impacted the system (it's a machine-learning thing, and the old logic was 
> crucial to the predictive power of the system).
> So, I'm back to the crash.
> 
> So, looking more closely at the NSArray itself in the debugger, the items in 
> the array come up as
> 
> 0 NSCFNumber*
> 1 NSCFNumber*
> 2 NSObject*
> 3 _NSZombie_CFNumber*
> 4 NSObject*
> 
> I have to confess, I have no idea why they aren't all NSCFNumbers, as that's 
> all I'm putting in the array.
> In particular, I'm curious about the _NSZombie one, as I'm assuming that's 
> the one that's probably causing the problems, yes?
> 
> help!
> 
> J.
> 
> 
> On 2010-05-01, at 7:19 PM, James Maxwell wrote:
> 
>> just to call off the dogs, in case there are any, I solved the crash by 
>> re-working the logic a little.
>> It's cleaner the new way anyway, though I don't know whether the concurrency 
>> stuff is really fixed 
>> (or whether it was "really" broken!)
>> 
>> It works, and I'm a tight deadline, so that's all that matters!
>> 
>> J.
>> 
>> 
>> 
>> On 2010-05-01, at 5:54 PM, James Maxwell wrote:
>> 
>>> Okay, so let me give a little more info.
>>> 
>>> Here's the stack trace.
>>> 
>>> #0  0x7fff8578693c in __CFTypeCollectionRelease
>>> #1  0x7fff85783e43 in __CFArrayReleaseValues
>>> #2  0x7fff85764bc8 in _CFArrayReplaceValues
>>> #3  0x1000183ad in -[HSMM_Node addCoincidenceToBeliefMemory:] at 
>>> HSMM_Node.m:229
>>> #4  0x100017803 in -[HSMM_Node topDown:] at HSMM_Node.m:121
>>> #5  0x100012a94 in __-[HSMM_NetworkController 
>>> runNetworkOnInput:]_block_invoke_555 at HSMM_NetworkController.m:225
>>> #6  0x7fff804f3e68 in _dispatch_apply2
>>> #7  0x7fff804eb487 in dispatch_apply_f
>>> #8  0x10001232e in -[HSMM_NetworkController runNetworkOnInput:] at 
>>> HSMM_NetworkController.m:218
>>> #9  0x100005050 in __-[OSC_Controller receivedOSCMessage:]_block_invoke_876 
>>> at OSC_Controller.m:252
>>> #10 0x7fff804a1e63 in dispatch_sync_f
>>> #11 0x100004155 in -[OSC_Controller receivedOSCMessage:] at 
>>> OSC_Controller.m:251
>>> #12 0x10008a2bc in -[OSCManager receivedOSCMessage:] at OSCManager.m:232
>>> #13 0x10008af82 in -[OSCInPort handleScratchArray:] at OSCInPort.m:262
>>> #14 0x10008bc5f in -[OSCInPort OSCThreadProc] at OSCInPort.m:240
>>> #15 0x100054797 in -[VVThreadLoop threadCallback] at VVThreadLoop.m:76
>>> #16 0x7fff81943e99 in __NSThread__main__
>>> #17 0x7fff804a5f8e in _pthread_start
>>> #18 0x7fff804a5e41 in thread_start
>>> 
>>> And the source for the method does does all the work is below. This wraps 
>>> everything up in a couple of blocks.
>>> The second loop is the one that's causing the crash and the only way I 
>>> think this could happen would be if the 
>>> first loop hadn't completed. My, possibly totally misinformed, opinion was 
>>> that this method would run the
>>> first loop to completion, then run the second.  That is, all "aNode" 
>>> objects would do their thing in the first loop
>>> **before** the second loop could start. But maybe I'm wrong about that. I 
>>> have to admit that my grasp
>>> of GCD is pretty sketchy. If this isn't the case, and the second loop 
>>> could, in fact, start running before all
>>> the aNode objects in the first loop had finished their processing, then I 
>>> can totally understand why it would
>>> crash. Is there some way to ensure that? How would I make sure that 
>>> *everything* started in the first
>>> loop finished before moving on to the second. If I do that, then my crash 
>>> should be solved.
>>> 
>>> - (void)                    runNetworkOnInput:(float *)inputPattern
>>> {
>>>     printf("\n\n********* Start Run ************\n\n");
>>>     int i, numLevels;
>>>     numLevels = [[[self network] hierarchy] count];
>>>     
>>>     dispatch_queue_t hsmm_queue;
>>>     hsmm_queue = dispatch_get_global_queue(0, 0);
>>>     
>>>     [self setPlaybackPossible:YES];
>>>     
>>>     for(i=0;i < numLevels;i++)                                              
>>> // run up the network
>>>     {
>>>             NSMutableArray* level = [[[self network] hierarchy] 
>>> objectAtIndex:i];
>>>             dispatch_apply([level count],
>>>                                        hsmm_queue, 
>>>                                        ^(size_t index) {
>>>                                                HSMM_Node* aNode = [level 
>>> objectAtIndex:index];
>>>                                                [aNode setIsPassive:NO];
>>>                                                if([aNode nodeLevel] == 1)
>>>                                                {
>>>                                                        [aNode 
>>> setPredictionRequestsLocked:NO];
>>>                                                        [aNode 
>>> setInputCounter:([aNode inputCounter] + 1)]; 
>>>                                                        [aNode run:nil];
>>>                                                } else {
>>>                                                        BOOL readyToLearn = 
>>> YES;
>>>                                                        for(HSMM_Node* child 
>>> in [aNode childNodes])
>>>                                                        {
>>>                                                                if([child 
>>> nodeLevel] == 1 && [[child sequencer] predictionAccuracy] < 0.3)
>>>                                                                {
>>>                                                                        
>>> readyToLearn = NO;
>>>                                                                        
>>> break;
>>>                                                                }
>>>                                                        }
>>>                                                        if(readyToLearn == 
>>> YES && [aNode predictionRequestsLocked] == YES)   // the child is asking 
>>> for help! the parent needs to learn
>>>                                                        {
>>>                                                                [aNode 
>>> setPredictionRequestsLocked:NO];
>>>                                                                [aNode 
>>> setInputCounter:([aNode inputCounter] + 1)]; 
>>>                                                                [aNode 
>>> run:nil];
>>>                                                        }
>>>                                                }
>>>                                        });
>>>     }
>>>     
>>>     for(i=numLevels - 1;i >= 0;--i)                                 // run 
>>> back down the network
>>>     {
>>>             NSMutableArray* level = [[[self network] hierarchy] 
>>> objectAtIndex:i];
>>>             dispatch_apply([level count],
>>>                                        hsmm_queue, 
>>>                                        ^(size_t index) {
>>>                                                HSMM_Node* aNode;
>>>                                                aNode = [level 
>>> objectAtIndex:index];
>>>                                                [aNode 
>>> getEvidenceFromParents];
>>>                                                [aNode topDown:[aNode 
>>> parentEvidence]];
>>>                                                if([aNode nodeLevel] == 1)
>>>                                                        [[aNode sequencer] 
>>> predictForward:NO];
>>>                                        });
>>>     }
>>> }
>>> 
>>> 
>>> On 2010-05-01, at 5:17 PM, Kyle Sluder wrote:
>>> 
>>>> On May 1, 2010, at 5:04 PM, James Maxwell <jbmaxw...@rubato-music.com> 
>>>> wrote:
>>>> 
>>>>> I'm having a crash when trying to remove the last item in an 
>>>>> NSMutableArray.
>>>>> The app is a pretty complex system, and runs its two main processes in 
>>>>> consecutively executed blocks.
>>>>> The blocks are run using dispatch_apply, on the global queue. The 
>>>>> operation that's trying to
>>>>> access the NSArray is, I think, within the first block... but honestly, I 
>>>>> can't be totally sure, as
>>>>> I don't know exactly why the app is crashing.
>>>> 
>>>> Yes you do. You have a debugger and a stack trace.
>>>> 
>>>>> I guess what I'm wondering is whether there's some fool-proof way of 
>>>>> protecting that NSArray from being read and changed simultaneously?
>>>>> I tried making the array nonatomic, but that didn't solve the problem.
>>>>> Of note is the fact that this is directly related to processing load, so 
>>>>> I'm assuming it has to do
>>>>> with some timing thing -- as the app gets more loaded down, things get 
>>>>> sketchy.
>>>> 
>>>> The concept you're looking for is thread safety. It is, in general, a Very 
>>>> Hard Problem.
>>>> 
>>>> 
>>>>> I know this isn't a great description of the problem, but hopefully 
>>>>> someone has some thoughts to share.
>>>> 
>>>> If you have a crash, the only two useful pieces of information are the 
>>>> source code and the stack trace. Anything else risks misinterpretation and 
>>>> therefore wasted time.
>>>> 
>>>> --Kyle Sluder
>>> 
>>> James B Maxwell
>>> Composer/Doctoral Student
>>> School for the Contemporary Arts (SCA)
>>> School for Interactive Arts + Technology (SIAT)
>>> Simon Fraser University
>>> jbmaxw...@rubato-music.com
>>> jbmax...@sfu.ca
>>> 
>>> _______________________________________________
>>> 
>>> 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/jbmaxwell%40rubato-music.com
>>> 
>>> This email sent to jbmaxw...@rubato-music.com
>> 
>> James B Maxwell
>> Composer/Doctoral Student
>> School for the Contemporary Arts (SCA)
>> School for Interactive Arts + Technology (SIAT)
>> Simon Fraser University
>> jbmaxw...@rubato-music.com
>> jbmax...@sfu.ca
>> 
>> _______________________________________________
>> 
>> 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/jbmaxwell%40rubato-music.com
>> 
>> This email sent to jbmaxw...@rubato-music.com
> 
> James B Maxwell
> Composer/Doctoral Student
> School for the Contemporary Arts (SCA)
> School for Interactive Arts + Technology (SIAT)
> Simon Fraser University
> jbmaxw...@rubato-music.com
> jbmax...@sfu.ca
> 
> _______________________________________________
> 
> 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/jbmaxwell%40rubato-music.com
> 
> This email sent to jbmaxw...@rubato-music.com

James B Maxwell
Composer/Doctoral Student
School for the Contemporary Arts (SCA)
School for Interactive Arts + Technology (SIAT)
Simon Fraser University
jbmaxw...@rubato-music.com
jbmax...@sfu.ca

_______________________________________________

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