Yes! This absolutely makes Youtube videos watchable for me (on a
Thinkpad T520). There still is occassional stuttering, but _far_ less
disruptive than before. Another usecase where I see improvements is
reloading a resource-heavy web page while switching tabs. Before
applying the patch, this caused the browser to hang for several seconds.
Now it doesn't.

The patch reads fine to, although I'm not an rthread expert. It doesn't
seem to break anything on my system either.

Thanks,
natano

On Fri, Jan 22, 2016 at 10:46:39PM +0100, Mark Kettenis wrote:
> Firefox makes a lot of concurrent malloc(3) calls.  The locking to
> make malloc(3) thread-safe is a bit...suboptimal.  This diff makes
> things better by using a mutex instead of spinlock.  If you're running
> Firefox you want to try it; it makes video watchable on some machines.
> If you're not running Firefox you want to try it; to make sure it
> doesn't break things.
> 
> Enjoy,
> 
> Mark
> 
> 
> Index: rthread.h
> ===================================================================
> RCS file: /cvs/src/lib/librthread/rthread.h,v
> retrieving revision 1.54
> diff -u -p -r1.54 rthread.h
> --- rthread.h 10 Nov 2015 04:30:59 -0000      1.54
> +++ rthread.h 22 Jan 2016 21:08:11 -0000
> @@ -223,6 +223,7 @@ void      _rthread_debug_init(void);
>  #ifndef NO_PIC
>  void _rthread_dl_lock(int what);
>  #endif
> +void _thread_malloc_reinit(void);
>  
>  /* rthread_cancel.c */
>  void _enter_cancel(pthread_t);
> Index: rthread_fork.c
> ===================================================================
> RCS file: /cvs/src/lib/librthread/rthread_fork.c,v
> retrieving revision 1.14
> diff -u -p -r1.14 rthread_fork.c
> --- rthread_fork.c    18 Oct 2015 08:02:58 -0000      1.14
> +++ rthread_fork.c    22 Jan 2016 21:08:11 -0000
> @@ -82,7 +82,10 @@ _dofork(int is_vfork)
>       newid = sys_fork();
>  
>       _thread_arc4_unlock();
> -     _thread_malloc_unlock();
> +     if (newid == 0)
> +             _thread_malloc_reinit();
> +     else
> +             _thread_malloc_unlock();
>       _thread_atexit_unlock();
>  
>       if (newid == 0) {
> Index: rthread_libc.c
> ===================================================================
> RCS file: /cvs/src/lib/librthread/rthread_libc.c,v
> retrieving revision 1.12
> diff -u -p -r1.12 rthread_libc.c
> --- rthread_libc.c    7 Apr 2015 01:27:07 -0000       1.12
> +++ rthread_libc.c    22 Jan 2016 21:08:11 -0000
> @@ -152,18 +152,35 @@ _thread_mutex_destroy(void **mutex)
>  /*
>   * the malloc lock
>   */
> -static struct _spinlock malloc_lock = _SPINLOCK_UNLOCKED;
> +static struct pthread_mutex malloc_lock = {
> +     _SPINLOCK_UNLOCKED,
> +     TAILQ_HEAD_INITIALIZER(malloc_lock.lockers),
> +     PTHREAD_MUTEX_DEFAULT,
> +     NULL,
> +     0,
> +     -1
> +};
> +static pthread_mutex_t malloc_mutex = &malloc_lock;
>  
>  void
>  _thread_malloc_lock(void)
>  {
> -     _spinlock(&malloc_lock);
> +     pthread_mutex_lock(&malloc_mutex);
>  }
>  
>  void
>  _thread_malloc_unlock(void)
>  {
> -     _spinunlock(&malloc_lock);
> +     pthread_mutex_unlock(&malloc_mutex);
> +}
> +
> +void
> +_thread_malloc_reinit(void)
> +{
> +     malloc_lock.lock = _SPINLOCK_UNLOCKED_ASSIGN;
> +     TAILQ_INIT(&malloc_lock.lockers);
> +     malloc_lock.owner = NULL;
> +     malloc_lock.count = 0;
>  }
>  
>  /*
> 

Reply via email to