From: Alex Riesen Date: Tue, 24 Apr 2007 09:30:07 GMT Subject: Re: [PATCH] Fix handle leak in write_tree Message-ID: <81b0412b0704240230x3a5b473k5da3d45d9c997c3b@mail.gmail.com> In-Reply-To: <7vps5u9wsk.fsf@assigned-by-dhcp.cox.net> On 4/24/07, Junio C Hamano wrote: > > How about something like this (just interface): > > > > struct lock_file > > { > > struct lock_file *next; > > pid_t owner; > > int fd; > > char on_list; > > char filename[PATH_MAX]; > > }; > > > > struct lock_file *open_locked(const char *path, int die_on_error); > > struct lock_file *open_index_locked(int die_on_error); > > void commit_lock_file(struct lock_file *); /* always assuming .lock */ > > void rollback_lock_file(struct lock_file *); > > I agree that making commit and rollback close the file > descriptor and lock holders to use lock->fd for write() makes > more sense, although it is a bit unclear from the above set of > function signatures what your plan on the lifetime rule for > "struct lock_file" is. If it will be linked to the list given > to the atexit() handler and the caller of open_locked() never > frees it, I think I am fine with the interface. I actually expected the caller to define the lifetime. atexit is not exactly libification-effort friendly. I could imagine open*locked with an additional argument for atexit registration, I just don't like the idea (dislike die_on_error too). Isn't such kind of resource control _generally_ nicer to implement in the top levels of a program?