[Team2013] c constructor attribute

Radu Rendec radu.rendec at mindbit.ro
Fri Apr 12 17:01:50 EEST 2013


Ok, sa le luam pe rand :)

On Fri, 2013-04-12 at 16:13 +0300, Andreea-Cristina Hodea wrote:
> Acum sunt un pic derutata. Daca mut shared.* in switch/switch.*, toate
> tool-urile din userspace care includ acum shared.h vor include de acum
> switch.h; am inteles corect?

Da, corect.

> Din cate am observat, daca o functie are
> atributul construct, chiar daca doar includ header-ul, acea functie
> este apelata.

Includerea header-ului nu ar trebui sa aiba nicio legatura. Daca functia
este compilata si link-ata in .so atunci este apelata automat la
incarcare.

> Daca switch_init() va fi constructor, vad 2 consecinte:
> 1. oricine include switch.h nu va mai chema switch_init()

Daca este constructor, switch_init() se va apela automat si nu trebuie
apelat explicit.

> 2. implementarile pentru sw_api fie nu vor mai avea constructor pentru
> adaugarea vlan-urilor default si descrierile vor fi adaugate in
> switch_init (care este constructor, iar adaugarea vlan-urilor pe bune
> va ramane in sw_vdb_init, in kernel), fie vom avea totusi un
> constructor per implementare care va apela ceva similar cu
> lisa_ctx.sw_ops.vlan_add per vlan default.

Cred ca e ceva de luat din fiecare varianta. Eu vad procesul asa:
      * switch_init() ramane constructor;
      * fisierul switch.h declara "extern struct switch_operations
        *sw_ops";
      * pentru apelurile catre backend se foloseste intotdeauna
        variabila sw_ops, pentru a nu depinde de un anumit backend
      * switch_init() asigneaza lui sw_ops un pointer la structura
        specifica unui anumit backend (de exemplu &lisa_ctx) - practic
        switch_init() are rolul de a decide care este backend-ul
        folosit. Intr-o prima faza, se pot folosi directive #ifdef
        pentru a selecta un backend sau altul.
      * switch_init() face tot ceea ce facea shared_init si in plus
        apeleaza sw_ops->vlan_add si shared_set_vlan_desc() (care se va
        numi "switch_set_vlan_desc") pentru fiecare vlan default in
        parte
      * in switch.ko (modulul de kernel "lisa") va ramane sw_vdb_init,
        dar aceasta nu va crea efectiv vlan-urile default (pentru ca
        sunt create din userspace)

Pentru initializari specifice fiecarui backend in parte, putem adauga in
switch_operations o functie "init", care va fi apelata de catre
switch_init(), folosind sw_ops->init(sw_ops).




More information about the Team2013 mailing list