2010-06-09 14 views
1

i écrivent les lecteurs et les écrivains où le noyau doivent synchroniser entre eux et écrivain de bloc qui lisent déjà un massagenoyau se pile au signal

quand je suis dans la file d'attente je reçois le signal si je fais la mise en jachère

while (i_Allready_Read(myf) == ALLREADY_READ || isExistWriter == false) 
//while (!(i_Allready_Read(aliveProc,current->pid))) 
{ 
    int i, is_sig = 0; 
    printk(KERN_INFO "\n\n*****entered set in read ******\n\n"); 
    if (i_Allready_Read(myf) == ALLREADY_READ) 
     wait_event_interruptible (readWaitQ1, !i_Allready_Read(myf)); 
    else 
     wait_event_interruptible (readWaitQ1, isExistWriter); 

    //printk(KERN_INFO "Read Wakeup %d\n",current->pid); 

    for (i = 0; i < _NSIG_WORDS && !is_sig; i++) 
    { 
     is_sig = current->pending.signal.sig[i] & ~current->blocked.sig[i]; 
    } 

    if (is_sig) 
    { 
     handledClose(myf); 
     module_put (THIS_MODULE); 
     return -EINTR; 
    } 
    } 
    return 0;//success 

}

inline void handledClose(struct file *myf)//v 

{ /* * si nous fermons l'écrivain autre écrivain * w ould pouvoir entrer à permissiones */

if (myf == writerpid) 
{ 
    isExistWriter = DOESNT_EXIST; 
    //printk(KERN_INFO "procfs_close : this is pid that just closed %d \n", writerpid); 
} 
/* 
*else its a reader so our numofreaders 
*need to decremented 
*/ 
else 
{ 
    removeFromArr(myf); 
    numOfReaders--; 
} 

}

et ma proximité ne fait rien ...

qu'est-ce que je fait de mal?

+0

ce code était apparemment apparemment sans raison, je peux comprendre qu'il a commencé à travailler :) – yoavstr

Répondre

1

Où éveillez-vous la file d'attente?

Vous devriez appeler le wake_up(readWaitQ1); quelque part. Possible après avoir défini isExistWriter sur true.