|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 49408 (0xc100) Types: TextFile Names: »D114«
└─⟦2520239fd⟧ Bits:30005867/disk13.imd Dokumenter (RCSL m.m.) └─⟦this⟧ »D114«
i T_A_B_L_E_ _O_F_ _C_O_N_T_E_N_T_S_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _P_A_G_E_ 1. INTRODUCTION ........................................... 1 1.1 Terminology ....................................... 1 2. PROCESS OVERVIEW ....................................... 9 2.1 Normal Operation .................................. 9 2.2 Initialisation (Open) and Termination (Close) of an HPLC ........................................ 11 2.2.1 Initialisation ............................. 11 2.2.2 Termination ................................ 12 2.2.2.1 Termination Code .................. 13 3. IMPLEMENTATION DETAILS ................................. 15 3.1 Access to the Port Process: The Hook .............. 15 3.2 Time-Out Protection ............................... 16 3.3 Local Control Probe ............................... 21 3.4 Testoutput ........................................ 21 4. STORE REQUIREMENTS ..................................... 22 4.1 Program ........................................... 22 4.2 Stack (Variables Except Pools) .................... 23 4.3 Pools (Message Store) ............................. 25 4.4 Total Store Requirments ........................... 25 A_P_P_E_N_D_I_X_: A. REFERENCES ............................................. 27 \f ii \f 1_._ _ _ _ _ _ _ _ _I_N_T_R_O_D_U_C_T_I_O_N_ 1. In the Centernet Terminal Concentrator (TC) the Host Port Module (HPM) is the part of the Host Interface (HI) that implements the Host Port Protocol (HPP) (ref. 1). The purpose of the HPP is to mulitplex a number of individual, bidirectional dataflows on one Channel Link (CL) between the TC and the Host, in which the Network Port Module (NPM) does a job similar to the one of the HPM (ref. 6, 9). Towards the RC8000 the Front Process Adaptor (FPA) may constitute the CL when applying the FPA Data Link Control protocol (FDLC) (Ref. 3, 4). In so far as the handlers are compatible, a High-Level Data Link Control channel (HDLC) might alternatively be used (ref. 5). This manual describes the function and internal structure of the HPM. The implementation is done in RC3502 Real Time Pascal (ref. 7, 8). The interface towards the user, the so-called Subscriber (SB) is defined in ref. 2. 1_._1_ _ _ _ _ _ _ _T_e_r_m_i_n_o_l_o_g_y_ 1.1 The following lists the terminology and abbreviations used in this manual. ACK Acknowledge. In HPP acknowledge is carried out by returning a block with YR-REF equal to MY-REF of the last processed incoming block. ACK may be gi- ven together with an LT or in a separate block; in the latter case it may carry a Mode. CL Channel Link. The data link layer supporting the HPP. CL provides a reliable, bidirectional data- path, performing the necessary flow control and retransmission. \f CN Centernet. The network project of which the HI/NI is a part. CR Credit. Before an LT can be sent according to the HPP, CR must be established from the receiving party. This assures that the necessary resources (buffers) are at hand when the LT actually arrives. FDLC FPA Data Link Control. A CL implemented on the RC8000 Front Process Adaptor. HDLC High-level Data Link Control. Another acceptable CL. HI Host Interface. The part of the CN software lo- cated in the TC taking care of the communication towards the Host computer. HIA Host Interface Address. Port address identifying the PT at the TC end. HIM Host Interface Mapper. The SB of the HPM. Con- stitutes the link between the HPM and the SC mapping an HIA into an SC Port Address. Host Independent computer hosting the applications of the CN and having access to the network through a TC. HPLC Host Port Logical Channel. One of more logical connections between SBs on each side of the HI/NI multiplexed on the same physical CL. HPM Host Port Module. The subpart (actually a Real Time Pascal child process) of the HI doing the interpretation of the HPP on the network side. \f HPP Host Port Protocol. Protocol multiplexing a num- ber of individual, bidirectional dataflows on one CL. Employed between the CN Host and the network, represented by the TC. LCP Local Control Probe. The part of the TC modules (e.g. the HPM) which answers network control requests and events as monitored by the NCC. LT Letter. A block carrying information sent through an HPLC. Mode User defined value, passed along with an LT or an ACK. The latter in cases where the ACK signals a CR (R-bit is 0). MY-REF My Reference. Sequence number labelling outgoing LTs. NCC Network Control Center. CN application monitoring the network. Initiator of LCP requests and ulti- mate receiver and LCP events via the NCP. NCP Network Control Probe. TC module connected to the NCC whose messages are routed to the LCPs. NI Network Interface. The part of the CN software located in the Host taking care of the communi- cation towards the TC. NIA Network Interface Address. Port address identify- ing the PT at the Host end. NPM Network Port Module. The subpart of the NI doing the interpretation of the HPP on the Host side. Opposite Party In connection with the HPM (i.e. throughout this manual): The NPM or the NPM Subscriber or both. \f PT Port. The endpoint of an HPLC. R-bit Immediate acknowledge Request. Field of every LT saying if the protocol handler (HPM/NPM) should immediately produce an ACK (R = 1) or rather postpone it until receiver CR is again available (R = 0). In the latter case it is the responsibi- lity of the SB to produce the necessary resources for a CR and hence the ACK. SB Subscriber. The module, process or any other suitable unit being the user of the HPM/NPM. The HPM SB is the HIM. The NPM SB are the CN appli- cations of the particular Host. SC Session Control. TC module performing session establishment, monitoring and removal and address management of the network. TC Terminal Concentrator. Computer hosting several modules implementing the CN, e.g. the HI. The TC represents the network towards the Host. YR-REF Your Reference. Sequence number of an LT hereby acknowledged. All earlier blocks are hereby acknowledged as well. \f F_ \f F_ The communication paths of fig. 1 are implemented by the declarations: p_r_o_c_e_s_s_ HPM (v_a_r_ request, channel _link (*..*): semaphore; (*..*)); t_y_p_e_ PT = r_e_c_o_r_d_ sem (*..*): semaphore; shad: shadow e_n_d_; HIA = 0..no _of _PTs; portsempoint = a_r_r_a_y_ (HIA) o_f_ r_e_c_o_r_d_ sem _ (*..*): @semaphore e_n_d_; v_a_r_ port: a_r_r_a_y_ (HIA) o_f_ PT; accessparam: portsempoint; terminator: semaphore; answerers: shadow; (*..*) p_r_o_c_e_s_s_ PT _pros (v_a_r_ request, parent, channel _link (*..*): semaphore; (*..*)); v_a_r_ queuein: r_e_c_o_r_d_ fifo: sempahore; (*..*) e_n_d_; (*..*) b_e_g_i_n_ (*..*) e_n_d_; \f p_r_o_c_e_s_s_ answerer (v_a_r_ channel _link, parent (*..*): semaphore; port: portsempoint); v_a_r_ answer: semaphore; (*..*) b_e_g_i_n_ (*..*) e_n_d_; p_r_o_c_e_d_u_r_e_ initialise; b_e_g_i_n_ f_o_r_ i: = 0 t_o_ no _of _PTs d_o_ w_i_t_h_ accessparam(i), port(i) d_o_ b_e_g_i_n_ sem _: = ref (sem); (*..*) e_n_d_; z: = create ('Host _PT _answ', answerer (channel _link, request, accessparam (*..*)), answerers, anstore); (*..*) e_n_d_; f_u_n_c_t_i_o_n_ alloc _PT (v_a_r_ i: HIA; (*..*)): boolean; b_e_g_i_n_ (*..*); i: = (*..*); w_i_t_h_ port(i) d_o_ c_a_s_e_ create (*..*), PT _pros (sem, request, channel _link (*..*)), shad, store) o_f_ 0: alloc _PT: = true; (*..*) e_n_d_; (*..*) e_n_d_; \f p_r_o_c_e_d_u_r_e_ server; b_e_g_i_n_ (*..*) e_n_d_; b_e_g_i_n_ initialise; server e_n_d_. \f F_ 2_._ _ _ _ _ _ _ _ _P_R_O_C_E_S_S_ _O_V_E_R_V_I_E_W_ 2. 2_._1_ _ _ _ _ _ _ _N_o_r_m_a_l_ _O_p_e_r_a_t_i_o_n_ 2.1 The HPM process is subdivided into three cooperating processes, the server, the answerer and the port process, with the following duties. The server is in fact no process in its own right but merely a procedure called from the main process. The working cycle awaits messages on the request semaphore, interprets and serves them. The server does all the communication with the subscribers (SB) and the NCP (see 3.3) and is moreover responsible of allocating and disposing ports. The answerer communicates towards the channel link. All input messages originate from and return to the answerer, from where it is rerouted to the proper port process, see below. The answerer also keeps track of the state of the channel link handler, e.g. by taking action when the line breaks. For every HPLC initialised, the server creates and starts an incarnation of the port process. Subsequently all messages for that port is routed to the proper process by the server (from the SB) or the answerer (from the opposite party). Thus it can be seen that the main responsibility for the normal operation of an HPLC during its lifetime rests with the actual port process incarnation. In the following description of the port process, the name of the procedure in the program is mentioned in paranthesis at the end of each paragraph. When data is sent from the SB, it is queued into a time-out pro- tected queue in the port process, queue _out, see section 3.2. From there it is transmitted to the opposite party through the channel link when the necessary sender credit is present (sender _CR). A message header allocated within the port process incarnation in question, a tag, is pushed upon the SB message to\f make it return to the right place. A sequence number, outgoing.MY _REF, is put into a header supplied by the SB and carried on with the data message. MY _REF is counted up 1 modulo 256 (out _LT). When the "empty" buffer returns from the channel link handler, it enters another time-out protected queue, queue _in; the tag is released. The message pends here until it is acknowledged by the opposite party. Acknowledge may principally be carried by any incoming block, i.e. any messages passed from the answerer. By this action the variables incoming.YR _REF and incoming.CR are updated. Messages awaiting acknowledge are returned to the SB carrying a possible mode given by the acknowledge (adjust _flowvalues). When data is to be received by the SB, a suitable data message must be signalled as buffer beforehand; this will constitute the receiver credit. Here it is important to distinquish between cases where the opposite party requests immediate acknowledge or not, given by a bit in the operation code from there (R=1 or 0, respectively). If the acknowledge was done immediately, nothing is done now except to increase the variable outgoing.CR; it may be reported to the opposite party (report) whenever appropriate. The message itself pends at the semaphore rec _CR _buf. Otherwise, if this message signals an acknowledge of earlier received data, the variable outgoing.YR _REF must be increased now (by 1 modulo 256). It must furthermore be reported instantly, as the message will carry a mode to go with the acknowledge. If resources in- termediately lack for the report, the message pends at the sema- phore not _CRed until it can be passed to the rec _CR _buf as above (incredit). When the data actually arrives through the channel link, the variable incoming.MY _REF is updated. If immediate acknowledge is requested, it is furthermore copied into outgoing.YR _REF and outgoing.CR is decreased (decredit). A buffer is fetched from rec _CR _buf and the data is copied (copy). The incoming data message is resignalled to the channel link handler and the SB message is returned (in _LT). \f 2_._2_ _ _ _ _ _ _ _I_n_i_t_i_a_l_i_s_a_t_i_o_n_ _(_O_p_e_n_)_ _a_n_d_ _T_e_r_m_i_n_a_t_i_o_n_ _(_C_l_o_s_e_)_ _o_f_ _a_n_ _H_P_L_C_ 2.2 This section contains a verbal explanation of the details of the initialisation and termination of an HPLC, what is known to the SBs as the opening and closing of a pair of ports. At the end of each paragraph the name of the procedure in the program is mentioned in parenthesis. 2_._2_._1_ _ _ _ _ _I_n_i_t_i_a_l_i_s_a_t_i_o_n_ 2.2.1 An Await Open message is submitted from the SB. It should be assured that this always proceds the initiative from the opposite party, as the initialisation otherwise will not succeed. This may be done by signalling a suitable number of messages before start of the HPM. The message is queued by the server. When a block with the operation code of an initialisation is received from the channel link, it is recognised by the answerer and routed to the server. The server now pairs the initialisation block (which was caused by an open primitive at the opposite party) with an await open message, if present, copying the contents from the former to the latter and sends the two messages to the channel link handler and back to the SB, respectively. If an Await Open message was not present in the queue, a special semaphore, the terminator, contains a suitable message to transmit a termination block to the opposite party (send _TERM). Otherwise a port process is created and started (send _INIT). The port is not yet fully allocated, as it has not been accepted by the local SB. It is in the accepting state. The port process starts a timer, and if it runs out it will transmit a termination block and deallocate itself as explained in the following subsec- tion. If the opening is rejected, the same thing happens. In the meantime only Supply and Await Initial Credit messages will be accepted, see ref. 1 or 2 (initialise). \f The Await Open message returned to the SB contains the new port address or Host Interface Address, HIA, being used in subsequent messages to the HPM. It will therefore be appropriate for the SB to reuse the message, altering the function code to Accept Open. When it is received by the server it is passed to the port pro- cess if it is in the accepting state as explained in section 3.1, and at the same time the state is altered to present (pass). At the port process, the message is tagged and used to transmit an initialisation block to the channel link. From there it will return to a semaphore again called the terminator, because this is what it will be used for next time. Now please continue with the following subsection. 2_._2_._2_ _ _ _ _ _T_e_r_m_i_n_a_t_i_o_n_ 2.2.2 The termination procedure propagates in the opposite direction, as it is conceived by the port process. The message from the SB, signalling an Accept Open, is fetched and used as a means for transmitting a termination block to the channel link (send _TERM). When a termination block is received from the opposite party (whether this happens before or after a block has been sent from here), the state is changed to absent, which will stop the signalling of messages for this port process. Then the returning of the message transmitting the outgoing ter- mination block is awaited from the CL handler; the message will return as the last of the outstanding transmit messages (termin- ate). When the close function is ready to be served, it is time to clean up and leave the port process. All queues are emptied (clean _up). As a "last word" the Close message is signalled to the parent, i.e. the server. Note that this will not happen before the PT has been closed and confirmed, i.e. accepted or rejected. This is to cope with the situation where an opening time-out (2.2.1) occurs prior to an SB confirmation. As long as the Accept/Reject Open\f message still rests with the SB it would be dangerous to dispose of and hence possibly realoccate the port address, see below. At the server, the close message will cause the port process to be removed. The port address may now be reused. The close message is returned to the SB, signalling the closing of the port (dispose _PT). 2_._2_._2_._1_ _ _ _T_e_r_m_i_n_a_t_i_o_n_ _C_o_d_e_ 2.2.2.1 These codes are used to label a termination block when sent through an HPLC, see ref. 1. Internally, the termination codes received from the opposite party are used to distinguish diffe- rent causes of termination. They are: 0: REQUEST: Normal case. The HPLC was requested closed by the opposite party. 1: ACCEPT: Error. The HPLC was accepted closed by the opposite party on request from the HPM. This will only occur on error conditions. 2: NO-INIT: Should not occur. The opening of an HPLC is hereby rejected. The initiative for opening, however, solely rests with the host. 3: ERROR: Error. The error is recognized by the opposite party. For internal use is added 4: CL-error: Error. The channel link is disconnected or reset from the other end. All ports are requested closed by the answerer, generating this code. 5: simulated: Error. If an accept is not given by the opposite party a time-out will generate this code. Same explanation as for accept applies. \f 6: aborted: Lack of resources. If the accept from the local SB times out, the opening never completes. This code is generated when the port process closes itself. \f F_ 3_._ _ _ _ _ _ _ _ _I_M_P_L_E_M_E_N_T_A_T_I_O_N_ _D_E_T_A_I_L_S_ 3. 3_._1_ _ _ _ _ _ _ _A_c_c_e_s_s_ _t_o_ _t_h_e_ _P_o_r_t_ _P_r_o_c_e_s_s_:_ _T_h_e_ _H_o_o_k_ 3.1 In order to communicate a port process, the state of the port in question must be recognised. As this state may simultaneously be read and altered be the server, the answerer or the port process, mutual exclusion is implemented by means of a so-called hook. The hook mechanism resembles a locked room in which someone is either absent or present. To access the room, a key must be fetched from a hook, known to all parties. After access the key is replaced on the hook. Thus we refine the declaration of chapter 2. t_y_p_e_ PT = r_e_c_o_r_d_ sem, hook: semaphore; shad: shadow e_n_d_ Initially a message is signalled to each hook. The u1 user field represents the state, which is extended with the one 'accepting', meaning that the port has been requested by the opposite party but not yet accepted by the local subscriber. The message is equipped with a data part in which statistics for Network Control purposes are stored, see section 3.3. Now the access control may be programmed as follows: p_r_o_c_e_d_u_r_e_ pass (v_a_r_ ref: reference; accessible: s_e_t_ o_f_ present..absent); v_a_r_ key: reference; b_e_g_i_n_ ref@.u2:= no _answer; l_o_c_k_ ref a_s_ h: HPP _format d_o_ i:= h.SOURC; w_i_t_h_ port(i) d_o_ b_e_g_i_n_ wait (key, hook); i_f_ key@.u1 i_n_ accessible t_h_e_n_ signal (ref, sem) \f e_l_s_e_ result (ref, not _open); signal (key, hook) e_n_d_ e_n_d_ (*pass*); 3_._2_ _ _ _ _ _ _ _T_i_m_e_-_O_u_t_ _P_r_o_t_e_c_t_i_o_n_ 3.2 In the HPM time-out will occur at 4 different occasions if events from the surroundings do not happen. They are Local subscriber does not accept initialisation, Opposite party does not submit the necessary credit, Opposite party does not acknowledge letters properly or Opposite party does not accept termination. Figure 2: Time-outs. \f In Real Time Pascal the mechanism for time supervision of a process consists of a process, Timer, which is able to return a message after a given interval of time. The mechanism suffers from a resource problem, because one message must be allocated for each running supervision. Furthermore a message cannot be called back, so you must also keep track on returning messages which no longer have any relevance. It is important that resources are always present (that the pool of messages for the timer does not empty), if the same process incarnation does the jobs of allocating and releasing the mes- sages. Otherwise a deadlock may occur (or you must administer that it does not occur). The solution presented here is based on only one message being sent, which returns relatively soon (after 1 scaleunit, e.g. 1s). Every time the message is returned, it is immediately resent. As seen, it does require that the process resonably often examines the semaphore that is supervised (compared to the scaleunit and the desired accuracy), i.e. the process should not contain other effective waiting points. Messages from the timer must be counted when returning. This is simple if only one supervision pends at a time. But otherwise a resource must be allocated for each. A resource is in this case, however, just a counter, which is only necessary until time-out or the happening of the event, and which can furhtermore be demanded supplied from outside. In our cases of time-outs, they are represented by references to databuffers. These references must be stored somewhere together with the associated counters namely the u2 message user field. The method applies the procedures wait _T, init _T, adjust _T, set _T, clear _T, the function adjustment _T, two variables t and s and a message pool. \f The conditions of operations are - The supervisions must not decrease in period. - The supervisions must be removed from the system in the same sequence as they arrive. This conditions the use of the justi- fication mechanism adjust _T, adjustment _T and the variable s. The procedures are used as follows. We declare t_y_p_e_ timer = r_e_c_o_r_d_ sem: @semaphore; p: p_o_o_l_ 1; per: real; t, s: integer e_n_d_; v_a_r_ t: timer; and call init _T (t, sem, unit) The semaphore sem may now be supervised with a scaleunit given by the last parameter. A supervision is initiated by calling set _T (t, duration) where the duration is given in scaleunits. If already one supervision pends, another should not be initiated. Instead the pending one must be adjusted when it is finished. For that use a justification value must be stored: M_M_m_m_ a : = adjustment _T (t, duration) P_P_ i p_p_ \f Messages are received on sem by the call wait _T (ref, t) If time-out occurred ref would be nil. When the time-out occurs or the supervised event happens as planned, the supervision is adjusted. If more supervisions are running M_M_m_m_ adjust (t, a , time-out) P_P_ i p_p_ M_M_m_m_ is called, where a represents the new supervision. The last P_P_ i p_p_ return parameter shows whether the next time-out is immediately at hand, i.e. simultaneous with the previous. If no more supervisions are initiated clear _T (t) is called instead. As mentioned, each supervision is given by a reference to a message, and we therefore chain these references and the M_M_m_m_ associated a in a queue: P_P_ i p_p_ t_y_p_e_ queue = r_e_c_o_r_d_ fifo: semaphore; front: reference; dur: integer; t: timer e_n_d_; \f p_r_o_c_e_d_u_r_e_ arrive (v_a_r_ ref: reference (*<> nil*); v_a_r_ q: queue); (*Queue message and start or prepare timer*) b_e_g_i_n_ w_i_t_h_ q d_o_ i_f_ nil (front) (*q is empty*) t_h_e_n_ b_e_g_i_n_ front:=:ref; set _T (t, dur) e_n_d_ e_l_s_e_ b_e_g_i_n_ ref@.u2:= adjustment _T (t, dur); signal (ref, fifo) e_n_d_ e_n_d_ (*arrive*); p_r_o_c_e_d_u_r_e_ depart (v_a_r_ ref: reference (* = nil*); v_a_r_ q: queue; v_a_r_ time _out: boolean); (*Take message in front of queue, if any, and report if time is out for the following message*) b_e_g_i_n_ w_i_t_h_ q d_o_ b_e_g_i_n_ ref:=:front; i_f_ n_o_t_ passive (fifo) (*More than 1 message in q*) t_h_e_n_ b_e_g_i_n_ sensesem (front, fifo); adjust _T (t, front@.u2, time _out) e_n_d_ e_l_s_e_ b_e_g_i_n_ clear _T (t) time _out:= false e_n_d_ e_n_d_ e_n_d_ (*depart*) \f The point of using u2 is obviously that the user (the owner of ref) supplies a sufficient amount of variables so that a resource allocation problem is avoided. 3_._3_ _ _ _ _ _ _ _L_o_c_a_l_ _C_o_n_t_r_o_l_ _P_r_o_b_e_ 3.3 Within the HPM a so-called Local Control Probe, LCP, is imple- mented, reporting various events happening in the HPM and answer- ing commands from the network control. The mechanism in the communication with the Network Control Probe is explained in ref. 11; the communication takes place through the semaphore pointer NCP, given as a parameter. The identifica- tion of the LCP is also given as a parameter. The events and requests which will be answered by the LCP are listed in ref. 10. 3_._4_ _ _ _ _ _ _ _T_e_s_t_o_u_t_p_u_t_ 3.4 Apart from the communication with the Network Control mentioned in section 3.3, the HPM regularly, and primarily at error con- ditions, sends messages to the operator semaphore, given as a parameter, suited for display on the debug console. The parameter is meant to be the system operator semaphore so as to cause the output to be displayed on the debug console, but any dummy process simulating the operator will make the HPM work. If the messages are not removed from the semaphore and returned properly, the HPM may run out of buffers and hence stop. Ref. 2 lists and explains the possible texts. \f F_ 4_._ _ _ _ _ _ _ _ _S_T_O_R_E_ _R_E_Q_U_I_R_E_M_E_N_T_S_ 4. The following section lists the necessary store requirements for the HPM. The reader is warned that the numerical values are subject to changes as new versions of the program, compiler or allocator algorithm emerge. The store requirement may be subdivided into two: the static re- quirement and the dynamic. By static is meant store requirements, which are determined at compile time or at least at load time. Dynamic requirements are those postponed to the creation time of the incarnations or run time. Orthogonally, three different kinds of store exist: the program store, the stack and pools. The program store is statically allocated and is the same for all incarnations of the process in question. The stack requirement for each process is static if the program does not declare variables of dynamic type, i.e. types in whose definition a variable occurs. The HPM has no variables of dynamic type. The number of incarnations of each process is, however, determined at creation time, and the total stack requirement therefore becomes dynamic. The pool requirements follow the stack requirements in that they must inevitably be static for each process. Pools are allocated at runtime, i.e. initiating a new incarnation. 4_._1_ _ _ _ _ _ _ _P_r_o_g_r_a_m_ 4.1 The total program space comprises 11 314 bytes of store. \f 4_._2_ _ _ _ _ _ _ _S_t_a_c_k_ _(_V_a_r_i_a_b_l_e_s_ _E_x_c_e_p_t_ _P_o_o_l_s_)_ 4.2 An important number determining the static stack requirements for each process is the maximum number of ports for which the HPM is prepared, given by the constant no _of _PTs. The size of each variable needed for a port is listed below as given in ref. 8. The dynamic requirements are determined by the actual number of opened ports, N, which may be smaller than no _of _PTs. If so, the space not used may be utilised for something else. The actual number of ports may be further limited by the Network Control, see section 3.3. and ref. 10. The stack also gives room for temporary variables not explicitly declared in the program text. This space is dependent on the dynamic procedure call structure, and therefore the most "hungry" nested chain of procedure calls is listed below for each process. The numbers given may be found as the "appetite" of the pass 5 summary from the Real Time Pascal compiler. PT _pros: words _ _ _exit _ _ _rc 36 exception 21 testout 115 send _TERM 21 terminate 23 initialise 29 PT _pros, main program 1_9_2_ 437 or approx. 500 words. answerer: The process contains the declaration: Store requirement per PT: port: portsempoint t_y_p_e_ HIA = 0..no _of _PTs-1; portsempoint = a_r_r_a_y_ (HIA) o_f_ r_e_c_o_r_d_ sem _, hook _: @semaphore 4_ _+_ _4_ _b_y_t_e_s_ end 8 bytes = 4 words \f words _ _ _exit _ _ _rc 36 exception 21 testout 115 initialise 27 M_M_m_m_ answerer, main program 109 + no _of _PTs * 4 P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 308 + no _of _PTs * 4 or approx. 350 + no _of _PTs * 4 words. HPM: The process contains the declaration: Store requirement per PT: port: a_r_r_a_y_ (HIA) o_f_ PT; free _PT: a_r_r_a_y_ (HIA) o_f_ HIA; 1 accessparam: portsempoint 8 (see above) t_y_p_e_ PT = r_e_c_o_r_d_ sem, hook: semaphore; 8 + 8 shad: shadow 12 e_n_d_ _ _ _ _ _ _ _ 37 bytes = 18.5 word words _ _ _exit _ _ _rc 36 exception 21 testout 115 alloc _PT 53 server 36 M_M_m_m_ HPM, main program 150 + no _of _PTs * 18.5 words P_P_p_p_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 411 + no _of _PTs * 18.5 words or approx. 450 + no _of _PTs * 37 d_i_v_ 2 words. Total stack requirements: 1600 + no _of _PTs * 41 + N * 1000 bytes where N is the number of actually opened ports. \f 4_._3_ _ _ _ _ _ _ _P_o_o_l_s_ _(_M_e_s_s_a_g_e_ _S_t_o_r_e_)_ 4.3 The following pools are declared in the port process: c_o_n_s_t_ LT _buf = 2; ACK _bufs = 1; tags: p_o_o_l_ LT _bufs + 1 3 * 32 = 96 HPP _head: p_o_o_l_ ACK _bufs o_f_ HPP _buf; 1_ _*_(_3_2_+_6_0_)_ _ _=_ _9_2_ 188 bytes In the answerer process: c_o_n_s_t_ c = no _of _PTs d_i_v_ 8 + 2; buffer: p_o_o_l_ c o_f_ maxin; c * (32+2002) = 4068 + no _of _PTs * 254 eventbuf: p_o_o_l_ 1; 1_ _*_ _ _3_2_ _ _ _ _ _ _ _=_ _ _ _3_2_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 4100 + no _of _PTs * 254 In the parent process: key: p_o_o_l_ no _of _PTs; no _of _PTs *32 HPP _header: p_o_o_l_ 1 o_f_ HPP _buf; 1 *(32+60) = 92 NCPhead: p_o_o_l_ 2; 2 * 32 = 64 NCPconn: p_o_o_l_ 1 o_f_ LCP _conn _type; 1_ _*_(_3_2_+_8_)_ _ _=_ _4_0_ _ _ _ _ _ _ _ 196 + no _of _PTs *32 Total pool requirements: 4296 + no _of _PTs * 286 + N * 188 4_._4_ _ _ _ _ _ _ _T_o_t_a_l_ _S_t_o_r_e_ _R_e_q_u_i_r_e_m_e_n_t_s_ 4.4 comprises 17 210 + no _of _PTs * 327 + N* 1188 bytes. The requirements may be viewed graphically on fig. 3. \f F_ Figure 3: Graphic display of HPM store requirements. \f F_ A_._ _ _ _ _ _ _ _ _R_E_F_E_R_E_N_C_E_S_ A. 1 RCSL No 43-GL11209: CENTERNET, Host Port Protocol, Report Karsten Kynde, May 1981 2 RCSL No 43-GL11414: CENTERNET, Host Port Module - HPM, Programming Guide Karsten Kynde, August 1981 3 RCSL No 43-GL11425: CENTERNET, FPA Data Link Control - FDLC, Reference Manual Karsten Kynde, September 1981 4 RCSL No 43-GL11413: CENTERNET, FPA Data Link Control - FDLC, Programming Guide Karsten Kynde, August 1981 5 RCSL No 43-AA699: RC3502 COM 201 HDLC Driver, Reference Manual Harald Villemoes 6 RCSL No 43-GL11417: CENTERNET, Network Port Module - NPM, Reference Manual Niels Carsten Jensen, August 1981 7 RCSL No 52-AA964: PASCAL80, Report Jørgen Staunstrup, January 1980 8 RCSL No 42-i1542: RC3502 - PASCAL80, Reference Manual Bo Bagger Laursen, November 1980 9 RCSL No 43-GL10190: CENTERNET, System Specifications April 1980 \f 10 RCSL No 43-GL11418: CENTERNET, Local Control Probe, Specification Sheets Peter Bjerregård Lauridsen (to be published) 11 RCSL No 43-GL11424: NCP Data Structures, Reference Manual, Revision 1.02 Claus Houlberg Hansen \f \f «eof»