• Nenhum resultado encontrado

Predicados de gest˜ao de portas de comunicac¸ ˜ao

4.3 Definic¸˜ao dos predicados de interface

4.3.1 Predicados de gest˜ao de portas de comunicac¸ ˜ao

Os predicados seguintes indicam os modos de criac¸˜ao, inicializac¸ ˜ao (ou abertura), fecho e destruic¸˜ao de portas de comunicac¸ ˜ao. As definic¸ ˜oes dos predicados aqui apresentadas correspondem fielmente `a vers˜ao actualmente implementada no prot´otipo, pelo que se fazem, pontualmente e em certos casos, referˆencias a valores particulares de alguns argumentos, v´alidos na “vers˜ao actual”.

A evoluc¸˜ao futura dos modelos poder´a ditar extens˜oes aos valores de certos argumentos, em particular os que correspondem a modos opcionais, indicados porFlags. Optou-se por fazer uma apresentac¸ ˜ao completa, apesar de resultar menos sucinta do que uma descric¸ ˜ao que omitisse estes pormenores.

sys create port(+Name,+Flags,;Port,;Status )

Cria uma porta com o nome indicado em Name. Este nome tem de ser ´unico no sistema, sen˜ao o predicado devolve um c´odigo de erro emStatus, com um dos valores abaixo indicados. Na vers˜ao actual o argumentoFlags apenas admite como valor o ´atomo p noflag. No caso de Status retor- nar um valor diferente de 0 (zero), Port n˜ao tem qualquer informac¸˜ao ´util. Caso contr´ario, Port devolve um descritor (n´umero inteiro) da porta, a utilizar nas operac¸ ˜oes de recepc¸ ˜ao de mensagens da porta.

O executor que criou a porta ´e o ´unico que pode receber mensagens atrav´es dela (ver sys recv msg/4 na secc¸˜ao 4.3.2).

A terminac¸˜ao de um executor associado a uma instˆancia da m´aquina Prolog desencadeia automa- ticamente todas as acc¸ ˜oes necess´arias para a destruic¸ ˜ao (ver sys destroy port/3 nesta secc¸˜ao) das portas a ele associadas.

O modelo de designac¸ ˜ao de portas adoptado ´e convencional: cada porta tem um nome global, ´unico no universo de executores, e pode ter m´ultiplos nomes locais — correspondentes aos valo- res devolvidos em Port — a cada executor, consoante o n´umero de operac¸ ˜oes de abertura que se invoquem.

Este predicado pode retornar emStatus um dos seguintes c´odigos de erro:

EOPTION – O argumento Flags cont´em um valor inv´alido ou que n˜ao ´e admitido neste predicado; EFULL – N˜ao ´e poss´ıvel obter mais descritores de portas;

EEXIST – J´a existe uma porta com o mesmo nome que o indicado.

Exemplo: “sys create port(foo, p noflag, P, S)” Ser´a criada uma porta com o nomefoo, devolvendo emP o identificador da porta e em S o resultado da operac¸˜ao (sucesso ou n˜ao).

4.3 Definic¸˜ao dos predicados de interface 37

sys open port(+Name,+Flags,;Port,;Status )

Este predicado tem o efeito de colocar uma porta, previamente criada, num estado suscept´ıvel de permitir a sua posterior utilizac¸ ˜ao para o envio de mensagens. Retorna um descritor (n´umero inteiro), que representa um “canal” que se abre para a comunicac¸ ˜ao atrav´es da porta, similar aos canais l´ogicos para acesso aos ficheiros, normais num sistema Prolog.

Apesar das operac¸ ˜oes de criac¸˜ao e abertura de porta n˜ao afectarem o estado corrente dos canais

standardde entrada e sa´ıda de um executor de Prolog, ´e poss´ıvel associar canais de ficheiros a canais de mensagens, obtendo-se uma generalizac¸ ˜ao real dos mecanismos de entrada/sa´ıda e conseguindo-se tornar a comunicac¸ ˜ao por mensagens t˜ao transparente quanto o acesso a ficheiros.

O predicado abre uma porta com o nome indicado emName e retorna um descritor da mesma em Port. O argumento Flags pode tomar um dos valores p wait ou p nowait.

O argumentoFlags com o valor p wait indica que o executor invocador dever´a ser bloqueado7

at´e que a porta em quest˜ao (com o nome Name) seja criada8. O argumento Flags com o valor

p nowait indica que, caso a porta em quest˜ao (com o nomePort) n˜ao exista, dever´a retornar ime- diatamente um c´odigo de erro emStatus.

´

E necess´ario abrir a porta para se poderem enviar mensagens para ela (ver sys send msg/4 na secc¸˜ao 4.3.2). Uma porta pode ser aberta v´arias vezes pelo mesmo executor ou por executores diferentes, obtendo-se de cada vez um descritor diferente e independente dos demais existentes.

Este predicado pode retornar emStatus um dos seguintes c´odigos de erro:

EOPTION – O argumento Flags cont´em um valor inv´alido ou que n˜ao ´e admitido neste predicado; EFULL – N˜ao ´e poss´ıvel obter mais descritores de portas;

ENOENT – N˜ao existe nenhuma porta no sistema com o nome indicado.

Exemplo: “sys open port(bar, p wait, P, S)” Espera que a porta com o nomebar seja criada e abre-a, localmente ao executor invocador, devolvendo emP o identificador da porta e em S o resultado da operac¸˜ao (sucesso ou n˜ao).

sys close port(+Port,+Flags,;Status )

Fecha a porta associada ao descritorPort. O argumento Flags apenas admite como valor o ´atomo

p noflag.

Para ser permitido fechar uma porta, o descritorPort tem de ser um dos obtidos, por este exe- cutor, na invocac¸ ˜ao do predicado sys open port/4, sen˜ao o predicado devolve erro emStatus. O facto de se fechar uma porta n˜ao impede que posteriormente se volte a abri-la (com sys open port/4). Fechar uma porta n˜ao tem qualquer efeito sobre as mensagens nela pendentes, i.e. as mensagens ainda n˜ao recebidas pelo destinat´ario poder˜ao ser recebidas mais tarde.

Este predicado pode retornar emStatus um dos seguintes c´odigos de erro:

EOPTION – O argumento Flags cont´em um valor inv´alido ou que n˜ao ´e admitido neste predicado; EBADF – O argumento Port n˜ao corresponde a um descritor v´alido;

7O bloqueio do executor corresponde `a suspens˜ao do processo de resoluc¸˜ao de golos corrente, com preservac¸˜ao do estado do executor de Prolog.

8Se o executor invocador ´e tamb´em o suposto criador da porta e ainda n˜ao invocou syscreate port/4, verifica-se um bloqueio interno, que n˜ao ´e identificado nem tratado pelo sistema.

EPERM – O descritor Port n˜ao d´a permiss˜oes para fechar a porta (porque foi obtido com sys create port/4).

Exemplo: “sys close port(4, p noflag, S)” Fecha o descritor de porta4, devolvendo em S o resultado da operac¸˜ao (sucesso ou n˜ao).

sys destroy port(+Port,+Flags,;Status )

Destr´oi a porta do sistema associada ao descritorPort. O argumento Flags apenas admite como valor o ´atomo p noflag. Apenas quem criou a porta ´e que a pode destruir, i.e. o descritorPort tem de ser o obtido na invocac¸ ˜ao do predicado sys create port/4, sen˜ao o predicado devolve erro em Status.

A porta s´o ´e efectivamente destru´ıda quando j´a n˜ao existirem descritores da porta abertos pa- ra al´em de Port, mas ap´os a execuc¸˜ao deste predicado n˜ao ´e mais poss´ıvel abrir a porta (com sys open port/4). Quando a porta ´e efectivamente destru´ıda, todas as mensagens nela pendentes s˜ao eliminadas.

Este predicado pode retornar emStatus um dos seguintes c´odigos de erro:

EOPTION – O argumento Flags cont´em um valor inv´alido ou n˜ao admitido neste predicado; EBADF – O argumento Port n˜ao corresponde a um descritor v´alido;

EPERM – O descritor Port n˜ao d´a permiss˜oes para destruir a porta (porque foi obtido com sys open port/4).

Exemplo: “sys destroy port(4, p noflag, S)” Destr´oi a porta associada ao descritor4, de- volvendo emS o resultado da operac¸˜ao (sucesso ou n˜ao).