Home Forums Wiki Doc Install Extras Screenshots Source Code Projects Blog Users Groups Register
Glx-Dock / Cairo-Dock List of forums Technical discussions | Discussions techniques Exceptions pour les plugins ?
The latest stable release is the *3.4.0* : How to install it here.
Note: We just switched from BZR to Git on Github! (only to host the code and your future pull requests)
Technical discussions | Discussions techniques

Subjects Author Language Messages Last message
[Locked] Exceptions pour les plugins ?
parAdOxxx_ZeRo Français 15 parAdOxxx_ZeRo [Read]
13 June 2008 à 18:15

parAdOxxx_ZeRo, Sunday 01 June 2008 à 12:09


Subscription date : 14 January 2008
Messages : 1122
Dites, je pensais : c'est pas tiptop que si un plugin plante ca fasse tout planter...
Alors pourquoi ne pas introduire des exceptions au lancement des plugins ?
En C c'est possible moyennant un petit hack (http://www.cppfrance.com/codes/EXCEPTION-SIMULER-TRY-CATCH-THROW_40259.aspx)
En gtk je sais pas s'il y a un truc mieux.
Sinon il y a la solution de threader le lancement de chaque plugin mais ca risque d'etre plus dur à gérer...

Et puis tant qu'on y est pourquoi ne pas gérer les exceptions tout au long de l'execution des plugins...

Je vois ca comme ca :
si un plugin essaye de faire un NULL->quelquechose
on affiche : le plugin xxxx essaye d'accéder à une zone de mémoire nulle il est donc désactivé
et hop on est tranquille...

Vous en pensez quoi ?

nochka85, Sunday 01 June 2008 à 12:26


Subscription date : 29 November 2007
Messages : 7408
+1

C'est vrai qu'avec la fonction --maintenance , on arrive désormais à lancer notre thème en désactivant l'applet responsable du plantage ... mais ce n'est pas le top car il faut déjà trouver celle qui plante

.... Et puis l'autre GROS avantage de ta proposition, cela permettrait de voir les applets qui plantent en cours d'utilisation -> Actuellement, il m'arrive d'avoir le dock qui se ferme tout seul, mais vu que je ne lance pas systématiquement avec ddd .... Va trouver la cause !
Bref, si on voit qu'une applet en particulier se ferme, cela permet de mettre sur la voie

nostalgeek, Sunday 01 June 2008 à 12:58


Subscription date : 12 May 2008
Messages : 140
ouep par exemple l'applet switcher dans la rev 1064 qui seg fault le cairo

nochka85, Sunday 01 June 2008 à 13:16


Subscription date : 29 November 2007
Messages : 7408
Pas de problème avec switcher chez moi en 1064

nostalgeek, Sunday 01 June 2008 à 13:38


Subscription date : 12 May 2008
Messages : 140
ha?
chez moi c'est segmentation fault

fabounet, Monday 02 June 2008 à 14:06


Subscription date : 30 November 2007
Messages : 17118
je jète un oeil au hack
Edit : je comprends pas en quoi ça empêche un plug-in de planter, ni même de savoir lequel a planté et où.

parAdOxxx_ZeRo, Monday 02 June 2008 à 21:17


Subscription date : 14 January 2008
Messages : 1122
au temps pour moi je pensais que ca aurait pu gérer les segfault de maniere moins radicale...
L'idée reste quand meme la : ne pas planter le dock quand un plugin plante ca doit etre possible non ?
Sinon j'ai trouvé ca aussi, ya des trucs qui ont l'air bien sympa (enfin tu connais peut etre tout déjà) : http://julian-ibarz.developpez.com/tutorials/glib/erreurs/

fabounet, Tuesday 03 June 2008 à 03:41


Subscription date : 30 November 2007
Messages : 17118
ah oui les erreurs de la glib j'utilise, le problème c'est que là on parle d'erreurs de segmentation, donc des bugs, donc que tu récupères pas (sinon ce serait plus des bugs ), et malheureusement quand un programme fait un double free ou autre boulette, ça core !

parAdOxxx_ZeRo, Tuesday 03 June 2008 à 08:52


Subscription date : 14 January 2008
Messages : 1122
les languages évolué il les gere ca il me semble du moins ils plantent pas comme des sales il plantent avec classe...
si on thread tous les plugins si y'en a un qui tombe les autres sont pas (trop) touché si ?

fabounet, Tuesday 03 June 2008 à 12:48


Subscription date : 30 November 2007
Messages : 17118
peut-être en interceptant les signaux (sig_term et compagnie) on pourrait empêcher le dock de se fermer, mais je sais pas si c'est bien utile de laisser tourner l'appli avec des zones mémoires corrompues.
c'est une idée comme ça je suis même pas sûr que ça se fasse.

parAdOxxx_ZeRo, Wednesday 04 June 2008 à 14:22


Subscription date : 14 January 2008
Messages : 1122
disons que si le dock plante c'est mieux de le fermer (et de le relancer meme ca c'est classe...)
par contre si c'est un plugin qui est mal codé (je dis pas ca pour toi mais shortcut par exemple qui a une époque n'arretait pas de planter) je trouve ca mieux de killer le thread du plugin que tout killer, normalement si c'est avec sa propre zone mémoire qu'il fait de la merde ca risque de n'avoir aucune influence sur les autres...
Sinon en ce qui concerne l'interception des signaux il me semble que c'est ce que font nos potes de compiz :
/*
 *
 * Compiz crash handler plugin
 *
 * crashhandler.c
 *
 * Copyright : (C) 2006 by Dennis Kasprzyk
 * E-mail    : onestone@beryl-project.org
 *
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>

#include <compiz-core.h>

#include "crashhandler_options.h"

static CompDisplay *cDisplay;

static 
void
crash_handler 
(int sig)
{
    if (
sig == SIGSEGV || sig == SIGFPE || sig == SIGILL || sig == SIGABRT)
    {
    static 
int count 0;

    if (++
count 1)
        exit (
1);

    
// backtrace
    
char cmd[1024];

    
snprintf (cmd1024
          
"echo -e \"set prompt\nthread apply all bt full\n"
                "echo \\\\\\n\necho \\\\\\n\nbt\nquit\" > /tmp/gdb.tmp;"
          "gdb -q %s %i < /tmp/gdb.tmp | "
          "grep -v \"No symbol table\" | "
          "tee %s/compiz_crash-%i.out; rm -f /tmp/gdb.tmp; "
          "echo \"\n[CRASH_HANDLER]: "
          "\\\"%s/compiz_crash-%i.out\\\" created!\n\""
,
         
programNamegetpid (), crashhandlerGetDirectory (cDisplay),
         
getpid (), crashhandlerGetDirectory (cDisplay), getpid () );

    
system (cmd);

    if (
crashhandlerGetStartWm (cDisplay) )
    {
        if (
fork () == 0)
        {
        
setsid ();
        
putenv (cDisplay->displayString);
        
execl ("/bin/sh""/bin/sh""-c",
               
crashhandlerGetWmCmd (cDisplay), NULL);
        exit (
0);
        }
    }

    exit (
1);
    }
}

static 
void
crashhandlerDisplayOptionChanged 
(CompDisplay                *d,
                  
CompOption                 *opt,
                  
CrashhandlerDisplayOptions num)
{
    switch (
num)
    {

    case 
CrashhandlerDisplayOptionEnabled:
    if (
crashhandlerGetEnabled (d) )
    {
        
// enable crash handler
        
signal (SIGSEGVcrash_handler);
        
signal (SIGFPEcrash_handler);
        
signal (SIGILLcrash_handler);
        
signal (SIGABRTcrash_handler);
    }
    else
    {
        
// disable crash handler
        
signal (SIGSEGVSIG_DFL);
        
signal (SIGFPESIG_DFL);
        
signal (SIGILLSIG_DFL);
        
signal (SIGABRTSIG_DFL);
    }

    break;

    default:
    break;
    }
}

static 
Bool
crashhandlerInitDisplay 
(CompPlugin  *p,
             
CompDisplay *d)
{
    
cDisplay d;

    if (!
checkPluginABI ("core"CORE_ABIVERSION))
    return 
FALSE;

    if (
crashhandlerGetEnabled (d) )
    {
    
// segmentation fault
    
signal (SIGSEGVcrash_handler);
    
// floating point exception
    
signal (SIGFPEcrash_handler);
    
// illegal instruction
    
signal (SIGILLcrash_handler);
    
// abort
    
signal (SIGABRTcrash_handler);
    }

    
crashhandlerSetEnabledNotify (dcrashhandlerDisplayOptionChanged);

    return 
TRUE;
}

static 
void
crashhandlerFiniDisplay 
(CompPlugin  *p,
             
CompDisplay *d)
{
    
signal (SIGSEGVSIG_DFL);
    
signal (SIGFPESIG_DFL);
    
signal (SIGILLSIG_DFL);
    
signal (SIGABRTSIG_DFL);
}

static 
CompBool
crashhandlerInitObject 
(CompPlugin *p,
            
CompObject *o)
{
    static 
InitPluginObjectProc dispTab[] = {
    (
InitPluginObjectProc0/* InitCore */
    
(InitPluginObjectProccrashhandlerInitDisplay
    
};

    
RETURN_DISPATCH (odispTabARRAY_SIZE (dispTab), TRUE, (po));
}

static 
void
crashhandlerFiniObject 
(CompPlugin *p,
            
CompObject *o)
{
    static 
FiniPluginObjectProc dispTab[] = {
    (
FiniPluginObjectProc0/* FiniCore */
    
(FiniPluginObjectProccrashhandlerFiniDisplay
    
};

    
DISPATCH (odispTabARRAY_SIZE (dispTab), (po));
}


CompPluginVTable crashhandlerVTable = {
    
"crashhandler",
    
0,
    
0,
    
0,
    
crashhandlerInitObject,
    
crashhandlerFiniObject,
    
0,
    
0
};

CompPluginVTable *
getCompPluginInfo (void)
{
    return &
crashhandlerVTable;
}


fabounet, Wednesday 04 June 2008 à 17:45


Subscription date : 30 November 2007
Messages : 17118
ah ouais exact
au 1er sigsegv il chope les backtraces et relance le WM de départ, si c'est le 2ème sigsegv il quitte brutalement.
visiblement c'est possible de se forker soi-même et de quitter, donc en fait de se relancer, je savais pas.
à tester !

Guest, Sunday 08 June 2008 à 11:24

le fork, tien sa me rapelle les forks bombs en shell sur un pIII

:(){ :|:& };:


(attention: ce code shell fera freezer le systeme reboot obligatoire après!)

fabounet, Friday 13 June 2008 à 12:26


Subscription date : 30 November 2007
Messages : 17118
bon j'ai fai tun truc qui permet de relancer le dock automatiquement en cas de plantage
par contre on ne sait pas qui a fait planté, donc pas de désactivation automatique de plug-in.
en acs de plantage pendant le chargement, le mode maintenance est activé, ce qui permet d'éviter les plantages/relancement en boucle.

ChAnGFu, Friday 13 June 2008 à 13:54


Subscription date : 17 January 2008
Messages : 1526
Excellent!

parAdOxxx_ZeRo, Friday 13 June 2008 à 18:15


Subscription date : 14 January 2008
Messages : 1122
cool !!
Mon intervention limitée n'aura pas servie à rien

Technical discussions | Discussions techniques

Subjects Author Language Messages Last message
[Locked] Exceptions pour les plugins ?
parAdOxxx_ZeRo Français 15 parAdOxxx_ZeRo [Read]
13 June 2008 à 18:15


Glx-Dock / Cairo-Dock List of forums Technical discussions | Discussions techniques Exceptions pour les plugins ? Top

Online users :

Powered by ElementSpeak © 2007 Adrien Pilleboue, 2009-2013 Matthieu Baerts.
Dock based on CSS Dock Menu (Ndesign) with jQuery. Icons by zgegball
Cairo-Dock is a free software under GNU-GPL3 licence. First stable version created by Fabounet.
Many thanks to TuxFamily for the web Hosting and Mav for the domain name.