[erlang-questions] Regarding clearing gen_server state

Edmond Begumisa ebegumisa@REDACTED
Mon Feb 21 01:09:40 CET 2011


Oh, sorry, I misread! I thought you wanted to unsubscribe on a  
crash/error. For the opposite; unsubscribing during ordinary termination  
(anything other than an error)...

terminate(normal, {P, I}) ->
   P ! {unsubscribe, I},
   ignore;
terminate(shutdown, {P, I}) ->
   P ! {unsubscribe, I},
   ignore;
terminate({shutdown,_}, {P, I}) ->
   P ! {unsubscribe, I},
   ignore;
terminate(_Crash, _) ->
   ignore.

- Edmond -

On Mon, 21 Feb 2011 01:48:12 +1100, Edward Wang <yujiangw@REDACTED> wrote:

> Neat, this is what I'm looking for. Thanks, Edmond. I presumed  
> terminate/2
> won't be called if it is a crash.
>
> -Edward
>
> On Sun, Feb 20, 2011 at 7:13 PM, Edmond Begumisa <
> ebegumisa@REDACTED> wrote:
>
>> No need to duplicate that information.
>>
>> * Noting that gen_server calls the terminate callback before it quits
>> * Use this to determine if it's quiting abnormally
>> * If so, send P the information it needs to unsubscribe
>>
>> i.e. From Q where I is the PnP info...
>>
>> init([P, I]) ->
>>  process_flag(trap_exit, true),
>>  {ok, {P, I}}.
>> ..
>> terminate(normal, _) ->
>>  ignore;
>> terminate(shutdown, _) ->
>>  ignore;
>> terminate({shutdown,_}, _) ->
>>  ignore;
>> terminate(_Crash, {P, I}) ->
>>  P ! {unsubscribe, I},
>>  ignore.
>>
>> - Edmond -
>>
>>
>> On Sun, 20 Feb 2011 16:58:30 +1100, Edward Wang <yujiangw@REDACTED>
>> wrote:
>>
>>  Oh, I think I get it figured out.
>>>
>>> Either I need a way to retrieve a gen_server's internal state when a
>>> 'DOWN'
>>> message is received. Is there any? Or, I should use ETS table to store
>>> upnp
>>> service information exclusively, which also eliminates duplication.
>>>
>>> -Ed
>>>
>>> On Sun, Feb 20, 2011 at 11:59 AM, Edward Wang <yujiangw@REDACTED>  
>>> wrote:
>>>
>>>  Steve and Bernard,
>>>>
>>>> Thanks for your reply, that's helpful. I should have been more  
>>>> specific.
>>>>
>>>> I'm working on a UPnP implementation for Erlang recently. After a UPnP
>>>> service in LAN being discovered, one gen_server Q is spawned to  
>>>> represent
>>>> it. Q may tell UPnP service to subscribe to a HTTP callback Url. When
>>>> terminating, unsubscribe it. If Q crashes, ideally, P should do the
>>>> unsubscription.
>>>>
>>>> Only Q knows details about UPnP service. It holds that information in  
>>>> its
>>>> state. There's also a ets table that has all Qs' pid. Other process  
>>>> can
>>>> query the table and asks Q to do certain operation. I find such a  
>>>> design
>>>> conceptually simple.
>>>>
>>>> Except for one problem. If Q crashes, all information about that UPnP
>>>> service is gone. P can't do unsubscription for Q. So eventually, the  
>>>> ets
>>>> table that has Qs' pid becomes to have all information about UPnP
>>>> services.
>>>> It is less elegant and, worse, duplication of the same data.
>>>>
>>>> Alternative solutions?
>>>>
>>>> Regards,
>>>> Edward
>>>> On Feb 20, 2011 7:28 AM, "Bernard Duggan" <bernie@REDACTED> wrote:
>>>>
>>>>
>>
>> --
>> Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
>>


-- 
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/


More information about the erlang-questions mailing list