When an object is being finalized, other thread may re-reference the object right before it gets removed from the table (making ref_count greater than 1) and then quickly release that reference before g_object_unref() re-checks the refcount.
If that happens, the object may remain in the table by time when its finalize() callback is called. That applies both to local and remote objects.
We still have to invalidate the handle in dispose() callback because it's the last point when GObject can be legitimately re-referenced and brought back to life.
When an object is being finalized, other thread may re-reference the object right before it gets removed from the table (making ref_count greater than 1) and then quickly release that reference before g_object_unref() re-checks the refcount.
If that happens, the object may remain in the table by time when its finalize() callback is called. That applies both to local and remote objects.
We still have to invalidate the handle in dispose() callback because it's the last point when GObject can be legitimately re-referenced and brought back to life.