Add an NxWM console/keyboard thread and eliminate all issues with NxConsole window serial input

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4755 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-05-20 22:10:34 +00:00
parent 2ee17af708
commit ecc9d07e3d
3 changed files with 22 additions and 4 deletions

View File

@ -2790,3 +2790,11 @@
will receive its input from stdin (/dev/console). This works great but will receive its input from stdin (/dev/console). This works great but
cannot be shared between different windows. Chaos will ensue if you cannot be shared between different windows. Chaos will ensue if you
try to support multiple NxConsole windows without CONFIG_NXCONSOLE_NXKBDIN try to support multiple NxConsole windows without CONFIG_NXCONSOLE_NXKBDIN
* graphics/nxmu/nx_kbdin.c: Fix pointer argument. This is a error
introduced in changes leading up to the 6.18 release. This error will
cause crashes or perhaps simply not work when you try to handle window
keyboard data in multi-user mode.
* graphics/nxconsole/nxcon_kdbind.c: Fixed unmatched sem_wait and sem_post.
Fix some conditional compilation that included a few too many lines of code.

View File

@ -244,7 +244,7 @@ ssize_t nxcon_read(FAR struct file *filep, FAR char *buffer, size_t len)
/* Relinquish the mutual exclusion semaphore */ /* Relinquish the mutual exclusion semaphore */
sem_post(&priv->exclsem); nxcon_sempost(priv);
/* Notify all poll/select waiters that they can write to the FIFO */ /* Notify all poll/select waiters that they can write to the FIFO */
@ -400,6 +400,7 @@ void nxcon_kbdin(NXCONSOLE handle, FAR const uint8_t *buffer, uint8_t buflen)
ssize_t nwritten; ssize_t nwritten;
int nexthead; int nexthead;
char ch; char ch;
int ret;
gvdbg("buflen=%d\n"); gvdbg("buflen=%d\n");
DEBUGASSERT(handle); DEBUGASSERT(handle);
@ -408,6 +409,15 @@ void nxcon_kbdin(NXCONSOLE handle, FAR const uint8_t *buffer, uint8_t buflen)
priv = (FAR struct nxcon_state_s *)handle; priv = (FAR struct nxcon_state_s *)handle;
/* Get exclusive access to the driver structure */
ret = nxcon_semwait(priv);
if (ret < 0)
{
gdbg("ERROR: nxcon_semwait failed\n");
return;
}
/* Loop until all of the bytes have been written. This function may be /* Loop until all of the bytes have been written. This function may be
* called from an interrupt handler! Semaphores cannot be used! * called from an interrupt handler! Semaphores cannot be used!
* *
@ -451,7 +461,6 @@ void nxcon_kbdin(NXCONSOLE handle, FAR const uint8_t *buffer, uint8_t buflen)
/* Was anything written? */ /* Was anything written? */
#ifndef CONFIG_DISABLE_POLL
if (nwritten > 0) if (nwritten > 0)
{ {
int i; int i;
@ -468,10 +477,11 @@ void nxcon_kbdin(NXCONSOLE handle, FAR const uint8_t *buffer, uint8_t buflen)
/* Notify all poll/select waiters that they can write to the FIFO */ /* Notify all poll/select waiters that they can write to the FIFO */
#ifndef CONFIG_DISABLE_POLL
nxcon_pollnotify(priv, POLLIN); nxcon_pollnotify(priv, POLLIN);
#endif
sched_unlock(); sched_unlock();
} }
#endif
nxcon_sempost(priv); nxcon_sempost(priv);
} }

View File

@ -113,7 +113,7 @@ int nx_kbdin(NXHANDLE handle, uint8_t nch, FAR const uint8_t *ch)
outmsg->ch[i] = ch[i]; outmsg->ch[i] = ch[i];
} }
ret = nxmu_sendserver(conn, &outmsg, size); ret = nxmu_sendserver(conn, outmsg, size);
free(outmsg); free(outmsg);
return ret; return ret;