summaryrefslogtreecommitdiff
path: root/term
diff options
context:
space:
mode:
Diffstat (limited to 'term')
-rw-r--r--term/devio.c1
-rw-r--r--term/hurdio.c1
-rw-r--r--term/main.c2
-rw-r--r--term/ptyio.c4
-rw-r--r--term/term.h25
5 files changed, 26 insertions, 7 deletions
diff --git a/term/devio.c b/term/devio.c
index 38eb996c..8aa960b9 100644
--- a/term/devio.c
+++ b/term/devio.c
@@ -323,6 +323,7 @@ device_write_reply_inband (mach_port_t replypt,
{
npending_output = 0;
condition_broadcast (outputq->wait);
+ condition_broadcast (&select_alert);
}
else
{
diff --git a/term/hurdio.c b/term/hurdio.c
index ef34740b..b1d0c944 100644
--- a/term/hurdio.c
+++ b/term/hurdio.c
@@ -286,6 +286,7 @@ hurdio_writer_loop (any_t arg)
{
npending_output = 0;
condition_broadcast (outputq->wait);
+ condition_broadcast (&select_alert);
}
else
{
diff --git a/term/main.c b/term/main.c
index 405e7cd8..e15fee53 100644
--- a/term/main.c
+++ b/term/main.c
@@ -443,8 +443,6 @@ main (int argc, char **argv)
condition_init (&carrier_alert);
condition_init (&select_alert);
- condition_implies (inputq->wait, &select_alert);
- condition_implies (outputq->wait, &select_alert);
/* Launch. */
ports_manage_port_operations_multithread (term_bucket, demuxer, 0, 0, 0);
diff --git a/term/ptyio.c b/term/ptyio.c
index 9c1509ff..b02cda3f 100644
--- a/term/ptyio.c
+++ b/term/ptyio.c
@@ -58,8 +58,7 @@ static int nptyperopens = 0;
static error_t
ptyio_init (void)
{
- condition_implies (inputq->wait, &pty_select_wakeup);
- condition_implies (&pty_read_wakeup, &pty_select_wakeup);
+ pty_select_alert = &pty_select_wakeup;
return 0;
}
@@ -132,6 +131,7 @@ wake_reader ()
{
pty_read_blocked = 0;
condition_broadcast (&pty_read_wakeup);
+ condition_broadcast (&pty_select_wakeup);
}
}
diff --git a/term/term.h b/term/term.h
index 81d0efee..2df20337 100644
--- a/term/term.h
+++ b/term/term.h
@@ -103,6 +103,9 @@ struct condition carrier_alert;
/* Wakeup for select */
struct condition select_alert;
+/* Wakeup for pty select, if not null */
+struct condition *pty_select_alert;
+
/* Bucket for all our ports. */
struct port_bucket *term_bucket;
@@ -225,6 +228,9 @@ clear_queue (struct queue *q)
q->susp = 0;
q->cs = q->ce = q->array;
condition_broadcast (q->wait);
+ condition_broadcast (&select_alert);
+ if (q == inputq && pty_select_alert != NULL)
+ condition_broadcast (pty_select_alert);
}
#endif /* Use extern inlines. */
@@ -249,7 +255,10 @@ dequeue_quote (struct queue *q)
if (beep)
{
condition_broadcast (q->wait);
- if (q == outputq)
+ condition_broadcast (&select_alert);
+ if (q == inputq && pty_select_alert != NULL)
+ condition_broadcast (pty_select_alert);
+ else if (q == outputq)
call_asyncs (O_WRITE);
}
return *q->cs++;
@@ -280,8 +289,13 @@ enqueue_internal (struct queue **qp, quoted_char c)
if (qsize (q) == 1)
{
condition_broadcast (q->wait);
+ condition_broadcast (&select_alert);
if (q == inputq)
- call_asyncs (O_READ);
+ {
+ if (pty_select_alert != NULL)
+ condition_broadcast (pty_select_alert);
+ call_asyncs (O_READ);
+ }
}
if (!q->susp && (qsize (q) > q->hiwat))
@@ -334,7 +348,12 @@ queue_erase (struct queue *q)
if (qsize (q) == 0)
beep = 1;
if (beep)
- condition_broadcast (q->wait);
+ {
+ condition_broadcast (q->wait);
+ condition_broadcast (&select_alert);
+ if (q == inputq && pty_select_alert != NULL)
+ condition_broadcast (pty_select_alert);
+ }
return answer;
}
#endif /* Use extern inlines. */