#if 0
len = Semaphore_Wait( &pipe->Semaphore, remaining );
#else
- VFS_SelectNode(Node, VFS_SELECT_READ, NULL);
+ VFS_SelectNode(Node, VFS_SELECT_READ, NULL, "FIFO_Read");
// Read buffer
// TODO: Rethink this, it might not work on buffer overflow
if(pipe->WritePos - pipe->ReadPos < remaining)
#if 0
len = Semaphore_Signal( &pipe->Semaphore, remaining );
#else
- VFS_SelectNode(Node, VFS_SELECT_WRITE, NULL);
+ VFS_SelectNode(Node, VFS_SELECT_WRITE, NULL, "FIFO_Write");
if(pipe->ReadPos - pipe->WritePos < remaining)
len = pipe->ReadPos - pipe->WritePos;
else
* \param Name Name of filesystem driver to find
*/
extern tVFS_Driver *VFS_GetFSByName(const char *Name);
+
+
+/**
+ * \brief Prepare a node for use
+ */
+extern void VFS_InitNode(tVFS_Node *Node);
+
+/**
+ * \brief Clean up a node, ready for deletion
+ * \note This should ALWAYS be called before a node is freed, as it
+ * cleans up VFS internal structures.
+ */
+extern void VFS_CleanupNode(tVFS_Node *Node);
+
/**
* \fn tVFS_ACL *VFS_UnixToAcessACL(Uint Mode, Uint Owner, Uint Group)
* \brief Transforms Unix Permssions into Acess ACLs
* \param Node Node to wait on
* \param Type Type of wait
* \param Timeout Time to wait (NULL for infinite wait)
+ * \param Name Name to show in debug output
* \return Number of nodes that actioned (0 or 1)
*/
-extern int VFS_SelectNode(tVFS_Node *Node, enum eVFS_SelectTypes Type, tTime *Timeout);
+extern int VFS_SelectNode(tVFS_Node *Node, enum eVFS_SelectTypes Type, tTime *Timeout, const char *Name);
+/**
+ * \brief Change the full flag on a node
+ */
extern int VFS_MarkFull(tVFS_Node *Node, BOOL IsBufferFull);
extern int VFS_MarkAvaliable(tVFS_Node *Node, BOOL IsDataAvaliable);
extern int VFS_MarkError(tVFS_Node *Node, BOOL IsErrorState);
// === GLOBALS ===
// === FUNCTIONS ===
-int VFS_SelectNode(tVFS_Node *Node, enum eVFS_SelectTypes Type, tTime *Timeout)
+int VFS_SelectNode(tVFS_Node *Node, enum eVFS_SelectTypes Type, tTime *Timeout, const char *Name)
{
tVFS_SelectThread *thread_info;
tVFS_SelectList **list;
thread_info = malloc(sizeof(tVFS_SelectThread));
if(!thread_info) return -1;
- Semaphore_Init(&thread_info->SleepHandle, 0, 0, "VFS_SelectNode()", "");
+ Semaphore_Init(&thread_info->SleepHandle, 0, 0, "VFS_SelectNode()", Name);
LOG("list=%p, flag=%p, wanted=%i, maxAllowed=%i", list, flag, wanted, maxAllowed);
thread_info = malloc(sizeof(tVFS_SelectThread));
if(!thread_info) return -1;
- Semaphore_Init(&thread_info->SleepHandle, 0, -1, "VFS_Select()", "");
+ ENTER("iMaxHandle pReadHandles pWriteHandles pErrHandles pTimeout bIsKernel",
+ MaxHandle, ReadHandles, WriteHandles, ErrHandles, Timeout, IsKernel);
- // Notes: The idea is to make sure we onlt enter wait (on the semaphore)
+ Semaphore_Init(&thread_info->SleepHandle, 0, 0, "VFS_Select()", "");
+
+ // Notes: The idea is to make sure we only enter wait (on the semaphore)
// if we are going to be woken up (either by an event at a later time,
// or by an event that happened while or before we were registering).
// Hence, register must happen _before_ we check the state flag
ret += VFS_int_Select_Register(thread_info, MaxHandle, WriteHandles, 1, IsKernel);
ret += VFS_int_Select_Register(thread_info, MaxHandle, ErrHandles, 2, IsKernel);
+ LOG("Register ret = %i", ret);
+
// If there were events waiting, de-register and return
if( ret )
{
ret += VFS_int_Select_Deregister(thread_info, MaxHandle, WriteHandles, 1, IsKernel);
ret += VFS_int_Select_Deregister(thread_info, MaxHandle, ErrHandles, 2, IsKernel);
free(thread_info);
+ LEAVE('i', ret);
return ret;
}
ret += VFS_int_Select_Deregister(thread_info, MaxHandle, WriteHandles, 1, IsKernel);
ret += VFS_int_Select_Deregister(thread_info, MaxHandle, ErrHandles, 2, IsKernel);
free(thread_info);
+ LEAVE('i', ret);
return ret;
}
// Is the descriptor set
if( !FD_ISSET(i, Handles) ) continue;
+ LOG("FD #%i", i);
handle = VFS_GetHandle( i | (IsKernel?VFS_KERNEL_FLAG:0) );
// Is the handle valid?
// Is the descriptor set
if( !FD_ISSET(i, Handles) ) continue;
+ LOG("FD #%i", i);
handle = VFS_GetHandle( i | (IsKernel?VFS_KERNEL_FLAG:0) );
// Is the handle valid?