[erlang-questions] atomic ets:take_first, ets:take_last

Mikael Pettersson <>
Sat Jul 16 16:36:42 CEST 2016


Alexandre Beniaminov writes:
 > Thank you.
 > You're right, and you've answered on part of my question:
 > 
 > << Now, anything can happen in between, so in particular, ets:take/2 may
 > return [] if the key was deleted or taken out by another process between
 > the two calls.>>
 > 
 > I would like to ask the community what do you think about to add  to ets
 > module two atomic functions: ets:take_first/1 and ets:take_last/1  ?

I would be more interested in a generalized atomic compare_and_<op> function,
where <op> could be to delete the record or to update one of its fields.

take_first could then be synthesized on top of first + compare_and_delete.

My interest here is in building synchronisation objects without having to
call a helper process (i.e. a gen_server or similar) to maintain the state
(which is in an ETS table).

> 
 > 2016-07-15 1:39 GMT+03:00 Alexandre Beniaminov <>:
 > 
 > > Thank you.
 > > You're right, and you've answered on part of my question:
 > >
 > > << Now, anything can happen in between, so in particular, ets:take/2 may
 > > return [] if the key was deleted or taken out by another process between
 > > the two calls.>>
 > >
 > > I would like to ask the community what do you think about to add  to ets
 > > module two atomic functions: ets:take_first/1 and ets:take_last/1  ?
 > >
 > > 2016-07-14 21:19 GMT+03:00 Jesper Louis Andersen <
 > > >:
 > >
 > >>
 > >> On Thu, Jul 14, 2016 at 8:06 PM, Alexandre Beniaminov <
 > >> > wrote:
 > >>
 > >>> atomic
 > >>
 > >>
 > >> You have to say what you expect to be atomic/linearizable. In your above
 > >> code, suppose you are being scheduled out between the call to ets:first/1
 > >> and ets:take/2. Now, anything can happen in between, so in particular,
 > >> ets:take/2 may return [] if the key was deleted or taken out by another
 > >> process between the two calls.
 > >>
 > >> But taken individually, the set of ets:first/1, ets:take/2 and
 > >> ets:lookup/2 ought to be linearizable. I.e., there is some point in time
 > >> (the atomic commit-point) at which ets:take/2 removes the objects. After
 > >> this commit-point first/1 and lookup/2 will not see the Key present in the
 > >> table anymore.
 > >>
 > >> So the question of if it is atomic or not depends on the precise
 > >> definition of what you ask.
 > >>
 > >>
 > >> --
 > >> J.
 > >>
 > >
 > >
 > >
 > > --
 > > С уважением,
 > > Александр Бениаминов
 > >
 > 
 > 
 > 
 > -- 
 > С уважением,
 > Александр Бениаминов
 > 
 > ----------------------------------------------------------------------
 > _______________________________________________
 > erlang-questions mailing list
 > 
 > http://erlang.org/mailman/listinfo/erlang-questions

-- 


More information about the erlang-questions mailing list