Date: Fri May  3 16:34:34 1996

Algorithmus
-----------
Connections nach und nach berechnen. Dabei verkettete Liste (mit
1er-Containern) aufbauen. Sobald Anzahl Elemente die Anzahl Plaetze in
einem n-Container erreicht, umkopieren in einen n-Container. Am
Schluss bleiben evtl. noch ein paar 1er-Container uebrig, die einfach
mit den n-Containern verkettet werden. Im Anker zur ganzen
Container-Liste wird die entsprechende Anzahl mitgezaehlt.


z.B. n=5:

Anker:
+------------------+    +--------------+   +--------------+   +--+   +--+   +--+
| 5er-Container: 2 |--->|a1|a2|a3|a4|a5|-->|a6|a7|a8|a9|aa|-->|ab|-->|ac|-->|ad|
| 1er-Container: 3 |    +--------------+   +--------------+   +--+   +--+   +--+
+------------------+

Allokierungsstrategie:
----------------------

Auf jedem PE wird eine Freiliste von n-Containern und 1er-Containern
gehalten.

Fall A: gebraucht wird ein 1er-Container:

Jedes PE schaut, ob in seiner 1er-Freiliste noch ein 1er-Container
frei ist. Wenn ja, nimmt es diesen. Wenn irgendein PE keinen freien
1er-Container mehr hat, wird auf allen PEs ein 1er-Container mehr
alloziert und die Anzahl freier 1er-Container entsprechend um 1
erhoeht.

Hat eine Connection auf einem der PEs n Ziel-PEs erreicht, dann wird
die 1er-Liste in einen n-Container umkopiert und die n 1er-Container
werden wieder in die 1er-Freiliste gehaengt und die Anzahl freier
1er-Container um n erhoeht. Fuer die Allozierung des n-Containers
siehe Fall B.

Fall B: gebraucht wird ein n-Container:

Wie beim 1er-Container auch scaut jedes PE, ob in seiner n-Freiliste
noch ein n-Container frei ist. Wenn ja, nimmt es diesen. Wenn
irgendein PE keinen freien n-Container mehr hat, wird auf allen PEs
ein n-Container mehr alloziert und die Anzahl freier n-Container
entsprechend um 1 erhoeht.


OpenNewConnection(CONNECTION *c);

AddEntryToConnection(CONNECTION *c,      /* Zeiger auf Connection, zu
					    der das Ziel-PE hinzu soll*/
		     VPE_POS target,     /* Nummer des Ziel-PEs */
		     CARDINAL PElayer);  /* Ebene von akt. PE, auf der
					    das Ziel eingetragen werden soll*/

CloseConnection(CONNECTION *c);


#define CONTAINERSIZE 10		/* N */

typedef struct CONTAINER_1 {		/* container for 1 target PE */
   VPE_POS pe;
   struct CONTAINER_1 *next;
} CONTAINER_1;

typedef struct CONTAINER_N {		/* container for N target PEs */
   VPE_POS pe[CONTAINERSIZE];
   struct CONTAINER_N *next;
} CONTAINER_N;

typedef struct {			/* Info about 1-container list */
  int num;				/* number of entries in list */
  struct CONTAINER_1 *list;		/* pointer to list */
} CONTAINER_1_INFO;

typedef struct {			/* Info about N-container list */
  int num;				/* number of entries in list */
  struct CONTAINER_N *list;		/* pointer to list */
} CONTAINER_N_INFO;

typedef struct {
     char *name;			  /* name of this connection */
     CONFIGURATION *target;		  /* pointer to target config */
evtl.CONFIGURATION *source;		  /* pointer to source config */
     CONTAINER_1_INFO *single;            /* array[PElayers], malloc*/
     CONTAINER_N_INFO *multiple;	  /* array[PElayers], malloc*/ 
} CONNECTION;

typedef struct {
     CONTAINER_1_INFO single;		  /* list of free 1-containers */
     CONTAINER_N_INFO multiple;		  /* list of free N-containers */
} FREELIST;





