Re: [PATCH] Fix handle leak in write_tree
From: Alex Riesen <hidden>
Date: 2016-06-15 22:43:06
On 4/24/07, Junio C Hamano [off-list ref] wrote:
quoted
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?