aboutsummaryrefslogtreecommitdiff
path: root/libchill/waitbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'libchill/waitbuffer.c')
-rw-r--r--libchill/waitbuffer.c306
1 files changed, 0 insertions, 306 deletions
diff --git a/libchill/waitbuffer.c b/libchill/waitbuffer.c
deleted file mode 100644
index 2d967d93e48..00000000000
--- a/libchill/waitbuffer.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/* Implement tasking-related runtime actions for CHILL.
- Copyright (C) 1992,1993 Free Software Foundation, Inc.
- Author: Wilfried Moser
-
-This file is part of GNU CC.
-
-GNU CC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU CC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-/* As a special exception, if you link this library with other files,
- some of which are compiled with GCC, to produce an executable,
- this library does not by itself cause the resulting executable
- to be covered by the GNU General Public License.
- This exception does not however invalidate any other reasons why
- the executable file might be covered by the GNU General Public License. */
-
-#include <string.h>
-#include "rtltypes.h"
-#include "rts.h"
-
-extern void __cause_ex1 (char *ex, char *file, int lineno);
-
-EXCEPTION (bufferinconsistency)
-#define CAUSE_BUFFINCONS __cause_ex1 ("bufferinconsistency", filename, lineno)
-EXCEPTION (spacefail);
-#define CAUSE_SPACEFAIL __cause_ex1 ("spacefail", filename, lineno)
-
-/*
- * function __wait_buffer
- *
- * parameters:
- * buf_got pointer to location for writing the received buffer address
- * nbuf number of buffers in RECEIVE CASE
- * bufptr array of pointers to buffer descriptor
- * datap pointer where to store data
- * datalen length of data
- * ins pointer to instance location or 0
- * else_clause else specified or not
- * to_loc pointer to timesupervision value
- * filename source file name where function gets called
- * lineno linenumber in source file
- *
- * returns:
- * int 0 .. success
- * 1 .. timed out
- *
- * exceptions:
- * bufferinconsistency if something's wrong in the buffer queue's
- * spacefail out of heap space of datalength of receiver
- * less than data avilable.
- *
- * abstract:
- * implement the CHILL RECEIVE buffer CASE action.
- */
-
-int
-__wait_buffer (buf_got, nbuf, bufptr, datap, datalen, ins,
- else_clause, to, filename, lineno)
- void **buf_got;
- int nbuf;
- Buffer_Descr *bufptr[];
- void *datap;
- int datalen;
- INSTANCE *ins;
- int else_clause;
- void *to;
- char *filename;
- int lineno;
-{
- int i;
- Buffer_Wait_Queue *start_list;
- Buffer_Queue **retval;
- Buffer_Queue **highprio;
- int timed_out;
-
- /* look if there is a buffer already sent */
- highprio = 0;
- for (i = 0; i < nbuf; i++)
- {
- Buffer_Queue *bq;
-
- memcpy (&bq, bufptr[i]->buf, sizeof (Buffer_Queue *));
- if (bq != 0 && bq->sendqueue != 0)
- {
- if (highprio != 0)
- {
- Buffer_Queue *bsq = *highprio;
-
- if (bq->sendqueue->priority > bsq->sendqueue->priority)
- highprio = bufptr[i]->buf;
- }
- else
- highprio = bufptr[i]->buf;
- }
- }
-
- if (highprio != 0)
- {
- Buffer_Queue *bq;
-
- memcpy (&bq, highprio, sizeof (Buffer_Queue *));
- if (bq != 0 && bq->sendqueue != 0)
- {
- Buffer_Send_Queue *bsq = bq->sendqueue;
- Buffer_Send_Queue *tmp;
-
- /* check data length */
- if (datalen < bsq->datalen)
- /* something's totaly wrong. Raise exception */
- CAUSE_SPACEFAIL;
-
- /* copy data out */
- memcpy (datap, bsq->dataptr, bsq->datalen);
-
- /* update instance, if present */
- if (ins != 0)
- memcpy (ins, &bsq->this, sizeof (INSTANCE));
-
- /* dequeue entry */
- tmp = bsq;
- bq->sendqueue = tmp->forward;
-
- if (tmp->is_delayed)
- {
- /* there is an instance delayed on a send,
- continue it. */
- __continue_that (tmp->this, tmp->priority, filename, lineno);
- FREE (tmp);
-
- /* return the buffer we have received from */
- *buf_got = (void *)highprio;
- return 0;
- }
-
- /* just decrease sendqueue length */
- bq->sendqueuelength--;
-
- FREE (tmp);
-
- /* as we got an entry free, we should continue
- an INSTANCE which is delayed on a send at this
- buffer */
- bsq = bq->sendqueue;
- while (bsq != 0)
- {
- if (bsq->is_delayed)
- {
- bq->sendqueuelength++;
- bsq->is_delayed = 0;
- __continue_that (bsq->this, bsq->priority, filename, lineno);
- break;
- }
- bsq = bsq->forward;
- }
- /* return the buffer we have received from */
- *buf_got = (void *)highprio;
- return 0;
- }
- }
-
- /* if we come here, there is no buffer already sent */
- if (else_clause != 0)
- {
- /* in that case we return immediately */
- *buf_got = 0;
- return 0;
- }
-
- /* now we have to queue ourself to the wait queue(s) */
- start_list = 0;
- for (i = 0; i < nbuf; i++)
- {
- Buffer_Queue *bq;
- Buffer_Wait_Queue *wrk;
- Buffer_Wait_Queue *bwq;
- Buffer_Wait_Queue *prev_queue_entry = 0;
- Buffer_Wait_Queue *prev_list_entry;
- int j, have_done = 0;
-
- for (j = 0; j < i; j++)
- {
- if (bufptr[i]->buf == bufptr[j]->buf)
- {
- have_done = 1;
- break;
- }
- }
- if (have_done)
- continue;
-
- memcpy (&bq, bufptr[i]->buf, sizeof (Buffer_Queue *));
- if (bq == 0)
- {
- MALLOC (bq, sizeof (Buffer_Queue));
- memset (bq, 0, sizeof (Buffer_Queue));
- /* *(bufptr[i]->buf) = bq; may be unaligned */
- memcpy (bufptr[i]->buf, &bq, sizeof (Buffer_Queue *));
- }
- MALLOC (wrk, sizeof (Buffer_Wait_Queue));
- memset (wrk, 0, sizeof (Buffer_Wait_Queue));
- bwq = (Buffer_Wait_Queue *)&bq->waitqueue;
-
- wrk->this = THIS;
- wrk->datalen = datalen;
- wrk->dataptr = datap;
- wrk->bufferaddr = bufptr[i]->buf;
-
- /* queue it at the end of buffer wait queue */
- while (bwq->forward != 0)
- bwq = bwq->forward;
- wrk->forward = bwq->forward;
- bwq->forward = wrk;
-
- /* queue it into list */
- wrk->startlist = start_list;
- if (! start_list)
- {
- start_list = wrk;
- prev_list_entry = wrk;
- wrk->startlist = start_list;
- }
- else
- {
- prev_list_entry->chain = wrk;
- prev_list_entry = wrk;
- }
-
- /* increment wait queue count */
- bq->waitqueuelength++;
- }
-
- /* tell runtime system to delay this process */
- timed_out = __delay_this (wait_buffer_receive, to, filename, lineno);
- if (timed_out)
- {
- /* remove all entries from buffer queues */
- Buffer_Wait_Queue *listentry = start_list;
-
- while (listentry != 0)
- {
- Buffer_Queue *bq = *(listentry->bufferaddr);
- Buffer_Wait_Queue *prev_entry = (Buffer_Wait_Queue *)&bq->waitqueue;
- Buffer_Wait_Queue *bwq = bq->waitqueue;
-
- while (bwq != listentry)
- {
- prev_entry = bwq;
- bwq = bwq->forward;
- }
- /* dequeue it */
- prev_entry->forward = bwq->forward;
- bq->waitqueuelength--;
- listentry = listentry->chain;
- }
- }
-
- /* someone has continued us, find which buffer got ready */
- retval = 0;
-
- while (start_list != 0)
- {
- Buffer_Wait_Queue *tmp = start_list->chain;
-
- if (start_list->is_sent)
- {
- /* this one has been sent */
- /* save return value */
- if (retval == 0)
- retval = start_list->bufferaddr;
- else
- /* more than one has been sent, that's wrong */
- CAUSE_BUFFINCONS;
-
- /* update instance, if present */
- if (ins != 0)
- memcpy (ins, &start_list->who_sent, sizeof (INSTANCE));
- }
- FREE (start_list);
- start_list = tmp;
- }
-
- /* now check if there was really a buffer got */
- if (retval == 0 && !timed_out)
- /* something's totally wrong, raise an exception */
- CAUSE_BUFFINCONS;
-
- if (!timed_out)
- *buf_got = (void *)retval;
- return timed_out;
-}
-
-/* force function __print_buffer to be linked */
-extern void __print_buffer ();
-static EntryPoint pev = __print_buffer;