[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