I didn't have particularly strong feelings one way or the other, but between your points about the conceptual ownership semantics and the resulting code simplification/hardening, I like it.

-Nathan

On 5/12/2018 10:27 AM, Larry Gritz wrote:
On May 12, 2018, at 3:04 AM, Gregor Mückl <[email protected]> wrote:

Why a unique_ptr specifically? This forces the concept of a singular owner onto users of OIIO. A shared_ptr would work just as well, wouldn't it? It would trade a bit of reference counting overhead for not imposing a strict single owner.

Here's my case for unique_ptr / single owner:

ImageOutput is absolutely, completely a one-owner conceptual model, because you're appending to and altering the file as you make write() calls. It can't get any more stateful and single-owner than that.

ImageInput is more subtle because the file itself is not mutable, but the ImageInput itself is very stateful and intended to be single owner. Until very recently, absolutely nothing about ImageInput was safe for multiple owners (most basically, you don't want one co-owner to close the file and the other co-owner to still need to read from it; more subtlety, it gets even more complicated with seek_subimage for multi-subimage or mip-mapped images). Very recently, we added some new API calls (read and spec calls that take explicit subimage & miplevel parameters) that have guaranteed thread safety, but ONLY AGAINST EACH OTHER. So shared ownership of an ImageInput is still unsafe for legacy code that uses the old methods, or basically any time that the app isn't being extremely careful about only doing those thread-safe reads concurrently but nothing else. The ImageCache/TextureSystem is careful to do it right with concurrency in mind, but I don't expect other apps to be safe, so it's better for them to think of it in terms of single ownership.

I thought about shared_ptr, and it would certainly work. Note also that you CAN convert a unique_ptr to a shared_ptr if you need shared usage, and in fact we do so internal to the ImageCache, in this very review. But you can't go the other direction easily, so if we return a shared_ptr, it's takes a lot more care on the caller's part to try to enforce single ownership on the app side.

--
Larry Gritz






_______________________________________________
Oiio-dev mailing list
[email protected]
http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org


_______________________________________________
Oiio-dev mailing list
[email protected]
http://lists.openimageio.org/listinfo.cgi/oiio-dev-openimageio.org

Reply via email to