From: Charles Manning Date: Fri, 17 Sep 2010 02:28:14 +0000 (+1200) Subject: yaffs Add function to get number of open handles X-Git-Tag: pre-name-change~13 X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=commitdiff_plain;h=5e008044bbb82598c2ae8ddd7bab78c955b6d2b0 yaffs Add function to get number of open handles This is not a POSIX function. Useful for checking if the object is in use. Signed-off-by: Charles Manning --- diff --git a/direct/python/yaffsfs.py b/direct/python/yaffsfs.py index 7a51d36..5ef7c76 100644 --- a/direct/python/yaffsfs.py +++ b/direct/python/yaffsfs.py @@ -230,6 +230,11 @@ yaffs_inodecount = ylib.yaffs_inodecount yaffs_inodecount.argtypes = [c_char_p] yaffs_inodecount.restype = c_int +#int yaffs_n_handles(const YCHAR *path) +yaffs_n_handles = ylib.yaffs_n_handles +yaffs_n_handles.argtypes = [c_char_p] +yaffs_n_handles.restype = c_int + #int yaffs_StartUp(void) yaffs_StartUp = ylib.yaffs_StartUp yaffs_StartUp.argtypes = [] diff --git a/direct/yaffsfs.c b/direct/yaffsfs.c index db51171..b709d93 100644 --- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -110,31 +110,46 @@ yaffs_Object *yaffsfs_GetHandleObject(int handle) } /* - * yaffsfs_GetInodeIdForObject - * Grab an inode entry when opening a new inode. + * yaffsfs_FindInodeIdForObject + * Find the inode entry for an object, if it exists. */ -static int yaffsfs_GetInodeIdForObject(yaffs_Object *obj) +static int yaffsfs_FindInodeIdForObject(yaffs_Object *obj) { int i; int ret = -1; - yaffsfs_Inode *in = NULL; if(obj) obj = yaffs_GetEquivalentObject(obj); - /* Look for it. If we can't find it then make one */ + /* Look for it in open inode table*/ for(i = 0; i < YAFFSFS_N_HANDLES && ret < 0; i++){ if(yaffsfs_inode[i].iObj == obj) ret = i; } + return ret; +} + +/* + * yaffsfs_GetInodeIdForObject + * Grab an inode entry when opening a new inode. + */ +static int yaffsfs_GetInodeIdForObject(yaffs_Object *obj) +{ + int i; + int ret; + yaffsfs_Inode *in = NULL; + + if(obj) + obj = yaffs_GetEquivalentObject(obj); + + ret = yaffsfs_FindInodeIdForObject(obj); for(i = 0; i < YAFFSFS_N_HANDLES && ret < 0; i++){ if(!yaffsfs_inode[i].iObj) ret = i; } - - + if(ret>=0){ in = &yaffsfs_inode[ret]; if(!in->iObj) @@ -147,6 +162,17 @@ static int yaffsfs_GetInodeIdForObject(yaffs_Object *obj) return ret; } + +static int yaffsfs_CountHandles(yaffs_Object *obj) +{ + int i = yaffsfs_FindInodeIdForObject(obj); + + if(i >= 0) + return yaffsfs_inode[i].count; + else + return 0; +} + static void yaffsfs_ReleaseInode(yaffsfs_Inode *in) { yaffs_Object *obj; @@ -2223,6 +2249,23 @@ int yaffs_mknod(const YCHAR *pathname, mode_t mode, dev_t dev) return -1; } + + +/* + * yaffs_n_handles() + * Returns number of handles attached to the object + */ +int yaffs_n_handles(const YCHAR *path) +{ + yaffs_Object *obj; + + obj = yaffsfs_FindObject(NULL,path,0); + if(obj) + obj = yaffs_GetEquivalentObject(obj); + + return yaffsfs_CountHandles(obj); +} + int yaffs_DumpDevStruct(const YCHAR *path) { #if 0 diff --git a/direct/yaffsfs.h b/direct/yaffsfs.h index 7c36dab..425e0f1 100644 --- a/direct/yaffsfs.h +++ b/direct/yaffsfs.h @@ -158,6 +158,7 @@ loff_t yaffs_totalspace(const YCHAR *path); int yaffs_inodecount(const YCHAR *path); +int yaffs_n_handles(const YCHAR *path); struct yaffs_DeviceStruct; void yaffs_AddDevice(struct yaffs_DeviceStruct *dev);