typedef struct {
int Mode; //!< Current Mode (see ::eTplTerminal_Modes)
int Flags; //!< Flags (see VT_FLAG_*)
-
short NewWidth; //!< Un-applied dimensions (Width)
short NewHeight; //!< Un-applied dimensions (Height)
int WritePos; //!< Write Buffer Offset (Text Only)
Uint32 CurColour; //!< Current Text Colour
+ tMutex ReadingLock; //!< Lock the VTerm when a process is reading from it
+ tTID ReadingThread; //!< Owner of the lock
int InputRead; //!< Input buffer read position
int InputWrite; //!< Input buffer write position
char InputBuffer[MAX_INPUT_CHARS8];
int pos = 0;
tVTerm *term = &gVT_Terminals[ Node->Inode ];
+ Mutex_Acquire( &term->ReadingLock );
+ term->ReadingThread = Threads_GetTID();
+
// Check current mode
switch(term->Mode)
{
case TERM_MODE_TEXT:
while(pos < Length)
{
- while(term->InputRead == term->InputWrite) Threads_Yield();
+ //TODO: Sleep instead
+ while(term->InputRead == term->InputWrite) Threads_Sleep();
((char*)Buffer)[pos] = term->InputBuffer[term->InputRead];
pos ++;
default:
while(pos < Length)
{
- while(term->InputRead == term->InputWrite) Threads_Yield();
+ while(term->InputRead == term->InputWrite) Threads_Sleep();
((Uint32*)Buffer)[pos] = ((Uint32*)term->InputBuffer)[term->InputRead];
pos ++;
term->InputRead ++;
}
break;
}
+
+ term->ReadingThread = -1;
+ Mutex_Release( &term->ReadingLock );
+
return 0;
}
term->InputRead %= MAX_INPUT_CHARS32;
}
}
+
+ // Wake up the thread waiting on us
+ if( term->ReadingThread >= 0 ) {
+ Threads_WakeTID(term->ReadingThread);
+ }
}
/**
} while(c == ';');
}
- /*
- // Get string (what does this do?)
- if(c == '"') {
- c = Buffer[j++];
- while(c != '"')
- c = Buffer[j++];
- }
- */
-
- //Log_Debug("VTerm", "argc = %i", argc);
-
// Get Command
if( ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'))
{