summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrhp <rhp>2001-06-13 04:58:55 +0000
committerrhp <rhp>2001-06-13 04:58:55 +0000
commitd5914732d203b6905830a5ae500825f7e1fb3b46 (patch)
treed1e2f3c2d038a26e04b11cfd4ffc2f9111064fb6
parente188d3c4f6ed1044899d22266575c00a8409097e (diff)
downloadmetacity-d5914732d203b6905830a5ae500825f7e1fb3b46.tar.gz
...
-rw-r--r--src/uislave/messagequeue.c115
1 files changed, 91 insertions, 24 deletions
diff --git a/src/uislave/messagequeue.c b/src/uislave/messagequeue.c
index da9e69a8..ee20b8c6 100644
--- a/src/uislave/messagequeue.c
+++ b/src/uislave/messagequeue.c
@@ -112,7 +112,7 @@ meta_message_queue_new (int fd,
mq->buf = g_string_new ("");
mq->current_message = g_string_new ("");
mq->current_required_len = 0;
- mq->last_serial = -1;
+ mq->last_serial = 0;
mq->out_poll.fd = fd;
mq->out_poll.events = G_IO_IN;
@@ -207,28 +207,6 @@ append_pending (MetaMessageQueue *mq)
static void
mq_queue_messages (MetaMessageQueue *mq)
{
- if (mq->out_poll.revents & G_IO_IN)
- {
- ReadResult res;
-
- res = read_data (mq->buf, mq->out_poll.fd);
-
- switch (res)
- {
- case READ_OK:
- meta_verbose ("Read data from slave, %d bytes in buffer\n",
- mq->buf->len);
- break;
- case READ_EOF:
- meta_verbose ("EOF reading stdout from slave process\n");
- break;
-
- case READ_FAILED:
- /* read_data printed the error */
- break;
- }
- }
-
while (mq->buf->len > 0)
{
if (mq->current_required_len > 0)
@@ -360,9 +338,12 @@ mq_queue_messages (MetaMessageQueue *mq)
static gboolean
mq_messages_pending (MetaMessageQueue *mq)
{
- return mq->queue->length > 0 ||
+ return mq->queue->length > 0;
+ /* these are useless until we wake up on poll again */
+#if 0
mq->buf->len > 0 ||
mq->current_message->len > 0;
+#endif
}
static gboolean
@@ -379,6 +360,7 @@ mq_prepare (GSource *source, gint *timeout)
return mq_messages_pending (mq);
}
+#include <stdio.h>
static gboolean
mq_check (GSource *source)
{
@@ -387,6 +369,29 @@ mq_check (GSource *source)
mq = (MetaMessageQueue*) source;
mq_queue_messages (mq);
+
+ if (mq->out_poll.revents & G_IO_IN)
+ {
+ ReadResult res;
+
+ res = read_data (mq->buf, mq->out_poll.fd);
+
+ switch (res)
+ {
+ case READ_OK:
+ meta_verbose ("Read data from slave, %d bytes in buffer\n",
+ mq->buf->len);
+ break;
+ case READ_EOF:
+ meta_verbose ("EOF reading stdout from slave process\n");
+ break;
+
+ case READ_FAILED:
+ /* read_data printed the error */
+ break;
+ }
+ }
+
mq->out_poll.revents = 0;
return mq_messages_pending (mq);
@@ -475,3 +480,65 @@ read_data (GString *str,
else
return READ_OK;
}
+
+/* Wait forever and build infinite queue until we get
+ * the desired serial_of_request or one higher than it
+ */
+void
+meta_message_queue_wait_for_reply (MetaMessageQueue *mq,
+ int serial_of_request)
+{
+ ReadResult res;
+ int prev_len;
+
+ prev_len = 0;
+ while (TRUE)
+ {
+ if (prev_len < mq->queue->length)
+ {
+ GList *tmp;
+
+ tmp = g_list_nth (mq->queue->head, prev_len);
+ while (tmp != NULL)
+ {
+ MetaMessage *msg = tmp->data;
+
+ if (msg->header.request_serial == serial_of_request)
+ return;
+
+ if (msg->header.request_serial > serial_of_request)
+ {
+ meta_warning ("Serial request %d is greater than the awaited request %d\n",
+ msg->header.request_serial, serial_of_request);
+ return;
+ }
+
+ tmp = tmp->next;
+ }
+
+ prev_len = mq->queue->length;
+ }
+
+ res = read_data (mq->buf, mq->out_poll.fd);
+
+ switch (res)
+ {
+ case READ_OK:
+ meta_verbose ("Read data from slave, %d bytes in buffer\n",
+ mq->buf->len);
+ break;
+
+ case READ_EOF:
+ meta_verbose ("EOF reading stdout from slave process\n");
+ return;
+ break;
+
+ case READ_FAILED:
+ /* read_data printed the error */
+ return;
+ break;
+ }
+
+ mq_queue_messages (mq);
+ }
+}