View Full Version : [C] - una definizione
non mi è chiaro cosa definisce questa sotto:
EXTERN struct proc *pproc_addr[NR_TASKS + NR_PROCS];
#define NR_TASKS 4
#define proc_addr(n) (pproc_addr + NR_TASKS)[(n)]
e poi se questa assegna a xp il risultato della chiamata di una funzione oppure, se questo proc_addr(xp->p_sendto) è un assegnamento che non ho mai visto ?
xp = proc_addr(xp->p_sendto);
A me sembra più una chiamata di funzione
grazie
banryu79
03-06-2009, 13:59
No è una semplice (:rolleyes:) "function-like" macro.
Ovvero una macro con parametro, che sembra una chiamata a funzione ma che in realtà è una trappola per topi :D
Scherzi a parte, essendo una define, va interpretata così:
#define proc_addr(n) (pproc_addr + NR_TASKS)[(n)]
regola:
#define <identifier>(<parameter list>) <replacement token list>
Per cui il tuo codice:
xp = proc_addr(xp->p_sendto);
dopo che il preprocessore è passato a farsi il suo giretto, se la mia memoria del C non è del tutto arruginita, viene sostituito così:
xp = proc_addr + NR_TASKS[(xp->p_sendto)];
<DISCLAIMER MODE>
Si declina ogni responsabilità per le eventuali fantasticherie espresse in questo post (attendi lumi più precisi).
</DISCLAIMER MODE>
||ElChE||88
03-06-2009, 14:03
Edit: già corretto
Per cui il tuo codice:
xp = proc_addr(xp->p_sendto);
dopo che il preprocessore è passato a farsi il suo giretto, se la mia memoria del C non è del tutto arruginita, viene sostituito così:
xp = proc_addr + NR_TASKS[(xp->p_sendto)];
quindi NR_TASKS è un array :confused:
Quello che non mi suona è che [(xp->p_sendto)] quello tra parentesi è un ....... anzi mi coorreggo: non è un puntatore ma un intero che rappresenta il numero del processo
Quindi l'assegnamento xp = proc_addr + NR_TASKS[(xp->p_sendto)]; fa puntare xp a proc_addr + indirizzo del processo interessato :stordita:
in questo scorcio di codice si dice che il wile verifica eventuale deadlock tra il chiamante e la destinazione ma anche tra gli altri processi: il punto è che non vedo nulla, parti di codice e solitamente '++' che incrementi alcun puntatore :confused:
07605 /* Check for deadlock by 'caller_ptr' and 'dst' sending to each other. */
07606 xp = dst_ptr;
07607 while (xp->p_rts_flags & SENDING) { /* check while sending */
07608 xp = proc_addr(xp->p_sendto); /* get xp's destination */
07609 if (xp == caller_ptr) return(ELOCKED); /* deadlock if cyclic */
07610 }
DanieleC88
06-06-2009, 17:15
il punto è che non vedo nulla, parti di codice e solitamente '++' che incrementi alcun puntatore :confused:
xp = proc_addr(xp->p_sendto);
xp = proc_addr(xp->p_sendto);
credo di non aver capito :stordita:
faccio un pò di ordine
EXTERN struct proc *pproc_addr[NR_TASKS + NR_PROCS];
#define NR_TASKS 4
#define proc_addr(n) (pproc_addr + NR_TASKS)[(n)]
xp = proc_addr(xp->p_sendto);
come si trasfrorma quindi xp ?
Cioè, cosa gli viene assegnato ?
scusate ma ci sono arrivato dopo un pochino :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.