X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Tools%2FNetTest%2Fvfs_shim.c;h=97ac4db1da257c7b50113b7fdea06408cfb2a2be;hb=ee202510aeee8e264c1eba5cfade82515e119ba2;hp=bc0c67c346d783a9d8e48362bfdbf0d145205ce7;hpb=c29ddaf5a4acb51469c9a4ff10bd0dde88872c46;p=tpg%2Facess2.git diff --git a/Tools/NetTest/vfs_shim.c b/Tools/NetTest/vfs_shim.c index bc0c67c3..97ac4db1 100644 --- a/Tools/NetTest/vfs_shim.c +++ b/Tools/NetTest/vfs_shim.c @@ -12,8 +12,44 @@ // === CODE === int VFS_SelectNode(tVFS_Node *Node, int Type, tTime *Timeout, const char *Name) { + tThread *us = Proc_GetCurThread(); + + int ret = 0; + + Threads_ClearEvent(THREAD_EVENT_VFS); + + if( Type & VFS_SELECT_READ ) { + Node->ReadThreads = (void*)us; + if(Node->DataAvaliable) ret |= VFS_SELECT_READ; + } + if( Type & VFS_SELECT_WRITE ) { + Node->WriteThreads = (void*)us; + if(!Node->BufferFull) ret |= VFS_SELECT_WRITE; + } + if( Type & VFS_SELECT_ERROR ) { + Node->ErrorThreads = (void*)us; + if(Node->ErrorOccurred) ret |= VFS_SELECT_ERROR; + } - return 0; + if( !ret ) + { + // TODO: Timeout + Threads_WaitEvents(THREAD_EVENT_VFS); + } + + if( Type & VFS_SELECT_READ ) { + Node->ReadThreads = NULL; + if(Node->DataAvaliable) ret |= VFS_SELECT_READ; + } + if( Type & VFS_SELECT_WRITE ) { + Node->WriteThreads = NULL; + if(!Node->BufferFull) ret |= VFS_SELECT_WRITE; + } + if( Type & VFS_SELECT_ERROR ) { + Node->ErrorThreads = NULL; + if(Node->ErrorOccurred) ret |= VFS_SELECT_ERROR; + } + return ret; } int VFS_MarkAvaliable(tVFS_Node *Node, BOOL bAvail) @@ -32,6 +68,16 @@ int VFS_MarkError(tVFS_Node *Node, BOOL bError) return 0; } +int VFS_MarkFull(tVFS_Node *Node, BOOL bError) +{ + Node->BufferFull = bError; + if( !Node->BufferFull && Node->WriteThreads ) + Threads_PostEvent( (void*)Node->WriteThreads, THREAD_EVENT_VFS ); + return 0; +} + + +#if 0 int VFS_Open(const char *Path, Uint Flags) { return -1; @@ -40,9 +86,39 @@ int VFS_Open(const char *Path, Uint Flags) void VFS_Close(int FD) { } +#endif -tVFS_Handle *VFS_GetHandle(int FD) +int VFS_AllocHandle(int bIsUser, tVFS_Node *Node, int Mode) { - return NULL; + const int maxfd = *Threads_GetMaxFD(); + tVFS_Handle *handles = *Threads_GetHandlesPtr(); + if( !handles ) { + handles = calloc( maxfd, sizeof(tVFS_Handle) ); + *Threads_GetHandlesPtr() = handles; + } + + // TODO: Global handles + + for( int i = 0; i < maxfd; i ++ ) + { + if( handles[i].Node == NULL ) { + handles[i].Node = Node; + handles[i].Mode = Mode; + return i; + } + } + return -1; } +tVFS_Handle *VFS_GetHandle(int FD) +{ + const int maxfd = *Threads_GetMaxFD(); + tVFS_Handle *handles = *Threads_GetHandlesPtr(); + if( !handles ) + return NULL; + + if( FD < 0 || FD >= maxfd ) + return NULL; + + return &handles[FD]; +}