Articolo pubblicato sul n. 89 di
MCmicrocomputer
(Edizioni Technimedia Srl - Roma) nell'ottobre1989
Amighevole:
ADPmttb 2.0:
Multitasking Toolbox per Amiga
(seconda
parte)
di Andrea de Prisco
Sul numero scorso, per i soliti problemi di spazio
(tiranno), abbiamo pubblicato solo una versione ridotta
dell'ADPmttb. Approfittando del fatto che ancora non
pubblichiamo i listati di ADPnetwork, sfruttiamo un po' di
spazio di questo articolo per "rilasciarvi" altre 5 routine
dell'ADPmttb.
Si tratta di funzioni per controllare lo stato delle
porte create con la funzione NewPort mostrata lo scorso
mese. Le prime due, PortWait (da non confondere con la
WaitPort di Exec!!!) e MessageWait, permettono di
sospendere il processo chiamante per un numero di secondi
indicato o fino a quando non viene creata da qualche
altro processo una porta, o arriva un messaggio atteso. In
tutt'e due i casi il primo parametro e' il nome della porta
mttb e il secondo parametro e' il tempo massimo da aspettare
espresso in secondi. Indicando un tempo nullo il
timeout e' infinito (usare con cautela...).
La funzione CheckPort permette di stabilire se una
determinata porta esiste e in caso affermativo quanti
messaggi vi sono accodati. L'unico parametro da passare e'
il nome della porta.
La funzione WipePort serve invece per pulire una porta mttb
da messaggi non piu' desiderati. Il primo parametro e',
come al solito, la porta su cui agire, il secondo
parametro indica la quantita' di messaggi da togliere.
Indicando 0 in questo campo la porta e' ripulita da
tutti i messaggi presenti. In risposta abbiamo il
numero di messaggi tolti (o errore se qualcosa non e' andato
per il giusto verso).
Per finire, la funzione MessageLen permette di conoscere la
dimensione del messaggio presente su una porta mttb.
Cio' e' molto utile quando non si conosce la quantita'
di memoria da riservare per contenere il messaggio
arrivato. Il primo parametro e' il modo di
funzionamento (MODE_WAIT o MODE_NOWAIT), il secondo
parametro e' la porta. Indicando MODE_WAIT se la porta e'
vuota il processo chiamante e' sospeso fino a quando non
arriva il messaggio; indicando MODE_NOWAIT, nel caso la
porta sia vuota, la funzione ritorna la costante predefinita
EMPTY_PORT.
Sul prossimo numero cercheremo di mettere le rimanenti
funzioni offerte dall'ADPmttb. Arrivederci...
/**************************************
* *
* *
* A D P m t t b 2.0 *
* *
* MultiTasking ToolBox *
* (seconda parte) *
* *
* --------------------- *
* (c) 1989 ADPsoftware *
* --------------------- *
* *
**************************************/
int PortWait(char *,int);
int MessageWait(char *,int);
int CheckPort(char *);
int WipePort(char *, int);
int MessageLen(UBYTE,char *);
extern struct ExecBase *SysBase;
/**************************************
* *
* P O R T W A I T *
* *
**************************************/
PortWait(porta,sec)
char *porta;
{
if (sec == 0) sec--;
while ((struct MsgPort *)FindPort(porta) == NULL &&
sec)
{
Delay(SysBase->VBlankFrequency);
sec--;
}
return(iabs(sec));
}
/**************************************
* *
* M E S S A G E W A I T *
* *
**************************************/
MessageWait(porta,sec)
char *porta;
{
struct MsgPort *port;
if (sec == 0) sec--;
Forbid();
if ((port = (struct MsgPort *)FindPort(porta)) ==
0)
{
Permit();
return(NO_PORT);
}
Permit();
while (port->mp_MsgList.lh_Head->ln_Succ == NULL &&
sec)
{
Delay(SysBase->VBlankFrequency);
sec--;
}
return(iabs(sec));
}
/**************************************
* *
* C H E C K P O R T *
* *
**************************************/
CheckPort(porta)
char *porta;
{
int count=0;
struct MsgPort *port;
struct Node *node;
Forbid();
if ((port = (struct MsgPort *)FindPort(porta)) ==
0)
{
Permit();
return(NO_PORT);
}
for (node = port->mp_MsgList.lh_Head;
node->ln_Succ;
node = node->ln_Succ) count++;
Permit();
if (count) return(count);
else return(EMPTY_PORT);
}
/**************************************
* *
* W I P E P O R T *
* *
**************************************/
WipePort(porta,nmsg)
char *porta;
{
struct adp_message *adpmsg;
struct MsgPort *port;
int i=0;
if (nmsg == 0) nmsg--;
Forbid();
if ((port = (struct MsgPort *)FindPort(porta)) ==
0)
{
Permit();
return(NO_PORT);
}
while ((adpmsg = (struct adp_message *)GetMsg(port))
&& nmsg--)
{
i++;
if (adpmsg->mode & MODE_SYNC) ReplyMsg(adpmsg);
else FreeMem( adpmsg, sizeof(struct
adp_message) + adpmsg->len );
}
Permit();
return(i);
}
/**************************************
* *
* M E S S A G E L E N *
* *
**************************************/
MessageLen(mode,porta)
UBYTE mode;
char *porta;
{
struct MsgPort *port;
struct adp_message *temp;
ULONG succ;
if ((mode & MODE_WAIT || mode & MODE_NOWAIT)==0)
return(OP_FAIL);
Forbid();
if ((port = (struct MsgPort *)FindPort(porta)) ==
0)
{
Permit();
return(NO_PORT);
}
Permit();
if (mode & MODE_WAIT) WaitPort(port);
temp = (struct adp_message *)(port->mp_MsgList.lh_Head);
succ = (ULONG)(((struct Node *)temp)->ln_Succ);
if (succ) return(temp->len);
else return(EMPTY_PORT);
}
Impaginato
originale...
Articolo pubblicato
su
www.digiTANTO.it - per ulteriori informazioni
clicca qui
|