and will I not fall in the same case as the *TS* above? That is, when I do the unsafe_store will that memory be owned by the C lib (and therefore safe to be free by it)?
segunda-feira, 10 de Agosto de 2015 às 21:13:39 UTC+1, Jameson escreveu: > > right, you can't mutate it directly, but you can make a new copy with the > intended changes, then use unsafe_store to write those changes back into > the struct. > > On Mon, Aug 10, 2015 at 3:56 PM J Luis <jmf...@gmail.com <javascript:>> > wrote: > >> ... amd I am using unsafe_load() >> >> >> S0 = unsafe_load(unsafe_load(TTABLE.segment,1),1) # >> ::GMT.GMT_TEXTSEGMENT >> https://github.com/joa-quim/GMT.jl/blob/master/src/gmt_main.jl#L860 >> >> but if I add this line after >> >> S0.n_rows = 2 >> >> ERROR: type GMT_TEXTSEGMENT is immutable >> in GMTJL_Text_init at C:\progs_cygw\GMTdev\GMT.jl\src\gmt_main.jl:861 >> >> >> >> segunda-feira, 10 de Agosto de 2015 às 20:47:27 UTC+1, J Luis escreveu: >>> >>> >>> >>> segunda-feira, 10 de Agosto de 2015 às 20:15:57 UTC+1, Jameson escreveu: >>>> >>>> My suggestion would be to mirror only the parts of those structs that >>>> are part of the public API. Then use unsafe_load / unsafe_store to read / >>>> modify / write the intended changes. The API authors were nice to put the >>>> public fields at the top so that you can do this (many libraries don't / >>>> can't do this). Then the "real" object will always be the Ptr to the one >>>> allocated by GMT, and you only have temporary copies of them alive at any >>>> time inside Julia. >>>> >>> >>> But GMT_TEXTSEGMENT is part of the GMT API (hm, have to check why it >>> doesn't show up in http://gmt.soest.hawaii.edu/doc/latest/GMT_API.html) >>> >>> Sorry, to be concrete, and repeating myself. I need to change n_rows of >>> >>> >>> http://gmt.soest.hawaii.edu/projects/gmt/repository/entry/branches/5.2.0/src/gmt_resources.h#L517 >>> >>> Can I do it? >>> >>> BTW, I'm a developer of GMT (that's why I could create that backdoor >>> function that temporarily saved me on this), although the API was all >>> created by P. Wessel. >>> >>> >>> >>>> >>>> >>>> On Mon, Aug 10, 2015 at 2:53 PM J Luis <jmf...@gmail.com> wrote: >>>> >>>>> >>>>> >>>>>> usually, there's is one big toplevel distinction driven by who will >>>>>> free the memory: if C will be freeing the memory, then you must always >>>>>> have >>>>>> the C code also allocating the memory (hopefully the library author >>>>>> provide >>>>>> some sort of new / alloc / create function, although sometimes they rely >>>>>> on >>>>>> the user calling malloc). >>>>>> >>>>> >>>>> Yes, the GMT_Create_Data (that ccals a C function with the same name) >>>>> does that. >>>>> >>>>> >>>>> https://github.com/joa-quim/GMT.jl/blob/master/src/gmt_main.jl#L852 >>>>> >>>>> <https://github.com/joa-quim/GMT.jl/blob/master/src/gmt_main.jl#L852> >>>>> >>>>>> >>>>>> > Is that really impossible and I'm doomed to the path >>>>>> exemplified with that C GMT_blind_change_struct() function? >>>>>> >>>>>> ideally, C libraries that expect to manage a struct's memory also >>>>>> provide accessor methods to read any of the structs important fields so >>>>>> that you can always declare its type as Ptr{Void} in Julia. However, I >>>>>> realize this is true of many C libraries. >>>>>> >>>>> >>>>> >>>>> The pointers are ok, my real problem are those 'scalars' like the >>>>> n_rows in >>>>> >>>>> >>>>> http://gmt.soest.hawaii.edu/projects/gmt/repository/entry/branches/5.2.0/src/gmt_resources.h#L517 >>>>> >>>>> I only know the number of rows after having read the data and than the >>>>> immut is already created >>>>> >>>>> >>>>>> >>>>>> >>>>>> On Mon, Aug 10, 2015 at 9:58 AM J Luis <jmf...@gmail.com> wrote: >>>>>> >>>>>>> >>>>>>> >>>>>>> segunda-feira, 10 de Agosto de 2015 às 14:15:15 UTC+1, Isaiah >>>>>>> escreveu: >>>>>>>> >>>>>>>> https://github.com/JuliaLang/julia/pull/12113 >>>>>>>> >>>>>>> >>>>>>> So there is hope. Thanks >>>>>>> >>>>>>> >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Mon, Aug 10, 2015 at 8:11 AM, J Luis <jmf...@gmail.com> wrote: >>>>>>>> >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>> Let me try to explain my need to fight with immutables. I made >>>>>>>>> another round to my GMT wrapper (which is hopefully almost ready) and >>>>>>>>> struggled again with the immutables. The point is that GMT API >>>>>>>>> structs are >>>>>>>>> deeply nested and need to be mirrored with immutables (otherwise >>>>>>>>> Julia >>>>>>>>> crashes). Namely this one >>>>>>>>> >>>>>>>>> >>>>>>>>> https://github.com/joa-quim/GMT.jl/blob/master/src/libgmt_h.jl#L1445 >>>>>>>>> >>>>>>>>> so I first went with the advised solution of creating and filling >>>>>>>>> the type is julia and replace the pointees of the immutable type, >>>>>>>>> which I >>>>>>>>> did here (see the commented code): >>>>>>>>> >>>>>>>>> >>>>>>>>> https://github.com/joa-quim/GMT.jl/blob/master/src/gmt_main.jl#L874 >>>>>>>>> >>>>>>>>> but the problem now is that *TS* is a memory owned by Julia and >>>>>>>>> that will be fatal when GMT's own memory cleaning functions try to >>>>>>>>> free it >>>>>>>>> and -> Julia crashes. >>>>>>>>> So if use a pure Julia solution I've no choice but to let memory >>>>>>>>> leeks and other house keeping to be done. Not good at all. >>>>>>>>> >>>>>>>>> For the time being I ended up with this ugly C trick of sending >>>>>>>>> to C the job of changing some members (non-pointers) that need >>>>>>>>> absolutely >>>>>>>>> to changed after the type has been created >>>>>>>>> >>>>>>>>> >>>>>>>>> http://gmt.soest.hawaii.edu/projects/gmt/repository/entry/branches/5.2.0/src/gmt_api.c#L7376 >>>>>>>>> >>>>>>>>> but besides being ugly I've no guarantee that I can convince my >>>>>>>>> partners to let that backdoor go into the GMT lib. I much lovelier >>>>>>>>> trick >>>>>>>>> would be if this chunk only of that backdoor function would work. >>>>>>>>> >>>>>>>>> else if (!strncmp (keyword, "API_POINTER_", 12U)) { /* >>>>>>>>> Blindly change a pointer to a scalar. Irritatingly Julia ignores this >>>>>>>>> */ >>>>>>>>> if (!strcmp(&keyword[12], "UINT64")) >>>>>>>>> *(uint64_t *)ptr = *(uint64_t *)what; >>>>>>>>> } >>>>>>>>> >>>>>>>>> but the problem is that I am not able to get from Julia the >>>>>>>>> pointers address that would make that work. I tried with >>>>>>>>> >>>>>>>>> pointer(S0.n_rows) >>>>>>>>> >>>>>>>>> and >>>>>>>>> >>>>>>>>> pointer_from_objref(S0.n_rows) >>>>>>>>> >>>>>>>>> and others, but nothing. It seams to work in the C side (I can see >>>>>>>>> it with the debugger when I set in that piece of code) but than >>>>>>>>> nothing >>>>>>>>> changes. The C struct doesn't change. >>>>>>>>> Is there a way to get the C pointer address from Julia? >>>>>>>>> >>>>>>>>> So, I guess my question is: >>>>>>>>> >>>>>>>>> How do we do to change immutable members that are not pointers? >>>>>>>>> Is that really impossible and I'm doomed to the path >>>>>>>>> exemplified with that C GMT_blind_change_struct() function? >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>