X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Fvfs%2Fnodecache.c;h=5fdebb6b655b240cf64f901485ba6b9279b3ccfd;hb=HEAD;hp=b1b1b61cee04067b15c707726074645b3d6c817f;hpb=4f6ab5fa31fb60ddd8085783c8d21a48cab4c674;p=tpg%2Facess2.git diff --git a/Kernel/vfs/nodecache.c b/Kernel/vfs/nodecache.c deleted file mode 100644 index b1b1b61c..00000000 --- a/Kernel/vfs/nodecache.c +++ /dev/null @@ -1,217 +0,0 @@ -/* - * AcessMicro VFS - * - File IO Passthru's - */ -#include -#include "vfs.h" -#include "vfs_int.h" - -// === TYPES === -typedef struct sCachedInode { - struct sCachedInode *Next; - tVFS_Node Node; -} tCachedInode; -typedef struct sInodeCache { - struct sInodeCache *Next; - int Handle; - tCachedInode *FirstNode; // Sorted List - Uint64 MaxCached; // Speeds up Searching -} tInodeCache; - -// === PROTOTYPES === -tInodeCache *Inode_int_GetFSCache(int Handle); - -// === GLOBALS === - int gVFS_NextInodeHandle = 1; - int gilVFS_InodeCache = 0; -tInodeCache *gVFS_InodeCache = NULL; - -// === CODE === -/** - * \fn int Inode_GetHandle() - */ -int Inode_GetHandle() -{ - tInodeCache *ent; - - ent = malloc( sizeof(tInodeCache) ); - ent->MaxCached = 0; - ent->Handle = gVFS_NextInodeHandle++; - ent->Next = NULL; ent->FirstNode = NULL; - - // Add to list - LOCK( &gilVFS_InodeCache ); - ent->Next = gVFS_InodeCache; - gVFS_InodeCache = ent; - RELEASE( &gilVFS_InodeCache ); - - return gVFS_NextInodeHandle-1; -} - -/** - * \fn tVFS_Node *Inode_GetCache(int Handle, Uint64 Inode) - * \brief Gets a node from the cache - */ -tVFS_Node *Inode_GetCache(int Handle, Uint64 Inode) -{ - tInodeCache *cache; - tCachedInode *ent; - - cache = Inode_int_GetFSCache(Handle); - if(!cache) return NULL; - - if(Inode > cache->MaxCached) return NULL; - - // Search Cache - ent = cache->FirstNode; - for( ; ent; ent = ent->Next ) - { - if(ent->Node.Inode < Inode) continue; - if(ent->Node.Inode > Inode) return NULL; - ent->Node.ReferenceCount ++; - return &ent->Node; - } - - return NULL; // Should never be reached -} - -/** - * \fn tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node) - */ -tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node) -{ - tInodeCache *cache; - tCachedInode *newEnt, *ent, *prev; - - cache = Inode_int_GetFSCache(Handle); - if(!cache) return NULL; - - if(Node->Inode > cache->MaxCached) - cache->MaxCached = Node->Inode; - - // Search Cache - ent = cache->FirstNode; - prev = (tCachedInode*) &cache->FirstNode; - for( ; ent; prev = ent, ent = ent->Next ) - { - if(ent->Node.Inode < Node->Inode) continue; - if(ent->Node.Inode == Node->Inode) { - ent->Node.ReferenceCount ++; - return &ent->Node; - } - break; - } - - // Create new entity - newEnt = malloc(sizeof(tCachedInode)); - newEnt->Next = ent; - memcpy(&newEnt->Node, Node, sizeof(tVFS_Node)); - prev->Next = newEnt; - - return &newEnt->Node; -} - -/** - * \fn void Inode_UncacheNode(int Handle, Uint64 Inode) - * \brief Dereferences/Removes a cached node - */ -void Inode_UncacheNode(int Handle, Uint64 Inode) -{ - tInodeCache *cache; - tCachedInode *ent, *prev; - - cache = Inode_int_GetFSCache(Handle); - if(!cache) return; - - if(Inode > cache->MaxCached) return; - - // Search Cache - ent = cache->FirstNode; - prev = (tCachedInode*) &cache->FirstNode; // Special case removal - for( ; ent; prev = ent, ent = ent->Next ) - { - if(ent->Node.Inode < Inode) continue; - if(ent->Node.Inode > Inode) return; - ent->Node.ReferenceCount --; - // Check if node needs to be freed - if(ent->Node.ReferenceCount == 0) - { - prev->Next = ent->Next; - if(ent->Node.Inode == cache->MaxCached) - { - if(ent != cache->FirstNode) - cache->MaxCached = prev->Node.Inode; - else - cache->MaxCached = 0; - } - - free(ent); - } - return; - } -} - -/** - * \fn void Inode_ClearCache(int Handle) - * \brief Removes a cache - */ -void Inode_ClearCache(int Handle) -{ - tInodeCache *cache; - tInodeCache *prev = NULL; - tCachedInode *ent, *next; - - // Find the cache - for( - cache = gVFS_InodeCache; - cache && cache->Handle < Handle; - prev = cache, cache = cache->Next - ); - if(!cache || cache->Handle != Handle) return; - - // Search Cache - ent = cache->FirstNode; - while( ent ) - { - ent->Node.ReferenceCount = 1; - next = ent->Next; - - if(ent->Node.Close) - ent->Node.Close( &ent->Node ); - free(ent); - - ent = next; - } - - // Free Cache - if(prev == NULL) - gVFS_InodeCache = cache->Next; - else - prev->Next = cache->Next; - free(cache); -} - -/** - * \fn tInodeCache *Inode_int_GetFSCache(int Handle) - * \brief Gets a cache given it's handle - */ -tInodeCache *Inode_int_GetFSCache(int Handle) -{ - tInodeCache *cache = gVFS_InodeCache; - // Find Cache - for( ; cache; cache = cache->Next ) - { - if(cache->Handle > Handle) continue; - if(cache->Handle < Handle) { - Warning("Inode_int_GetFSCache - Handle %i not in cache\n", Handle); - return NULL; - } - break; - } - if(!cache) { - Warning("Inode_int_GetFSCache - Handle %i not in cache [NULL]\n", Handle); - return NULL; - } - - return cache; -}