Fork me on GitHub

Freeze de Skype sur Ubuntu 64bits

Quand tu démarres ça freeze

Ce matin, j'en avais carrément marre de devoir attendre 2-3 minutes que skype plante une première fois, en freezant complètement ma machine, afin de pouvoir ensuite le relancer et l'utiliser.

J'ai donc décidé d'investiguer un peu afin de pouvoir à nouveau l'utiliser sous Ubuntu.

Intercepter les requêtes pthread_create()

Au démarrage skype a la mauvaise habitude de lancer tout un tas de threads FIFO au lancement (1 par chat en cours).

La première solution est de supprimer l'utilisateur du groupe admin.

La seconde est d'intercepter les appels à pthread_create() pour transformer la politique des threads de FIFO à Round-Robin.

Creer le décorateur de pthread_create

Créez le fichier skype.c suivant

#define _GNU_SOURCE 1
#include <dlfcn.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>

int (* orig_pthread_create) (pthread_t *thread,
       const pthread_attr_t *attr,
       void *(*start_routine)(void*), void *arg) = NULL;

static void change_sched_policy (pthread_attr_t *attr) {

   int policy;

   if (attr == NULL) return;
   pthread_attr_getschedpolicy (attr, &policy);
   if (policy == SCHED_FIFO) {
      printf ("### SCHED_FIFO policy changed to SCHED_RR\n");
      pthread_attr_setschedpolicy (attr, SCHED_RR);
   }
}

int pthread_create(pthread_t *thread,
       const pthread_attr_t *attr,
       void *(*start_routine)(void*), void *arg) {

   pthread_attr_t new_attr;

   if (orig_pthread_create == NULL) {
      orig_pthread_create = dlsym (RTLD_NEXT, "pthread_create");
   }

   change_sched_policy (attr);

   return orig_pthread_create (
      thread, attr, start_routine, arg
   );

}

Compiler

Le compiler

gcc -shared -fPIC -o libskype.so skype.c

Installer

L'installer dans /usr/local/lib/

sudo cp libskype.so /usr/local/lib/

Créer le lanceur

Ensuite vous pouvez créer le fichier /usr/local/bin/skype-launcher

#!/bin/bash
LD_LIBRARY_PATH=/usr/local/lib/libskype.so /usr/bin/skype

Vous devez ensuite le rendre exécutable

sudo chmod +x /usr/local/bin/skype-launcher

Maintenant vous devez pouvoir lancer skype sans problème en tapant la commande

$ /usr/local/bin/skype-launcher

Modifier le bouton skype

Vous pouvez modifier le fichier /usr/share/applications/skype.desktop

En remplaçant la ligne

Exec=skype

par

Exec=/usr/local/bin/skype-launcher

Supprimer le fichier de cache

Si vous utilisez Skype sur la même machine depuis un moment, vous pouvez aussi supprimer le cache.

Attention, il vous faudra ensuite entrer à nouveau votre mot de passe.

$ mv ~/.Skype/shared.xml ~/.Skype/shared~.xml

En cas de problème vous pouvez faire l'opération inverse :

$ mv ~/.Skype/shared~.xml ~/.Skype/shared.xml

Conclusion

J'espère que ces quelques solutions pourront vous être utile.

Commencez par faire la première puis faites la deuxième si nécessaire.

Avec tout ça votre Skype va repartir comme lors de sa première jeunesse.

Comments !

blogroll

social