Hello,
(my comments are inline, and please keep the discussion on list)

2011/5/19 Jan Spurný <[email protected]>:
> Hi,
>
> thanks again for your reply,
>
>>  >> Did you have any problem with the following? it should be the first
>>  >> thing you try (and is likely the correct thing):
>>  >>
>>  >> [CCode (cheader_filename = "oldlib.h")]
>>  >> public static GLib.List<X> old_lib_make_x_list();
>>  >
>>  > Thanks for your reply, but unfortunately, it really WAS the first thing I 
>> did
>>  > - but because X is not reference counted, it resulted in errors like this:
>>  >
>>  > oldlib.vapi:61.33-61.36: error: duplicating X instance, use unowned 
>> variable
>>  or explicitly invoke copy method
>>  >        public static GLib.List<X> old_lib_make_x_list();
>>  >                                ^
>>
>>  Yeah, this error message is misleading. You should put unowned in your
>>  loop and not in the bindings, i.e.
>>
>>  foreach(unowned X myx in old_lib_make_x_list()) {
>>      ...
>>  }
>
> ok, that makes sense.. unfortunately, it won't help me much - it's probably my
> fault, I should've explained it better - I'm using GLib.List<X> returned from
Are you sure you aren't iterating over the returned list anywhere? The
error message you got suggests you are. (but maybe I'm mistaken)

> oldlib almost exclusively only to pass it to another oldlib function, so what
> I really need to do is something like this:
>
> void vala_func() {
>  var list = old_lib_make_x_list();
>  var list2 = old_lib_filter_list(list);
>  var list3 = old_lib_obscure_function_xy(list, list2);
>  old_lib_supercomplicated_function(list2, list3);
> }
>
> which in c (c99) I would write like this:
>
> void c_func()
> {
>  GList *list = old_lib_make_x_list();
>  GList *list2 = old_lib_filter_list(list);
>  GList *list3 = old_lib_obscure_function_xy(list, list2);
>  old_lib_supercomplicated_function(list2, list3);
>
>  // old_lib_destroy_x_list destroys the list (by a call to g_list_free) but
>  // also the contents (by a call to x_destroy for each element)
>  old_lib_destroy_x_list(list);
>  old_lib_destroy_x_list(list2);
>  old_lib_destroy_x_list(list3);
> }

This should be exactly the the expected result (that is, if you don't
mind that valac uses __g_list_free__x_destroy_ instead of
old_lib_destroy_x_list)


> So I need some way how to get the return value of old_lib list generating
> functions and at the same time to make sure the list gets destroyed..

In general, you shouldn't worry much about memory management: if this
is something that is normally done in Vala (in your example, the user
should free both the list and its contents), just declare it normally.

> Please tell me if this is confusing, I'm not really good in english, so if
> this doesn't make sense, I'll try to write some minimal piece of code which
> could demonstrate my problem more clearly.

Your english is fine :-) And yes, a minimal reproduction of your
problem would really help.

Regards,
Abderrahim
_______________________________________________
vala-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to