Auxiliar #7 Implementación de Mensajes
Pablo Jaramillo V. 24 Abr 202324/04/23 a las 20:15 hrs.2023-04-24 20:15:24
El auxiliar #7 será donde siempre. Veremos la herramienta de mensajes implementada con nThreads, con un ejemplo de uso y la implementación.
Material:
Como siempre se tiene disponible el video del año pasado. HAY UN ERROR EN LA GRABACIÓN. Lea más adelante para la corrección.
Durante la clase auxiliar se detectó un error en el código de nReceive. Actualicé el .zip de arriba con la solución correcta.
El error consta de la linea donde se asigna *msg:
nThread sender_th = nth_getFront(this_th->sendQueue);
*pth = sender_th ? sender_th : NULL;
void *msg = sender_th->msg;
Esto genera un SEGFAULT cuando nReceive despierta por caducación de su timeout, cuando esto sucede la queue de la cual se obtiene sender_th va a estar vacia, por lo que sender_th será NULL. Esto hace la condición in-line de la asignación de *pth redundante y hace caso omiso a que sucede en la asignación de *msg, se haría algo similar a *msg = (*NULL)->msg, lo que no es valido.
Una corrección valida sería la siguiente, donde se revisa si sendTask es NULL y si lo es entonces el menaje es NULL, y si no lo es entonces es el mensaje.
nThread sendTask= nth_getFront(thisTh->sendQueue);
if (pth!=NULL)
*pth= sendTask;
void *msg= sendTask==NULL ? NULL : sendTask->send.msg;
Material:
Como siempre se tiene disponible el video del año pasado. HAY UN ERROR EN LA GRABACIÓN. Lea más adelante para la corrección.
Durante la clase auxiliar se detectó un error en el código de nReceive. Actualicé el .zip de arriba con la solución correcta.
El error consta de la linea donde se asigna *msg:
nThread sender_th = nth_getFront(this_th->sendQueue);
*pth = sender_th ? sender_th : NULL;
void *msg = sender_th->msg;
Esto genera un SEGFAULT cuando nReceive despierta por caducación de su timeout, cuando esto sucede la queue de la cual se obtiene sender_th va a estar vacia, por lo que sender_th será NULL. Esto hace la condición in-line de la asignación de *pth redundante y hace caso omiso a que sucede en la asignación de *msg, se haría algo similar a *msg = (*NULL)->msg, lo que no es valido.
Una corrección valida sería la siguiente, donde se revisa si sendTask es NULL y si lo es entonces el menaje es NULL, y si no lo es entonces es el mensaje.
nThread sendTask= nth_getFront(thisTh->sendQueue);
if (pth!=NULL)
*pth= sendTask;
void *msg= sendTask==NULL ? NULL : sendTask->send.msg;
Categoría | Auxiliares |
---|---|
Última Modificación | 27 Abr 202327/04/23 a las 17:39 hrs.2023-04-27 17:39:27 |
Vistas Únicas | 66 |
Compartir | |
Comentarios |
|