Você está na página 1de 4

REA DE COMUNICAO ENTRE PROGRAMAS CICS DFHCOMMAREA Visando esclarecer sobre utilizao de reas externas em programas CICS, tendo

em vista a grande facilidade de passarmos informaes entre programas atravs da utilizao da rea de comunicao (COMMAREA), este documento tem o propsito de salientar esta facilidade, atentando para o problema de STORAGE VIOLATION pela maneira incorreta de trabalhar com esta rea. Uma das formas mais comuns de passagem de dados entre programas CICS atravs da rea de comunicao, conhecida como COMMAREA. A rea de comunicao pode ser passada atravs dos comandos: EXEC CICS LINK PROGRAM... COMMAREA(...) EXEC CICS XCTL PROGRAM... COMMAREA(...) EXEC CICS RETURN TRANSID... COMMAREA(...) Esta rea qualquer rea contgua enderevel pelo programa que ir passar os dados e ser definida como rea externa no programa que ir receb-la, portanto, uma rea definida na LINKAGE SECTION. Em qualquer programa CICS existem sempre duas reas externas. A rea chamada DFHEIBLK que uma rea fixa contendo dados da TASK que podem ser acessadas pelo programa e a DFHCOMMAREA que uma rea varivel passada para o programa atravs de um dos comandos acima. A DFHEIBLK inserida pelo Translator do CICS em tempo de compilao como primeira rea externa, e a DFHCOMMAREA deve ser inserida pelo programador como o primeiro nvel 01 da LINKAGE SECTION. Caso o programa no tenha necessidade de ter uma DFHCOMMAREA definida, o CICS ir, automaticamente, incluir esta rea com o tamanho de um byte. No caso de um programa ser chamado por outro via EXEC CICS LINK esta rea recebida ser devolvida ao programa que o chamou quando do trmino do programa chamado. Quando o programa chamado for via EXEC CICS XCTL ou EXEC CICS RETURN TRANSID o CICS alocar em memria uma rea que seja suficiente para comportar os dados passados acrescida de pelo menos 16 bytes (2 campos de 8 bytes) a mais, que utilizado pelo CICS para o controle de reas da Task, e disponibilizar ao programa chamado ou ao primeiro programa da nova Task quando este adquirir o controle da CPU. O importante na definio de uma rea externa defini-la com um tamanho suficiente para conter os dados recebidos mais os dados que sero acrescidos esta rea caso a mesma seja devolvida ao programa que a chamou. Quando o programa receptor puder receber dados variveis, dependendo do programa que o est invocando, esta rea deve ser mapeada pelo maior tamanho possvel de ser recebido, levando-se sempre em considerao o tamanho efetivo que foi recebido pelo programa, para evitar uma violao de memria quando da utilizao da mesma. A violao de memria sempre estragar o contedo dos campos que venham logo a seguir a rea em questo. Nem sempre esta violao detectada pelo CICS e quando detectada o somente na hora da liberao das reas utilizadas pelo programa e no no momento exato da violao o que s vezes torna difcil determinar o causador da invaso. Assim devemos evitar ao mximo este tipo de ocorrncia.

Consideraes sobre a passagem via comando LINK. Como a rea passada ser utilizada pelo programa que a passou, o CICS pode utilizar a prpria rea do programa que chamou passando para o programa chamado apenas o endereo da rea caso os dois programas venham a ser executados no mesmo CICS, ou adquirir uma rea com o tamanho da rea passada caso os programas sejam executados em diferentes CICS. Em qualquer um dos casos o programa chamado tem acesso a esta rea e como boa prtica de programao devemos trabalhar com esta prpria rea, no havendo necessidade de se definir na rea fixa do programa (WORKING STORAGE, no caso do COBOL) uma rea idntica, mover para l o contedo da rea recebida e posteriormente devolver este contedo para a DFHCOMMAREA no encerramento do programa chamado (o importante saber o tamanho desta rea recebida e ter certeza que o layout da mesma no ultrapassa o valor recebido). Tempos atrs no havia muito a preocupao de se definir a rea corretamente quando se tinha certeza que os dois programas seriam executados no mesmo CICS (uma vez que, como vimos acima, a rea utilizada era do prprio programa chamador e desde que o layout deste estivesse correto, no importava nem o tamanho passado nem o layout da DFHCOMMAREA. Com o advento do CICSPLEX e a possibilidade de se definir um programa como dinmico, um programa chamado pode ser executado em outro CICS que no o do programa que o chamou. Assim, tornou-se importante que a movimentao de dados para esta rea seja no mximo igual ao tamanho da mesma para que no ocorra a violao da memria. Caso haja a possibilidade de se receber uma rea varivel, a definio do LAYOUT da DFHCOMMAREA deve ser feita sempre pelo mximo que o programa pode receber e para saber a quantidade realmente recebida pelo programa chamado consultar o campo EIBCALEN. O EIBCALEN faz parte do bloco DFHEIBLK e contm o valor da rea recebida pelo programa. Outra prtica recomendvel trabalhar direto nesta rea o que possibilita ganho de memria em no ter que defini-la outra vez no programa e ainda evitar uma violao caso estas reas tenham tamanhos diferentes. Ao optar por movimentar as reas, levar em considerao o EIBCALEN na ora da movimentao. Temos que levar em considerao as regras do Cobol na execuo da instruo MOVE. Se as reas envolvidas so do mesmo tamanho, o contedo da primeira rea ser movido inteiramente para a segunda rea. Se as reas forem de tamanho diferente podemos ter surpresas nesta movimentao. O tamanho das reas determinado na descrio do layout desta rea pelo nvel da rea especificada delimitada pela rea seguinte que tenha o mesmo nvel, ou a rea est sendo quantificada pelo tamanho a ser movido. As duas reas esto definidas na Working Storage do programa: Se a rea receptora for menor que a transmissora, o Cobol ir mover os dados de acordo com o tamanho da rea receptora, desprezando o restante. Se a rea receptora for maior que a rea transmissora o Cobol ir mover o contedo total da rea transmissora preenchendo o resto com espaos (Hexadecimal 40). Pelo menos uma das reas est definida como rea externa (LINKAGE SECTION), como o caso da DFHCOMMAREA. Se a rea recebida pelo programa pode ser varivel, a definio do tamanho desta rea dever ser feito pelo mximo possvel e temos que considerar sempre o tamanho real recebido quando formos utilizar esta rea.

Na movimentao de / para esta rea caso no quantificarmos a mesma, exemplo, mover a DFHCOMMAREA para uma rea da Working Storage, o que comum em programas CICS, o tamanho dos dados a serem movidos da rea transmissora (rea externa ao programa), ser determinado pelo tamanho da rea receptora (rea definida na Working Storage). Quando a rea receptora for menor que a rea transmissora, a transferncia de dados ser o suficiente para completar o tamanho definido da rea receptora, sendo o restante ignorado. Quando a rea receptora for maior que a rea transmissora, a transferncia de dados ser o total de bytes da rea transmissora mais os bytes contguos a esta rea na memria at completar o tamanho da rea receptora. Neste caso, a rea receptora conter dados invlidos que pertencem a outra rea de memria. No retorno dos dados da Working Storage para a DFHCOMMAREA a quantidade de bytes a ser movida, quando no especificado o tamanho, ser igual ao valor definido na DFHCOMMAREA. Desta forma, se a DFHCOMMAREA que foi passada a este programa for menor que o layout definido ocorrer uma invaso de rea. Quando o CICS detecta que houve uma STORAGE VIOLATION ? No CICS temos 4 reas destinadas s transaes, dependendo da definio da transao: CDSA - Cics Dynamic Storage Area - Taskdatakey(Cics) Taskdataloc(Below) UDSA - User Dynamic Storage Area - Taskdatakey(User) Taskdataloc(Below) ECDSA - Extended Cics Dynamic Storage Area - Taskdatakey(User) Taskdataloc(Above) EUDSA - Extended User Dynamic Storage rea Taskdatakey(User) Taskdataloc(Above) Cada vez que a transao necessita de uma rea, esta solicitada ao CICS que ir obt-la de acordo com a definio acima. Toda rea adquirida para a transao ser alinhada em Double Word (divisvel por oito) e conter mais 16 bytes divididos em 2 campos de 8 bytes cada, colocados um no incio da rea e o outro no fim da rea, conhecidos como SSA (Storage Save rea). O contedo da SSA composto de 1 byte com a identificao da rea e 7 bytes com a identificao da Task. A identificao da Task atribuda pelo CICS quando da criao da mesma. Quando a Task termina, o CICS libera todas as reas que tenham sido alocadas para a referida Task, e na liberao o CICS a partir do tamanho da rea confronta os primeiros 8 bytes da mesma com os ltimos 8 bytes, ou seja, compara se as duas SSAs esto idnticas, o que indica que est rea uma rea vlida. Se todas as reas desta Task esto corretas a Task termina e a memria ocupada pela mesma liberada para novas Tasks. Quando na comparao destes campos, ocorre divergncia de valores o CICS percebe que ocorreu uma violao de memria. Nem sempre, uma invaso de memria detectada pelo CICS. O caso mais comum quando um programa chamado via EXEC CICS LINK passando uma rea de comunicao e este programa executado no mesmo CICS do programa que o chamou. Neste caso, o CICS no vai passar ao programa chamado uma rea, mas simplesmente o endereo desta rea que pertence ao outro programa e que geralmente est definida na Working Storage. Caso o programa chamado manipule uma rea maior que a recebida ele estar alterando diretamente a

Working Storage do outro programa e se no atingir a SSA desta rea, o CICS no detectar um Storage Violation.

BOAS TCNICAS DE UTILIZAO DA REA DE COMUNICAO. O programa que recebe a rea deve, sempre que possvel, trabalhar na prpria rea recebida, pois com isto o programa economiza memria e evita movimentaes desnecessrias que causam overhead nesta movimentao e que podem causar problemas de violao de memria. Se o programa pode receber dados de vrios programas e estes dados so variveis, definir a DFHCOMMAREA com o tamanho mximo e fazer redefines dos possveis layouts de cada rea diferente. A orientao do redefines vlida tambm quando se optar por mover a DFHCOMMAREA para uma rea da Working. O tamanho da rea recebida colocado, pelo CICS, no Exec Interface Block no campo EIBCALEN. O programa deve testar se a rea recebida suficiente para conter os dados recebidos + os dados que devero ser retornados nesta rea. Na movimentao da DFHCOMMAREA para outra rea e vice-versa, quantificar a quantidade a ser movida utilizando o campo EIBCALEN. Exemplo: MOVE DFHCOMMAREA(1:EIBCALEN) TO COMAREA. MOVE COMAREA TO DFHCOMMAREA(1:EIBCALEN)