On Tue, Apr 12, 2016 at 9:31 AM, FANG Colin <[email protected]> wrote:
> What's the easiest way to print the object in finalizer?

ccall(:jl_, Void, (Any,), obj)

or if it can be delayed to the next task switch.

@schedule ...

>
> On 12 April 2016 at 14:16, Yichao Yu <[email protected]> wrote:
>>
>> On Tue, Apr 12, 2016 at 8:15 AM, FANG Colin <[email protected]> wrote:
>> >  type C
>> >    x::Symbol
>> >
>> >    function C(x::Symbol)
>> >       c = new(x)
>> >       finalizer(c, c->println(1, c, 2))
>> >       c
>> >     end
>> >  end
>> >
>> > a = C(:x)
>> > a = 1
>> > gc()
>> >
>> > error in running finalizer: ErrorException("task switch not allowed from
>> > inside gc finalizer")
>>
>> Since otherwise task switch can happen during any allocation and most
>> people will find this surprising. (it's effectively impossible to
>> create a task-switch-free block)
>>
>> >
>> > However, it works if I manually call finalizer(a).
>>
>> It is less of a problem since you know when you do that.
>>
>> >
>> > So, what's wrong with my usage of finalizer?
>> >
>> > Also, it seems I can only use finalizer(a) once, it doesn't work for the
>> > 2nd
>> > time?
>>
>> It should, there's a bug that this causes the finalizers to be called
>> less frequently https://github.com/JuliaLang/julia/pull/13995
>>
>> There was another bug that old object don't get finalized if you call
>> `finalize` on it but I think it is fixed on both 0.4 and 0.5
>> https://github.com/JuliaLang/julia/pull/13988
>
>

Reply via email to