On Sat, Aug 2, 2008 at 4:49 PM, Gustavo Sverzut Barbieri
<[EMAIL PROTECTED]> wrote:
> On Sat, Aug 2, 2008 at 11:34 AM, Jorge Luis Zapata Muga
> <[EMAIL PROTECTED]> wrote:
>> On Sat, Aug 2, 2008 at 9:27 AM, Gustavo Sverzut Barbieri
>> <[EMAIL PROTECTED]> wrote:
>>> Hi guys,
>>>
>>> I still don't have time to play/help with Eina, but from what I saw so
>>> far, I'd like to propose some ideas and request some features:
>>>
>>>  - make data types thread safe. I know evas and other libraries are
>>> not thread safe, but not being able to create lists, arrays and hashes
>>> on different threads is too much limited! I'm not talking about append
>>> to the same list from different threads, but creating nodes for
>>> different lists on different threads. Today this will fail because of
>>> mempool and other cache.

>> I agree with you, making eina thread safe is one of the goals we have.
>> An making the data types thread safe is a must.
>> As a side note, there are already comments on such a thing for
>> eina_error, I'd like to make the error subsystem thread safe, and add
>> a callback to actually do something when an error wants to be printed
>> instead of sending the data to stdout, a callback so a an application
>> might want to write the errors into a file (logging), etc.

> great!

Making eina thread safe is one of the goal. As I care about
performance, I just don't know how, but definitively on the road map.

>>>  - provide iterator pattern as a different, complementary system. I'm
>>> using this with Guarana and have iterator for my own list and also
>>> Evas_List. What I have is something as simple as:
>>>             eina_iterator_t *eina_XXXX_iterator_get(XXXX_t *object);
>>>             int eina_iterator_next(eina_iterator_t *itr, void **data);
>>>             void eina_iterator_del(eina_iterator_t *itr);
>>>             typedef struct { int (*next)(eina_iterator_t *itr, void
>>> **data); void (*free)(eina_iterator_t *itr) } eina_iterator_t;
>>>     users can "extend" from eina_iterator_t and append required
>>> fields, like current list node. This simplifies iteration and
>>> abstracts if you want to use array, lists and even Python/Perl/JS list
>>> objects.
>>
>> Yes, this is good too, im not sure if cedric might want it, as he is
>> some kind of performance addict :) and adding another pointer
>> reference might slow it down, but i prefer this normalization on the
>> API, is a trade-off i prefer.
>
> I don't want everyone to always use it, it can be kept as a helper and
> people who wish to have an abstract data model (usually void *) and
> access it as a list can provide the iterator. I use it in my mvc
> lists, something like: model_set(void *model, eina_iterator_t
> *(*accessor_constructor)(void *model)) and whenever I want to iterate
> the whole list, I delete the old, create a new and start the loop.

>>>  - provide accessor (? don't know the real name) pattern, similar to
>>> iterator, this one will access based on index. This one make code
>>> really simple and if you implement it right, for Evas_List you can
>>> have very quick access if you remember last accessed node and search
>>> from head, tail or current position. I also have this code and can
>>> contribute with Evas_List example.
>>>
>>
>> Im not sure if i understood this correctly, but i think what you are
>> proposing is similar to what Ecore_List do, you keep track of the last
>> accessed node on one side and the last added/deleted node in the
>> other, even so IMHO the ecore_list API is not clear enough on what
>> functions update one or the other, and yes, this is possible, i did an
>> ecore_list wrapper using evas_list (i gave the reference for it on
>> another ml thread), and i think is good to have to speed up node
>> retrieve.
>
> It's a bit different as it's an external structure, you can create as
> much iterators or accessors as you want and use them in different
> ways. What you CAN'T is modify the iterated/accessed object while it's
> in use.
>
> Similar to eina_iterator:
>
> typedef struct eina_accessor {
>   int (*get)(eina_acessor_t *accessor, int index, void **data);
>   void (*free)(eina_accessor_t *accessor);
> } eina_acessor_t;
>
> When you want to create an accessor for Evas_List, you extend this
> with some members:
>
> struct eina_accessor_evas_list {
>    eina_accessor_t base;
>    const Evas_List *head;
>    struct {
>        const Evas_List *node;
>        int index;
>    } last_used;
> }
>
> when you access some index you calculate: am I near to 'index' going
> from head (0), tail (evas_list_count()) or last_used index? Than you
> calculate the direction and how many items you have to go.

This accessor and iterator stuff sounds interresting feature to me
too. I am going to add them to eina during the week. Do people want
this also for inlist too ?

-- 
Cedric BAIL

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to