[Buoh-dev] Parche para evitar crash
- From: esteban at steve-0.com (Esteban Sánchez)
- Subject: [Buoh-dev] Parche para evitar crash
- Date: Tue Aug 15 09:42:44 2006
El jue, 04-08-2005 a las 18:34 +0200, Carlos Garcia Campos escribi?:
> El jue, 04-08-2005 a las 18:26 +0200, Esteban S?nchez escribi?:
> > El jue, 04-08-2005 a las 18:19 +0200, Carlos Garcia Campos escribi?:
> >
> > <snip/>
> >
> > > >
> > > > La soluci?n es poco ortodoxa, pero parece que funciona.
> > > >
> > > >
> > > > ?Podeis comprobarlo antes de que haga commit? Por supuesto, cualquier
> > > > sugerencia es bien admitida :)
> > >
> > > Te comento:
> > >
> > > if (loader->thread_mutex) {
> > > + if (!g_mutex_trylock (loader->thread_mutex)) {
> > > + g_mutex_unlock (loader->thread_mutex);
> > > + } else {
> > > + g_mutex_unlock (loader->thread_mutex);
> > > + }
> > > g_mutex_free (loader->thread_mutex);
> > > loader->thread_mutex = NULL;
> > > }
> > >
> > > El thread_mutex tiene como ?nico objetivo evitar el que pueda haber mas
> > > de un hilo al mismo tiempo. Efectivamente, si tratas de coger el lock y
> > > lo tiene otro hilo es porque no ha terminado. g_mutex_trylock devuelve
> > > FALSE si el lock lo tiene otro hilo, en ese caso estas quitando tu el
> > > lock, en caso contrario devuelve TRUE y libera el lock y despu?s lo
> > > vuelves a liberar tu. Si te fijas las dos ramas del if son exactamente
> > > iguales!!! No parece muy l?gico.
> >
> > Por eso digo que es poco ortodoxo, evidentemente las dos ramas hacen lo
> > mismo, pero lo hice as? porque no se puede saber si el mutex se ha
> > cerrado si no es con trylock. Si hac?a unlock sin que se hubiese llamado
> > previamente a lock en el caso 3a petaba.
>
> de todas formas si vas a hacer lo mismo, no es mas l?gico hacer
> simplemente:
>
> g_mutex_trylock (loader->thread_mutex);
> g_mutex_unlock (loader->thread_mutex);
>
> Si te devuelva lo que te devuelva haces el unlock. Anyway, creo que es
> mejor reescribir el parche en el sentido que te comentaba antes.
if (loader->thread_mutex) {
+ switch (loader->status) {
+ case LOADER_STATE_RUNNING:
+ buoh_comic_loader_stop (loader);
+ /* Do not break! */
+ case LOADER_STATE_STOPPING:
+ g_mutex_lock (loader->thread_mutex);
+ g_mutex_unlock (loader->thread_mutex);
+ break;;
+ default:
+ break;;
+ }
g_mutex_free (loader->thread_mutex);
loader->thread_mutex = NULL;
}
Este es el c?digo que me ha salido
La raz?n de usar un switch es que personalmente me parece m?s legible
para los enumerados y adem?s as? se evita duplicar el c?digo de lock y
unlock del mutex que sirve para esperar a que acabe el hilo y es
necesario en ambos casos.
?Mejor as?? :D
Saludos
--
Esteban S?nchez
esteban steve-0 com
http://steve-o.org
http://subanales.com/
------------------------------------------------
PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xB6E0F8AF
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://forge.novell.com/pipermail/buoh-dev/attachments/20050804/ffbb08ff/attachment.pgp
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]