EPOS FAK and HOW2

[ Como fazer uma Nova Abstra�o/Mediador no EPOS ]
[ FAQ ]


Como fazer uma Nova Abstra�o/Mediador no EPOS


Para facilitar utilize como editor XEMACS (http://www.xemacs.org)
Os demais editores dificilmente ter� ferramentas de suporte �XML.

Acesse o cvs da seguinte forma:
export CVS_RSH=ssh
cvs -z3 -d:ext:login@cvs.maquina.dom�io.ufsc.br:/usr/local/cvs co epos

Isso ir�criar uma diretrio chamado epos e dentro dele estar� os fontes.

Informe o caminho do epos ao shell como segue:
cd epos
export EPOS=$PWD
export PATH=$EPOS/bin:$PATH

Pronto, agora seu shell est�configurado para trabalhar com o epos.
Agora, no diretrio $EPOS fa�:
make config
Isso ir�gerar os arquivos base do epos.

Agora voc�pode editar o arquivo XML que servir�como esqueleto para a constru�o
dos arquivos relativos a sua abstra�o ou mediador.
Como exemplo suponha a cria�o de uma abstra�o. Utilizando o xemacs edite $EPOS/config/myAbs.xml.
Inclua o seguinte cdigo na janela do xemacs que possui o arquivo que voce acabou de abrir.


         
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE family SYSTEM "family.dtd">
	
	


Isso avisar�ao XEMACS que ele est�trabalhando com um arquivo DTD de XML e que ele pode utilizar suas ferramentas.
Agora, clique com o bot� direito do mouse dentro de XEMACS e escolha a op�o DTD -> parse DTD.
Dessa forma o XEMACS conhece o esqueleto de cria�o de XMLs para o epos.
Utilize o bot� direito para ver quais so os tags v�idos para cada campo.
Se n� souber o que colocar nos campos pressione TAB para op�es e autocomplemento.
Coloque os nomes de m�odos, membros, tipos etc semelhante a este:


<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE family SYSTEM "family.dtd" >
<family name="Network" type="abstraction" class="dissociated" >
<!‐‐ -----------------------------------------  ‐‐>
<!‐‐ primeiro item a ser declarado eh a interface inflada ‐‐>
  <interface >

  <!‐‐ construtor  da classe ‐‐>
    < constructor >
      <EMPTY ></EMPTY>
    </constructor >
    	
    <!‐‐ m�odo, retorno e como o m�odo deve ser tratado ‐‐>
    <!‐‐ parametros e tipo do parametro  ‐‐>
    
     <!‐‐ nota importante: para cada novo tag, posicione o
      cursos sobre o seu caracter inicial ("<") e clique
      com o bot� direito para ver mais op�es relacionadas 
      com aquele �em, como  qualifiers e return em m�odos, 
      por exemplo.‐‐>
    
   <method name="send" return="void"  qualifiers=""  >
      <parameter name="node" type="NodeId" >
      <parameter name="data" type="void*" >
      <parameter name="size" type="int" >
    </method >
    

    <method name="receive" return="void"  qualifiers=""  >
       <parameter name="node" type="NodeId*  >
      <parameter name="data" type="void*" >
      <parameter name="size" type="int*" >
    </method >

  </interface >
<!‐‐ -----------------------------------------  ‐‐>

<!‐‐ -----------------------------------------  ‐‐>
  <!‐‐ m�odos comuns aos membros ‐‐>
  <common >
   
   <method name="send" return="void"  qualifiers=""  >
      <parameter name="node" type="NodeId" >
      <parameter name="data" type="void*" >
      <parameter name="size" type="int" >
    </method >
    

    <method name="receive" return="void"  qualifiers=""  >
       <parameter name="node" type="NodeId*  >
      <parameter name="data" type="void*" >
      <parameter name="size" type="int*" >
    </method >
    
  <!‐‐ voc�pode declarar tipos tamb�  ‐‐>
  <type name="protocolTable" type="structure" >
  
  </common >
<!‐‐ -----------------------------------------  ‐‐>

<!‐‐ -----------------------------------------  ‐‐>
  <!‐‐ membro, custo e como ele deve ser tratado ‐‐>
  <member name="dummynet" cost="1"  qualifiers="" >
  
  <!‐‐ construtor do membro  ‐‐>
    <constructor >
      <EMPTY >&/EMPTY>
    </constructor >
    
    <method name="ARP" return="void"  qualifiers=""  >
     <parameter name="ip" type="ipAddrr *"  >
     <parameter name="mac" type="MAC" >
    </method >
  
  </member >
<!‐‐ -----------------------------------------  ‐‐>  
  
<!‐‐ -----------------------------------------  ‐‐>
  <member name="dumbnet" cost="2"  qualifiers="" >
  
  <!‐‐ construtor do membro  ‐‐>
    <constructor >
      <EMPTY >&/EMPTY>
    </constructor >

    <!‐‐ esse membro ter�somente os m�odos existentes em common  ‐‐>
  </member >
  
  <!‐‐ fim do arquivo ‐‐>
</family >
<!‐‐ -----------------------------------------  ‐‐>


(exemplo de paser de xml)
(exemplo de acesso a campos adicionais)

Agora, utilize o comando epos-newabs myAbs para cria a abstra�o
O comando epos-newabs cria todos os arquivos referentes a abstra�o
inclusive os arquivos relativos ao framework config.h.new, init_table.h.1.new,
init_table.h.2.new, types.h.1.new, types.h.2.new.
encontrados em $EPOS/include/system
Agora �necess�io a inclus� do contedo desses arquivos nos seus respectivos arquivos destino
config.h.new no config.h, init_table.h.1.new e init_table.h.2.new no init_table.h,
e types.h.1.new e types.h.2.new no types.h.

Nesse momento a sua abstra�o faz parte do framework do EPOS.
Entretando �necess�io definir os simbolos relativos aos membros.


Ao tentar rodar um teste voce pode se deparar com o seguinte problema:

secco@sv:~/work/epos/src/abstraction/network$ make test
eposcc -c -ansi -O2   myrinet_test.cc
eposcc --builtin  myrinet_test.o -o myrinet_test
myrinet_test.o: In function `main':
myrinet_test.o(.text+0x3e): undefined reference to `System::Imp::Myrinet::Myrinet()'
myrinet_test.o(.text+0x58): undefined reference to `System::Int::Myrinet::registerProtocol(int, void*)'
myrinet_test.o(.text+0x86): undefined reference to `System::Imp::Myrinet::~Myrinet()'
make: *** [myrinet_test] Error 1
rm myrinet_test.o

Para arruma isso compile o EPOS normalmente, make config e make.
V�para $EPOS/src/abstration/myAbs (ou src/mediador) e utilize
o comando objdump para encontrar os simbolos relativos aos membros sua abstra�o,
objdump -t MembroMyAbs.o . A sa�a desse comando ser�algo parecido com o que segue:

MembroMyAbs.o: file format elf32-i386
SYMBOL TABLE:
00000000 l df *ABS* 00000000 MembroMyAbs.cc
00000000 l d .text 00000000
00000000 l d .data 00000000
00000000 l d .bss 00000000
00000000 l d .comment 00000000
00000000 g F .text 00000005 _ZN6System3Imp8MembroMyAbs2Ev
00000010 g F .text 00000005 _ZN6System3Imp8MembroMyAbs1Ev
00000020 g F .text 00000005 _ZN6System3Imp8MembroMyAbs2Ev
00000030 g F .text 00000005 _ZN6System3Imp8MembroMyAbs1Ev

Procure nessa sa�a o s�bolo relativo ao sua abstra�o, _ZN6System3Imp8MembroMyAbs2Ev ,
neste caso. Ou utilize esse >script que ira disponibilizar uma lista de simbolos que devem ser
inseridos no system.cc.
Agora edite o arquivo $EPOS/src/system/system.cc e inclua o s�bolo
_ZN6System3Imp8MembroMyAbs2Ev ou com os mediadores ou com as abstra�es.

//--------------------------Abstractions-------------------------------



#ifdef __MEMBROMYABS_H <---- DEFINA O HEADER DO MEMBRO
ASM(".set __dummy, _ZN6System3Imp8MembroMyAbs2Ev"); <---- USE ESTE ASM E SUBSTITUA APENAS O S�BOLO
#endif <---- FECHE O #ifdef

V�para $EPOS, rode make distclean, make config e make , retorne ao diretrio
de sua abstra�o e execute make test.

Outra coisa importante a fazer �colocar no default.key a informa�o de qual membro
voc�deseja utilizar. Essa informa�o �encontrada em $EPOS/include/system/config.h
que voc�acaba de atualizar.
no config.h deve exisitir algo semalhante a isso:

...
//============================================================================
// NETwORK
//============================================================================
__EXPORT_ABS(Network, Myrinet) //exporta abstra�o

#ifdef ANALYZE                        //se o analisador estiver habilitado
__UNBIND_ABS(Network)
#else

#if #CONF_NETWORK ( Myrinet)          //sen� verifica no default.key se CONF_NETWORK (Myrinet) foi definido
#if ! #BOUND (Network)                // e define e exporta as valored para o framework
__BIND_ABS(Network, Myrinet)
#assert BOUND (Network)
#endif
#define __MYRINET_H __HEADER_ABS(network/myrinet)
#endif

#endif
...

No $EPOS/default.key voc�ter�algo semelhante a isso:
#ifndef __default_keys_h
#define __default_keys_h

#assert CONF_FRAMEWORK          (Uniform)
#assert CONF_ID                 (Pointer)
#assert CONF_ARCH               (IA32)
#assert CONF_MACH               (PC)
#assert CONF_THREAD             (Concurrent_Thread)

#endif

Inclua a defini�o como no config.h para avisar ao EPOS a escolha de uma determinada
caracteristica :
#ifndef __default_keys_h
#define __default_keys_h

#assert CONF_FRAMEWORK          (Uniform)
#assert CONF_ID                 (Pointer)
#assert CONF_ARCH               (IA32)
#assert CONF_MACH               (PC)
#assert CONF_NETWORK  (Myrinet)  
#assert CONF_THREAD             (Concurrent_Thread)

#endif


Para fazer as altera�es permanentes modifique o $EPOS/tools/eposcc/default.key
Se compilar o teste est�certo, caso contr�io envie emails com um log dos erros existentes para
o mestrando respons�el pela diciplina ou procure algu� do groupo do EPOS no LISHA.


FAQ

Como utilizar a STL dentro do EPOS?


Voc�pode incluir normalmente os headers da STL mas �neces�ia uma pequena altera�o.
Quando voc�tentar compilar com a utiliza�o da STL receber�uma mensagem como esta:
/usr/local/cross-ia32/bin/g++ -c --no-exceptions --no-rtti --no-use-cxa-atexit  
-O2 -nostdinc -Wall -Winline -I/home/fernando/epos/include  -DSYSTEM myrinet.cc
In file included from myrinet.cc:6:
/home/fernando/epos/include/abstraction/network/myrinet.h:13:61: iostream: No such file or directory
[fernando@lens-gw network]$

Se você reparar na opção de compilação -nostdinc ela define que
a STL deve ser ignorada agora se você removê-la o EPOS compilar normalmente.
Para faze as alterações permanentes modifique $EPOS/makedefs na linha CCFLAGS e CXXFLAGS.
Não esqueça de usar de incluir o caminho das bibliotecas da STD nos aquivos de compilação.
O mais importante é colocar todos os metodos no header e fazer instanciacao explicita de templates.

cannot find -lgcc


Você precisa incluir a biblioteca do gcc no caminho de compilação pois ela não foi encontrada
O comando -L/usr/local/cross-ia32/lib/gcc-lib/i686-pc-linux-gnu/3.2.2/
indica ao linkador (ld) para incluir o aquele caminho quando procurar por uma biblioteca.
Você tambem tem que dizer quais bibliotecas linkar, neste caso libstdc++ e suas dependencias,
parecido com esse modelo:

eposcc --builtin myrinet.o ../../system/system.o myrinet_test.o -o myrinet_test 
-L/usr/local/cross-ia32/lib/gcc-lib/i686-pc-linux-gnu/3.2.2/ -L/usr/local/cross-ia32/lib/ -lstdc++ -lsupc++ -lgcc_eh


Lembre-se de usar o namespace do template da stl que voce estiver utilizando, por exemplo:
std::cout, std::queue, std::stack, etc. Caso precise de utilizar algum template nao padrao,
como e o caso da hash_map, voce deve , literamente, encontrar o name space. No caso da hash_map
ele chama __gnu_cxx::hash_map.



http://epos.lisha.ufsc.br ultima visita 20/06/2004