[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Swarm-Support] How to prevent sending a message to a dropped object
From: |
martijn cox |
Subject: |
Re: [Swarm-Support] How to prevent sending a message to a dropped object? |
Date: |
Wed, 3 Aug 2005 20:02:19 +0200 |
Well, that would indeed work, but the thing is: I don't have the pointer to
the object available. All I can do is loop over a List of agents like so:
while( (agent = [index next]) != nil )
{
if ([agent getBirthAction])
[lifeMutationSchedule remove: [agent getBirthAction]];
[_agentList remove: agent];
[agent drop];
agent = nil; // ***
}
and then it makes no sense to do the reset at ***, since that isn't the
pointer that will be passed when I use the agent as an argument to a method.
I don't know where to get the actual pointer. I might be self? or perhaps
there is some other, lower level pointer that is used for this..
----- Original Message -----
From: "Paul Johnson" <address@hidden>
To: "Swarm Support" <address@hidden>
Sent: Tuesday, August 02, 2005 9:16 PM
Subject: Re: [Swarm-Support] How to prevent sending a message toa
droppedobject?
> martijn cox wrote:
> > Thanks for both your answers!
> > After trying to implement Pauls scheme, it turned out the problem still
> > existed: the id to the dropped agent didn't point to nil (from what I
recall
> > from gdb it pointed to 0xfffffe or something otherwise evil-looking).
After
> > some thought, and reading Kens answer this made sense because the
pointer to
> > the voided agent never got reset to nil, so it isn't detectably pointing
to
> > a voided object...
>
> What if you set the object to nil after it is dropped? I was assuming
> your dropping process had
>
> [anObj drop];
> anObj=nil;
>
> Then wouldn't that get it?
>
> > The bullseye solution was kindly provided by Ken's 'option A'. I had
> > allready noticed and thought about using the -remove operator for
schedules,
> > but through some miracle of denseness I figured it wasn't applicable in
this
> > case. Silly me, of course it *was exactly* what I was asking for in my
> > original post.
> >
> > Thanks again for your help, much appreciated!
> >
> > Martijn
> >
> > ----- Original Message -----
> > From: "Ken Cline" <address@hidden>
> > To: "Swarm Support" <address@hidden>
> > Sent: Monday, August 01, 2005 9:39 PM
> > Subject: Re: [Swarm-Support] How to prevent sending a message to a
> > droppedobject?
> >
> >
> >
> >>I'm not sure that will work in Martijn's situation[1]... If the
> >>'mother' pointer is valid when it is passed as an argument to the
> >>'considerChildbirth' message then it will be non-nil when the
> >>action occurs and the message is sent to the model swarm, right?
> >>If so, then the 'if (mother)' test will not detect that the pointer
> >>is a handle for a dropped object, correct?
> >>
> >>In any case, as far as I understand it, there are 2 basic ways to
> >>handle the bookkeeping issue that Martijn has:
> >> A. Agents take responsibility for their actions (no passing the
> >> buck!). That is, the agent maintains a handle to the Action
> >> objects created and returned by the Schedule and, when the
> >> agent is being dropped, all its pending actions are also
> >> dropped. I think all you need to do is call [Schedule
> >> remove: anAction].
> >>
> >> B. Agents are managed in a data structure and actions are invoked
> >> on that structure instead of directly on the agent. The
> >> data structure could be the model swarm, as suggested, or
> >> lists or maps that it maintains. The data structure must
> >> keep a registry of who is alive or dead and then either
> >> execute or ignore any the requested action as appropriate.
> >> That is, just what Paul has shown except that you'd test
> >> if the mother ID was in your "obituary" list.
> >>
> >>I think either approach is acceptable; both have pros and cons.
> >>And there are hybrid designs as well, e.g. the model swarm could
> >>maintain a data structure that maps agent IDs with handles to
> >>their Action objects and does the schedule clean up on behalf to
> >>agent and its grieving family.
> >>
> >>Note, there may be other reasons for maintaining agents in
> >>cryostatis, e.g. for calculating statistics at the end of a
> >>simulation.
> >>
> >>Btw, another approach, which is perhaps a little more technically
> >>challenging, would be to extend the Swarm framework. For example,
> >>you could define a protocol called MortalAgent and create a subclass
> >>of Schedule. Your subclass of Schedule would understand that when
> >>an Action to a MortalAgent is created that it, the subclass Schedule,
> >>should store the necessary bookkeeping information to remove all of
> >>that agent's actions when it dies. There are merits to this design
> >>as well, e.g. the agent code becomes much simpler and the Schedule
> >>subclass may be able to implement efficiencies that the agent object
> >>can not. However, I suspect that it would take a fairly deep under-
> >>standing of the Swarm libraries to implement this approach. Maybe
> >>not, though?
> >>
> >>My $0.02. Hope that helps.
> >>Ken
> >>
> >>PS: There are many things other than schedules/actions that can
> >> hold onto pointers to dropped agents, e.g. probes, UI widgets,
> >> and etc, and hence could cause segmentation faults. It's
> >> amazing how many lives a simple agent can touch.
> >>____________
> >>[1] My apologies if I'm wrong about this. I'm not actively doing
> >> and C or Objective-C programming (not much programming at all,
> >> in fact) and so I'm a little rusty on this stuff.
> >>
> >>--- Paul Johnson <address@hidden> wrote:
> >>
> >>
> >>>I think I'd redesign it so that dead mothers were never sent messages.
> >>>That is, remove the dead ones from the lists being processed.
> >>>
> >>>But I think you can brute force fix this like so. Instead of having
this
> >>>message put "haveChild" with target "mother__" on schedule, have it
aime
> >>>the message at something you are sure exists, say model swarm.
> >>>
> >>>[lifeMutationSchedulw at: (time + (int) (0.25* DPY*MPD))
createActionTo:
> >>>self message: M(considerChildbirth):mother];
> >>>
> >>>
> >>>Then in that method
> >>>
> >>>(void)considerChildbirth: mother
> >>>{
> >>> if (mother) [mother haveChild];
> >>> else fprintf(stderr,"you just tried to give birth from the dead,
> >>>silly!");
> >>>}
> >>>
> >>>If "mother" is a pointer to nil, then this will prevent the seg fault.
> >>>
> >>>Won't it?
> >>>
> >>>pj
> >>>
> >>>martijn cox wrote:
> >>>
> >>>>Hi,
> >>>>
> >>>>Im new here so if I break any form of etiquette, please forgive me :)
> >>>>
> >>>>I've been working on a (very simple) swarm-based simulation of
> >
> > evolution,
> >
> >>>>and have come accross the following problem. Female animals can have
> >>>
> >>>babies,
> >>>
> >>>>after impregnation by a male. This impregnation is a combining of the
> >>>
> >>>neural
> >>>
> >>>>networks of the parents, and this new neural network is stored in the
> >>>>female. during here. During her pregnancy, the female can die, and
> >
> > carry
> >
> >>>her
> >>>
> >>>>unborn child with her (*sob*).
> >>>>
> >>>>The problem is, that I'd like to have the pregnancy scheduled by the
> >
> > model
> >
> >>>>by the following ActionCreateTo:
> >>>>--------------------------------------------
> >>>>-scheduleBirthFromMother: (id) mother__
> >>>>{
> >>>>*snip*
> >>>>[lifeMutationSchedule at: (time + (int) ( 0.25 * DAYSPERYEAR *
> >>>>MINUTESPERDAY ))
> >>>> createActionTo: mother__
> >>>> message: M(haveChild)];
> >>>>*snip*
> >>>>}
> >>>>--------------------------------------------
> >>>>and if the female dies somewhere between impregnation and giving
> >
> > birth,
> >
> >>>this
> >>>
> >>>>message is send to a voided reference (because the female has long and
> >
> > gone
> >
> >>>>been dispatched of by a reaperQueue).
> >>>>The final result is that every call subsequent call to create sends my
> >>>>program crashing to its segmentation faulty damnedness, I presume
> >
> > because a
> >
> >>>>method has been called on with self = nil and as a consequence, the
> >
> > stack
> >
> >>>>has become corrupt.
> >>>>
> >>>>A short term solution I've been using so far, is to not wipe the
> >>>>reaperqueue, but keep all agents in cryostatis for the length of the
> >>>>simulation (so the speak). Another solution would be to undo the
> >>>>ActionCreateTo, but I see no way in all documentation I've searched
> >
> > through
> >
> >>>>how this can be done.
> >>>>
> >>>>If no one can help me, I will probably resort to waiting untill after
> >
> > the
> >
> >>>>message has been sent to the dead agent before I wipe it from memory,
> >
> > but I
> >
> >>>>don't think that would be a very clean solution.
> >>>>
> >>>>Kind regards,
> >>>>
> >>>>Martijn Cox
> >>>>
> >>>>ps: my gratitude for supplying the incredibly usefull environment to
> >
> > anyone
> >
> >>>>who has ever contributed to swarm! :)
> >>>>_______________________________________________
> >>>>Support mailing list
> >>>>address@hidden
> >>>>http://www.swarm.org/mailman/listinfo/support
> >>>
> >>>
> >>>--
> >>>Paul E. Johnson email: address@hidden
> >>>Dept. of Political Science http://lark.cc.ku.edu/~pauljohn
> >>>1541 Lilac Lane, Rm 504
> >>>University of Kansas Office: (785) 864-9086
> >>>Lawrence, Kansas 66044-3177 FAX: (785) 864-5700
> >>>_______________________________________________
> >>>Support mailing list
> >>>address@hidden
> >>>http://www.swarm.org/mailman/listinfo/support
> >>>
> >>
> >>
> >>
> >>_________________________________________________________
> >> Ken Cline W: (443) 287-2636
> >> address@hidden
> >>
> >>
> >
> > _______________________________________________
> > Support mailing list
> > address@hidden
> > http://www.swarm.org/mailman/listinfo/support
>
>
> --
> Paul E. Johnson email: address@hidden
> Dept. of Political Science http://lark.cc.ku.edu/~pauljohn
> 1541 Lilac Lane, Rm 504
> University of Kansas Office: (785) 864-9086
> Lawrence, Kansas 66044-3177 FAX: (785) 864-5700
>
>
- [Swarm-Support] How to prevent sending a message to a dropped object?, martijn cox, 2005/08/01
- Re: [Swarm-Support] How to prevent sending a message to a dropped object?, Paul Johnson, 2005/08/01
- Re: [Swarm-Support] How to prevent sending a message to a dropped object?, Ken Cline, 2005/08/01
- Re: [Swarm-Support] How to prevent sending a message to a droppedobject?, martijn cox, 2005/08/02
- Re: [Swarm-Support] How to prevent sending a message to a droppedobject?, Paul Johnson, 2005/08/02
- Re: [Swarm-Support] How to prevent sending a message to a dropped object?,
martijn cox <=
- Re: [Swarm-Support] How to prevent sending a message to a dropped object?, Paul Johnson, 2005/08/03
- Re: [Swarm-Support] How to prevent sending a message to a droppedobject?, martijn cox, 2005/08/04
- Re: [Swarm-Support] How to prevent sending a message to a dropped object?, Ken Cline, 2005/08/04
- Re: [Swarm-Support] How to prevent sending a message to a droppedobject?, martijn cox, 2005/08/09
- Re: [Swarm-Support] How to prevent sending a message to a droppedobject?, Paul Johnson, 2005/08/09