On Wednesday, October 17, 2012, Carsten Haitzler wrote:

> On Wed, 17 Oct 2012 15:17:41 -0300 Lucas De Marchi
> <lucas.demar...@profusion.mobi <javascript:;>> said:
>
> > On Wed, Oct 17, 2012 at 11:27 AM, Carsten Haitzler 
> > <ras...@rasterman.com<javascript:;>
> >
> > wrote:
> > > On Wed, 17 Oct 2012 10:01:23 -0300 Gustavo Sverzut Barbieri
> > > <barbi...@profusion.mobi <javascript:;>> said:
> > >
> > > did u read the docs provided? they provide example use cases
> (simplified).
> > >
> > > as to the below - the cost of the ptr isn't worth worrying about -
> they are
> > > temporary... VERY temporary. it's a special thing to allow c to be
> more like
> > > js/lua/shell etc. think of eobj. now we do things like
> > >
> > > obj =  eo_add(class, parent,
> > >               GEOMETRY(10, 20, 50, 30),
> > >               FILE_SET("/path/to/file"),
> > >               GROUP_SET("groupname"));
> > >
> > > ok - so file is a constant string. so is group. now let's pretend we
> want to
> > > FIND a data file in a path or relative to the apps installed dir at
> runtime
> > > and we have:
> > >
> > > const char *file_find(const chart *file);
> > >
> > > how could i do something convenient like
> > >
> > > obj =  eo_add(class, parent,
> > >               GEOMETRY(10, 20, 50, 30),
> > >               FILE_SET(file_find("image.jpg")),
> > >               GROUP_SET(group_find("base")));
> > >
> > > the only way is to provide a buffer to snprintf into OR to return a
> > > strduped or strinshare'd string... the problem is all our existing api
> > > doesn't free this
> >
> > What's the problem of passing a a buffer to snprintf into?
>
> having to keep creating/declaring such buffers yourself all the time.
>
> > const char *file_find(char buf[PATH_MAX], const char *filename)
> > {
> >    const char *prefix = "/tmp";
> >    snprintf(buf, PATH_MAX, "%s/%s", filename);
> >    return buf;
> > }
> >
> > obj =  eo_add(class, parent,
> >               GEOMETRY(10, 20, 50, 30),
> >               FILE_SET(file_find(buf1, "image.jpg")),
> >               GROUP_SET(group_find(buf2, "base")));
> >
> >
> > one big downside from your approach with Eina_Tmpstr is that it's not
> > clear at all who is responsible to free it. Sure there can be a
> > convention like "the function receiving Eina_Tmpstr as parameter free
> > it". But it's a convention prone to bugs. And it will do very bad
> > things if you pass it around:
>
> if something is delcared as
>
> FILE_SET(Eina_Tmpstr *str)
>
> then it declares that it will do the cleanup.
>
> > void f(Eina_Tmpstr *newname) {
> >     my_movefile(my_homedir(), newname);
> >     my_movefile(my_tmpdir(), newname);
> >     eina_tmpstr_del(newname);
> > }
> >
> > > string afterwards. it has no idea where the string came from so you
> CANNOT
> > > do the above as you will leak strings as no one frees them. the
> alternative
> > > is that you have to do it in 2 stages - get the strings first, then
> call
> > > the api, then free them afterwards. imaging you wanted to find 2
> different
> > > files - so you couldnt use a static char buffer either as u'd
> overwrite the
> > > same buffer within the call args.
> >
> > you shouldn't use a static char buffer, but as many buffers as the
> > strings you will snprintf.
>
> and that becomes a problem where you need multilpe strs and keep declaring
> fixed 4k buffers pushing the stack up a lot each time. it also just is
> extra
> cumbersomeness we can avoid - that is what tmpstr does.
>
> > >
> > > tmpstr solves that by provide a very short list of "currently active"
> > > strings that are duplicated and survive as a return string SO they can
> be
> > > passed in as params to the method above and then be freed by the method
> > > when done. the advantage is they are really simple and trivially
> detected
> > > as being a tmpstr or not. if not it does what it does now - leaves it
> > > alone. it may be a const str or some other buffer that doesn't need
> freeing
> > > here. this system is to be able to preserve an entire string as a
> return
> > > value long enough to go INTO another func as is given as examples in
> the
> > > docs.
> > >
> > > this is also part of making things IDE friendly. as above with FILE_SET
> > > literally an IDE could provide not just autocomplete but once u start
> > > typeing in FILE_SET(... pop up a file browser to select a data file
> from
> > > your apps "project tree" without having to find the full file name and
> just
> > > put it in there with the file find api as above nicely for you. as you
> > > scroll around a thumbnail of the file is provided above.near the entry
> in
> > > the src and if u want ot change it just click on it and select
> something
> > > else. it's making it user friendly AND compact. it's one step of many.
> >
> > this IDE-friendly thing could be made regardless how FILE_SET operates
> > or am I missing anything?
>
> it has no context for what purpose the string (or file) will be used. it
> just knows u are finding a file. it doesn't know its an image, or a video
> file
> (emotion), etc. and thus is unable to do nice filtering for you.
>
> the POINT of tmpstr is to do this:
>
>   do_thing(obj, find_file("x"), find_file("y"), find_file("z");
>
> instead of:
>
>   char buf1[4096], buf2[4096], buf3[4096];
>   find_file(buf1, sizeof(buf1), "x");
>   find_file(buf2, sizeof(buf2), "y");
>   find_file(buf3, sizeof(buf3), "z");
>   do_thing(obj, buf1, buf2, buf3);
>
> it's a lot more compact. it's easier to read. easier to use. it uses less
> memory (the 2nd example forces the stack to push up 12k and once stack
> pushes
> its high water mark it stays permanently there even if we pop back down).
>
> you don't HAVE to use it. you can do the 2nd one - it's still compatible
> as it
> skips strings it doesn't know about and is SAFE when doing that (unlike
> stringshare which has to assume a few bytes before the stringptr are some
> strshare data bits). we can add a clean/flush call that nukes all tmpstrs
> every
> now and again. users can call it at the end of a function if they want too
> and
> we can enforce it via the mainloop just in case.


Again I believe your just considering the good path. The wrong will turn
into debugging hell.

I like leandro's approach as its used by him in his server lwan. You can
defer cleanup calls and this works for strings, opened files and whatever
you want.

http://tia.mat.br/posts/deferred_statements_in_c/


>
> > Lucas De Marchi
> >
> >
> ------------------------------------------------------------------------------
> > Everyone hates slow websites. So do we.
> > Make your web apps faster with AppDynamics
> > Download AppDynamics Lite for free today:
> > http://p.sf.net/sfu/appdyn_sfd2d_oct
> > _______________________________________________
> > enlightenment-devel mailing list
> > enlightenment-devel@lists.sourceforge.net <javascript:;>
> > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> >
>
>
> --
> ------------- Codito, ergo sum - "I code, therefore I am" --------------
> The Rasterman (Carsten Haitzler)    ras...@rasterman.com <javascript:;>
>
>
>
> ------------------------------------------------------------------------------
> Everyone hates slow websites. So do we.
> Make your web apps faster with AppDynamics
> Download AppDynamics Lite for free today:
> http://p.sf.net/sfu/appdyn_sfd2d_oct
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net <javascript:;>
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>


-- 
Gustavo Sverzut Barbieri
http://profusion.mobi embedded systems
--------------------------------------
MSN: barbi...@gmail.com
Skype: gsbarbieri
Mobile: +55 (19) 9225-2202
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to