X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fselect.c;h=a18b91c58dce0fe1a65d7b376f969ca201426403;hb=6274aaa8894e14462a36c69090e2f9235f130e31;hp=d4c5cd8545d0300a3861b63a6c2911add54e88f2;hpb=a508bd147b638786d1f45869d41cfeb57f3fbedb;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/select.c b/KernelLand/Kernel/vfs/select.c index d4c5cd85..a18b91c5 100644 --- a/KernelLand/Kernel/vfs/select.c +++ b/KernelLand/Kernel/vfs/select.c @@ -55,13 +55,14 @@ void VFS_int_Select_SignalAll(tVFS_SelectList *List); // === FUNCTIONS === int VFS_SelectNode(tVFS_Node *Node, int TypeFlags, tTime *Timeout, const char *Name) { - tThread *thisthread = Proc_GetCurThread(); - int ret, type; + tThread * const thisthread = Proc_GetCurThread(); + int ret; ENTER("pNode iTypeFlags pTimeout sName", Node, TypeFlags, Timeout, Name); // Initialise - for( type = 0; type < 3; type ++ ) + ret = 0; + for( int type = 0; type < 3; type ++ ) { tVFS_SelectList **list; int *flag, wanted, maxAllowed; @@ -77,17 +78,19 @@ int VFS_SelectNode(tVFS_Node *Node, int TypeFlags, tTime *Timeout, const char *N VFS_int_Select_AddThread(*list, thisthread, maxAllowed); if( *flag == wanted ) { - VFS_int_Select_RemThread(*list, thisthread); - LEAVE('i', 1); - return 1; + ret |= (1 << type); } } // Wait for things - if( !Timeout ) + if( ret ) + { + // Skip wait, conditions already met + LOG("ret = %i, skipping wait", ret); + } + else if( !Timeout ) { LOG("Semaphore_Wait()"); - // TODO: Actual timeout Threads_WaitEvents( THREAD_EVENT_VFS|THREAD_EVENT_SIGNAL ); } else if( *Timeout > 0 ) @@ -95,7 +98,6 @@ int VFS_SelectNode(tVFS_Node *Node, int TypeFlags, tTime *Timeout, const char *N tTimer *t = Time_AllocateTimer(NULL, NULL); // Clear timer event Threads_ClearEvent( THREAD_EVENT_TIMER ); - // TODO: Convert *Timeout? LOG("Timeout %lli ms", *Timeout); Time_ScheduleTimer( t, *Timeout ); // Wait for the timer or a VFS event @@ -105,13 +107,13 @@ int VFS_SelectNode(tVFS_Node *Node, int TypeFlags, tTime *Timeout, const char *N // Get return value ret = 0; - for( type = 0; type < 3; type ++ ) + for( int type = 0; type < 3; type ++ ) { tVFS_SelectList **list; int *flag, wanted, maxAllowed; if( !(TypeFlags & (1 << type)) ) continue; VFS_int_Select_GetType(type, Node, &list, &flag, &wanted, &maxAllowed); - LOG("VFS_int_Select_RemThread()"); + LOG("VFS_int_Select_RemThread() for %i", type); ASSERT(*list); VFS_int_Select_RemThread(*list, thisthread); ret = ret || *flag == wanted; @@ -163,7 +165,7 @@ int VFS_Select(int MaxHandle, fd_set *ReadHandles, fd_set *WriteHandles, fd_set // Wait for things if( !Timeout ) { - LOG("Semaphore_Wait()"); + LOG("Waiting for VFS/SIGNAL events (Plus 0x%x)", ExtraEvents); // TODO: Actual timeout Threads_WaitEvents( THREAD_EVENT_VFS|THREAD_EVENT_SIGNAL|ExtraEvents ); } @@ -180,6 +182,7 @@ int VFS_Select(int MaxHandle, fd_set *ReadHandles, fd_set *WriteHandles, fd_set Time_FreeTimer(t); } // Fill output (modify *Handles) + LOG("De-registering"); // - Also, de-register ret = VFS_int_Select_Deregister(thisthread, MaxHandle, ReadHandles, 0, IsKernel); ret += VFS_int_Select_Deregister(thisthread, MaxHandle, WriteHandles, 1, IsKernel); @@ -195,6 +198,7 @@ int VFS_Select(int MaxHandle, fd_set *ReadHandles, fd_set *WriteHandles, fd_set // Mark a node as having data ready for reading int VFS_MarkAvaliable(tVFS_Node *Node, BOOL IsDataAvaliable) { + ASSERTR(Node, 1); ENTER("pNode bIsDataAvaliable", Node, IsDataAvaliable); Node->DataAvaliable = !!IsDataAvaliable; if( Node->DataAvaliable ) @@ -206,6 +210,7 @@ int VFS_MarkAvaliable(tVFS_Node *Node, BOOL IsDataAvaliable) // Mark a node as having a full buffer int VFS_MarkFull(tVFS_Node *Node, BOOL IsBufferFull) { + ASSERTR(Node, 1); ENTER("pNode bIsBufferFull", Node, IsBufferFull); Node->BufferFull = !!IsBufferFull; if( !Node->BufferFull ) @@ -217,6 +222,7 @@ int VFS_MarkFull(tVFS_Node *Node, BOOL IsBufferFull) // Mark a node as errored int VFS_MarkError(tVFS_Node *Node, BOOL IsErrorState) { + ASSERTR(Node, 1); ENTER("pNode bIsErrorState", Node, IsErrorState); Node->ErrorOccurred = !!IsErrorState; if( Node->ErrorOccurred )