NetBSD Problem Report #51966

From www@NetBSD.org  Sun Feb 12 20:38:44 2017
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(Client CN "mail.netbsd.org", Issuer "Postmaster NetBSD.org" (verified OK))
	by mollari.NetBSD.org (Postfix) with ESMTPS id 351C77A26C
	for <gnats-bugs@gnats.NetBSD.org>; Sun, 12 Feb 2017 20:38:44 +0000 (UTC)
Message-Id: <20170212203842.C44E37A296@mollari.NetBSD.org>
Date: Sun, 12 Feb 2017 20:38:42 +0000 (UTC)
From: roy@roypittman.com
Reply-To: roy@roypittman.com
To: gnats-bugs@NetBSD.org
Subject: firefox crashes frequently
X-Send-Pr-Version: www-1.0

>Number:         51966
>Category:       pkg
>Synopsis:       firefox crashes frequently
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    ryoon
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Feb 12 20:40:00 +0000 2017
>Last-Modified:  Thu Jun 29 08:10:00 +0000 2017
>Originator:     Roy Pittman
>Release:        NetBSD/amd64-7.0_STABLE, pkgsrc-2016Q4
>Organization:
>Environment:
NetBSD ratliff 7.0_STABLE NetBSD 7.0_STABLE (RATLIFF) #13: Sun Dec 25 16:29:39 MST 2016  roy@ratliff:/d0/build/netbsd-7/obj/amd64/sys/arch/amd64/compile/RATLIFF amd64
>Description:
Two days ago I removed firefox and reinstalled it. This was done with my /etc/mk.conf file which includes these lines:
PKG_DEFAULT_OPTIONS+=pam ssl -cups -pulseaudio -alsa
PKG_OPTIONS.firefox+=oss  debug
.if "${PKGPATH}" == "www/firefox"
  CFLAGS+=      -ggdb
  CXXFLAGS+=    -ggdb
  INSTALL_UNSTRIPPED=   yes
.endif

I rebuilt my OS yesterday with "MKDEBUG=yes" and "MKDEBUG_LIB=yes" and
installed the resulting "debug.tgz" and "xdebug.tgz" sets.

I then started firefox 50.1.0 in a terminal emulator.  Here is the output:
[10340] WARNING: Retargeting delivery to same thread: file /d0/build/pkgsrc/www/firefox/work/firefox-50.1.0/netwerk/protocol/http/nsHttpChannel.cpp, line 6749
Assertion failure: mSearchesOngoing > 0 && mSearches.Contains(aSearch), at /d0/build/pkgsrc/www/firefox/work/firefox-50.1.0/toolkit/components/autocomplete/nsAutoCompleteController.cpp:818
#01: XRE_TelemetryAccumulate[/usr/pkg/lib/firefox/libxul.so +0x38b040c]
#02: XRE_TelemetryAccumulate[/usr/pkg/lib/firefox/libxul.so +0x38b8bdf]
#03: NS_InvokeByIndex[/usr/pkg/lib/firefox/libxul.so +0xbfa325]
#04: std::pair<unsigned long const, float>::pair<unsigned long const&, 0ul>(std::tuple<unsigned long const&>&, std::tuple<>&, std::_Index_tuple<0ul>, std::_Index_tuple<>)[/usr/pkg/lib/firefox/libxul.so +0x477e42f]
#05: std::pair<unsigned long const, float>::pair<unsigned long const&, 0ul>(std::tuple<unsigned long const&>&, std::tuple<>&, std::_Index_tuple<0ul>, std::_Index_tuple<>)[/usr/pkg/lib/firefox/libxul.so +0x477c0b8]
#06: XRE_XPCShellMain[/usr/pkg/lib/firefox/libxul.so +0x1599e4d]
#07: XRE_XPCShellMain[/usr/pkg/lib/firefox/libxul.so +0x15a2679]
#08: std::__atomic_base<PRLock*>::store(PRLock*, std::memory_order)[/usr/pkg/lib/firefox/libxul.so +0x5b4a926]
#09: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc2e1b]
#10: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc3138]
#11: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc3162]
#12: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dd040e]
#13: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc2aa3]
#14: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc2ee4]
#15: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc3138]
#16: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc31c9]
#17: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3ca5feb]
#18: std::__atomic_base<PRLock*>::store(PRLock*, std::memory_order)[/usr/pkg/lib/firefox/libxul.so +0x5b4a926]
#19: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc2e1b]
#20: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc3138]
#21: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc31c9]
#22: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3d67579]
#23: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3d289e9]
#24: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3d2cead]
#25: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3d2e149]
#26: std::__atomic_base<PRLock*>::store(PRLock*, std::memory_order)[/usr/pkg/lib/firefox/libxul.so +0x5b4a926]
#27: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc2d1f]
#28: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc3138]
#29: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3dc3162]
#30: mozilla::scache::PathifyURI(nsIURI*, nsACString_internal&)[/usr/pkg/lib/firefox/libxul.so +0x3a883dd]
#31: ??? (???:???)
Memory fault (core dumped) 
1044 [roy@ratliff:/d2/home/roy]$ date
Sun Feb 12 06:10:11 MST 2017
1045 [roy@ratliff:/d2/home/roy]$ gdb firefox firefox.core
<snip>
[New process 2]
Core was generated by `firefox'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007f7ff690e6fa in ?? ()
(gdb) bt
#0  0x00007f7ff690e6fa in ?? ()
#1  0x00007f7ff0cfd23b in ?? ()
#2  0x00007f7fffff7088 in ?? ()
#3  0x00007f7fffff7170 in ?? ()
#4  0x00007f7fffff70f0 in ?? ()
#5  0x0000000bffffa028 in ?? ()
#6  0x0000000000000400 in ?? ()
#7  0x0000000000000000 in ?? ()
(gdb) quit
1046 [roy@ratliff:/d2/home/roy]$ 

=====gdb bt from a previous crash 2017 02 10====

Core was generated by `firefox'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  0x00007f7ff690e6fa in ?? ()
> (gdb) bt
> #0  0x00007f7ff690e6fa in ?? ()
> #1  0x00007f7ff0cfd23b in ?? ()
> #2  0x00007f7fa54fe0f8 in ?? ()
> #3  0x00007f7fa54fe1e0 in ?? ()
> #4  0x00007f7fa54fe160 in ?? ()
> #5  0x0000000ba54fffc8 in ?? ()
> #6  0x0000000000000400 in ?? ()
> #7  0x0000000000000000 in ?? ()
> (gdb)

====I have other backtraces that are identical.=====

>How-To-Repeat:
When I leave firefox 50.1 running, started either from a terminal or from the gui, the crash will eventually recur.
It seems to happen more often when I have several firefox windows open. Sorry I can't be more specific.
>Fix:
Not known to me.

>Release-Note:

>Audit-Trail:
From: aran@100acres.us
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: pkg/51966
Date: Fri, 23 Jun 2017 14:33:02 -0700 (PDT)

 ----Next_Part(Fri_Jun_23_14_33_02_2017_562)--
 Content-Type: Text/Plain; charset=us-ascii
 Content-Transfer-Encoding: 7bit

 The problem if Firefox's CrossProcessSemaphore.  On Linux, sem_t is a opaque
 structure.  On NetBSD, it is opaque pointer.  The sem_t is shared between two
 processes.  This, of course, does not work on NetBSD.

 I change the class mozilla::CrossProcessSemaphore to use pthread primitives to
 implement semaphore logic.  This works on my system:

 $uname -a
 NetBSD owl 8.99.1 NetBSD 8.99.1 (GENERIC) #2: Mon Jun 19 21:52:11 PDT 2017  aran@owl:/home/NetBSD/build/sys/arch/amd64/compile/GENERIC amd64

 Aran

 ----Next_Part(Fri_Jun_23_14_33_02_2017_562)--
 Content-Type: Text/Plain; charset=us-ascii
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="patch-ipc_glue_CrossProcessSemaphore.h"

 $NetBSD$

 --- ipc/glue/CrossProcessSemaphore.h.orig	2017-06-05 20:45:20.000000000 +0000
 +++ ipc/glue/CrossProcessSemaphore.h
 @@ -91,7 +91,9 @@ private:
    HANDLE mSemaphore;
  #elif !defined(OS_MACOSX)
    RefPtr<mozilla::ipc::SharedMemoryBasic> mSharedBuffer;
 -  sem_t* mSemaphore;
 +  pthread_mutex_t*          mMutex;
 +  pthread_cond_t*           mNotZero;
 +  uint32_t*                 mValue;
    mozilla::Atomic<int32_t>* mRefCount;
  #endif
  };

 ----Next_Part(Fri_Jun_23_14_33_02_2017_562)--
 Content-Type: Text/Plain; charset=us-ascii
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="patch-ipc_glue_CrossProcessSemaphore__posix.cpp"

 $NetBSD$

 --- ipc/glue/CrossProcessSemaphore_posix.cpp.orig	2017-06-05 20:45:20.000000000 +0000
 +++ ipc/glue/CrossProcessSemaphore_posix.cpp
 @@ -9,15 +9,20 @@
  #include "nsDebug.h"
  #include "nsISupportsImpl.h"
  #include <errno.h>
 +#include <iostream>
 +#include <unistd.h>
 +#include <limits>

  static const uint64_t kNsPerMs = 1000000;
  static const uint64_t kNsPerSec = 1000000000;

  namespace {

 -
  struct SemaphoreData {
 -  sem_t mSemaphore;
 +  pthread_mutex_t mMutex;
 +  pthread_cond_t  mNotZero;
 +  uint32_t        mValue;  
 +  
    mozilla::Atomic<int32_t> mRefCount;
    uint32_t mInitialValue;
  };
 @@ -44,15 +49,21 @@ CrossProcessSemaphore::Create(const char
      return nullptr;
    }

 -  if (sem_init(&data->mSemaphore, 1, aInitialValue)) {
 +  data->mValue = aInitialValue;
 +  if (pthread_mutex_init(&data->mMutex, NULL) ||
 +      pthread_cond_init(&data->mNotZero, NULL) ) {
      return nullptr;
    }

    CrossProcessSemaphore* sem = new CrossProcessSemaphore;
    sem->mSharedBuffer = sharedBuffer;
 -  sem->mSemaphore = &data->mSemaphore;
 -  sem->mRefCount = &data->mRefCount;
 -  *sem->mRefCount = 1;
 +  sem->mMutex        = &data->mMutex;  
 +  sem->mNotZero      = &data->mNotZero;  
 +  sem->mValue        = &data->mValue;
 +  sem->mRefCount     = &data->mRefCount;
 +  *sem->mRefCount    = 1;
 +
 +//  aran_log(*sem->mSemaphore);

    data->mInitialValue = aInitialValue;

 @@ -77,16 +88,10 @@ CrossProcessSemaphore::Create(CrossProce
    }

    SemaphoreData* data = static_cast<SemaphoreData*>(sharedBuffer->memory());
 -
 -  if (!data) {
 -    return nullptr;
 -  }
 -
 -  int32_t oldCount = data->mRefCount++;
 +  int oldCount = data->mRefCount++;
    if (oldCount == 0) {
 -    // The other side has already let go of their CrossProcessSemaphore, so now
 -    // mSemaphore is garbage. We need to re-initialize it.
 -    if (sem_init(&data->mSemaphore, 1, data->mInitialValue)) {
 +    if (pthread_mutex_init(&data->mMutex, NULL) ||
 +        pthread_cond_init(&data->mNotZero, NULL) ) {
        data->mRefCount--;
        return nullptr;
      }
 @@ -94,14 +99,18 @@ CrossProcessSemaphore::Create(CrossProce

    CrossProcessSemaphore* sem = new CrossProcessSemaphore;
    sem->mSharedBuffer = sharedBuffer;
 -  sem->mSemaphore = &data->mSemaphore;
 +  sem->mMutex        = &data->mMutex;  
 +  sem->mNotZero      = &data->mNotZero;  
 +  sem->mValue        = &data->mValue;
    sem->mRefCount = &data->mRefCount;
    return sem;
  }


  CrossProcessSemaphore::CrossProcessSemaphore()
 -  : mSemaphore(nullptr)
 +  : mMutex (nullptr)
 +  , mNotZero (nullptr)
 +  , mValue (nullptr)
    , mRefCount(nullptr)
  {
    MOZ_COUNT_CTOR(CrossProcessSemaphore);
 @@ -113,35 +122,54 @@ CrossProcessSemaphore::~CrossProcessSema

    if (oldCount == 0) {
      // Nothing can be done if the destroy fails so ignore return code.
 -    Unused << sem_destroy(mSemaphore);
 +    (void)pthread_cond_destroy(mNotZero);
 +    (void)pthread_mutex_destroy(mMutex);
    }

    MOZ_COUNT_DTOR(CrossProcessSemaphore);
  }

 +static struct timespec
 +makeAbsTime(const Maybe<TimeDuration>& aWaitTime) {
 +  struct timespec ts;
 +  if (aWaitTime.isSome()) {
 +    clock_gettime(CLOCK_REALTIME, &ts);
 +    ts.tv_nsec += (kNsPerMs * aWaitTime->ToMilliseconds());
 +    ts.tv_sec += ts.tv_nsec / kNsPerSec;
 +    ts.tv_nsec %= kNsPerSec;
 +  }
 +  else {
 +    ts.tv_sec = std::numeric_limits<time_t>::max();
 +    ts.tv_nsec = 0;
 +  }
 +  return ts;
 +}
 +
  bool
  CrossProcessSemaphore::Wait(const Maybe<TimeDuration>& aWaitTime)
  {
    MOZ_ASSERT(*mRefCount > 0, "Attempting to wait on a semaphore with zero ref count");
    int ret;
 -  if (aWaitTime.isSome()) {
 -    struct timespec ts;
 -    if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
 -      return false;
 -    }
 -
 -    ts.tv_nsec += (kNsPerMs * aWaitTime->ToMilliseconds());
 -    ts.tv_sec += ts.tv_nsec / kNsPerSec;
 -    ts.tv_nsec %= kNsPerSec;
 +  struct timespec ts = makeAbsTime(aWaitTime);

 -    while ((ret = sem_timedwait(mSemaphore, &ts)) == -1 && errno == EINTR) {
 -      continue;
 +  ret = pthread_mutex_timedlock(mMutex, &ts);
 +  while (ret == -1 && errno == EINTR) {
 +    ret = pthread_mutex_timedlock(mMutex, &ts);
 +  }
 +  
 +  if(ret == 0) {
 +    while(ret == 0 && mValue == 0) {
 +      ret = pthread_cond_timedwait(mNotZero, mMutex, &ts);
 +      while(ret == -1 && errno == EINTR) {
 +        ret = pthread_cond_timedwait(mNotZero, mMutex, &ts);
 +      }
      }
 -  } else {
 -    while ((ret = sem_wait(mSemaphore)) == -1 && errno == EINTR) {
 -      continue;
 +    if(ret == 0) {
 +      --(*mValue);
      }
 +    pthread_mutex_unlock(mMutex);
    }
 +  
    return ret == 0;
  }

 @@ -149,7 +177,16 @@ void
  CrossProcessSemaphore::Signal()
  {
    MOZ_ASSERT(*mRefCount > 0, "Attempting to signal a semaphore with zero ref count");
 -  sem_post(mSemaphore);
 +  int ret;
 +  ret = pthread_mutex_lock(mMutex);
 +  while(ret == -1 && errno == EINTR) {
 +    ret = pthread_mutex_lock(mMutex);
 +  }
 +  if(ret == 0) {
 +    ++(*mValue);
 +    pthread_cond_signal(mNotZero);
 +    pthread_mutex_unlock(mMutex);
 +  }
  }

  CrossProcessSemaphoreHandle
 @@ -160,7 +197,6 @@ CrossProcessSemaphore::ShareToProcess(ba
    if (mSharedBuffer && !mSharedBuffer->ShareToProcess(aTargetPid, &result)) {
      MOZ_CRASH();
    }
 -
    return result;
  }


 ----Next_Part(Fri_Jun_23_14_33_02_2017_562)----

Responsible-Changed-From-To: pkg-manager->ryoon
Responsible-Changed-By: wiz@NetBSD.org
Responsible-Changed-When: Fri, 23 Jun 2017 22:23:41 +0000
Responsible-Changed-Why:
Over to maintainer
(includes patch!)


From: Kamil Rytarowski <n54@gmx.com>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: Re: pkg/51966 (firefox crashes frequently)
Date: Sun, 25 Jun 2017 04:35:19 +0200

 This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
 --3LtL0H8phubD4b88cHiXOrgpqDXPQQl3j
 Content-Type: multipart/mixed; boundary="DA992h1DiUGK1xW6cpNMUmuIFt66dQMOj";
  protected-headers="v1"
 From: Kamil Rytarowski <n54@gmx.com>
 To: gnats-bugs@NetBSD.org
 Message-ID: <90c85181-3cb1-e39e-1d26-f2c48e634539@gmx.com>
 Subject: Re: pkg/51966 (firefox crashes frequently)
 References: <pr-pkg-51966@gnats.netbsd.org>
  <20170212203842.C44E37A296@mollari.NetBSD.org>
  <20170623222342.1AE4E7A2A5@mollari.NetBSD.org>
 In-Reply-To: <20170623222342.1AE4E7A2A5@mollari.NetBSD.org>

 --DA992h1DiUGK1xW6cpNMUmuIFt66dQMOj
 Content-Type: text/plain; charset=utf-8
 Content-Language: en-US
 Content-Transfer-Encoding: quoted-printable

 On 24.06.2017 00:23, wiz@NetBSD.org wrote:
 > Synopsis: firefox crashes frequently
 >=20
 > Responsible-Changed-From-To: pkg-manager->ryoon
 > Responsible-Changed-By: wiz@NetBSD.org
 > Responsible-Changed-When: Fri, 23 Jun 2017 22:23:41 +0000
 > Responsible-Changed-Why:
 > Over to maintainer
 > (includes patch!)
 >=20
 >=20
 >=20

 This bug is still valid on:

 NetBSD chieftec 8.99.1 NetBSD 8.99.1 (GENERIC) #2: Sat Jun 24 11:15:28
 CEST 2017
 root@chieftec:/public/netbsd-root/sys/arch/amd64/compile/GENERIC amd64

 With pkgsrc-current. I'm reproducing it with www/firefox and
 www/firefox45. I have not tested older ones... but I might need to get th=
 em.

 I tried to apply this patch but it seems incomplete, it doesn't build
 for me.


 --DA992h1DiUGK1xW6cpNMUmuIFt66dQMOj--

 --3LtL0H8phubD4b88cHiXOrgpqDXPQQl3j
 Content-Type: application/pgp-signature; name="signature.asc"
 Content-Description: OpenPGP digital signature
 Content-Disposition: attachment; filename="signature.asc"

 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2

 iQIcBAEBCAAGBQJZTyFuAAoJEEuzCOmwLnZsCz4P/RVZONTK87gsbUOIMDGtTBw2
 2wlqraXueo2t+uD6UiiS3M8MU4jGyhGl89TtX2ZSngvBzscMhzQBvyfCr3kzjcFY
 gIxeHtC+jKfQXfS62t/oxJooqzjW0vaf1y8rHgd+dySsjK9HPOmyTdwlaQcCYzPs
 hLi5FEAuCgBaUwGX4jC7Zr5ziGZ1dkraMf3uF+bokL/r/L1kVUcErUfww5Bvkqzs
 q10V2Apjf3Ek26wB9ebUMdUhupKK5JabjxucJOEgNrPHWfD4bc1hn1qXhqUgDTVl
 LpVyVySnTfQp/ZaYTvuZRWRVLlz5bxZepxt9BnB8nxFJpxlWmCU2JW5SvzF9z7iK
 UiSXiM/Apt+7pbZ3x9A2WNxmZoZzvK749yjtpk21N3HZ97/G7ylHrlNQbc+rojaX
 iWtdUA4bV80z2Slm6JI0d8g9Fs9IUL5elnrlxFcf9BYVrOzppb2/wt1B+xqgcCQb
 ZOvXp9SzNfdC4Y6U1N9q5MorpgboO1O7dniD0+QZldQAnSbGUb30nslQg7woxOO9
 4fzesYceUbTSX5YXDS0BnR//cn6uJxTERoYMCNDlF4QGTOQatpGOP5kyT+8zLZXQ
 wWWyC8USf/2uEy+5WQDGKRZmdsqluphIKDJOz0pyB+fSBvTJ18lAVuRgluX9unZa
 YGJrb0FVj7fz8eiqyAsK
 =fE2O
 -----END PGP SIGNATURE-----

 --3LtL0H8phubD4b88cHiXOrgpqDXPQQl3j--

From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: gnats-bugs@NetBSD.org
Cc: ryoon@NetBSD.org, aran@100acres.us, tsutsui@ceres.dti.ne.jp
Subject: Re: pkg/51966
Date: Sun, 25 Jun 2017 15:20:39 +0900

 Hi,

 I've revised Aran's patch to:
  - move changes (avoid use of sem_t) inside #if defined(__NetBSD__)
  - avoid use of pthread_mutex_timedlock(3) (not available on NetBSD 7.1)
   -> I'm not sure if pthread_mutex_lock(3) is acceptable in this case though

 It seems working on NetBSD/i386 7.1 with browser.tabs.remote.autostart.2=true
 (i.e. e10s enabled).

 Note for NetBSD 7.1 PR pkg/52309 (avoid PTHREAD_PRIO_INHERIT, which
 is not available on 7.1 either) is also necessary.

 --- shar from here ---

 # This is a shell archive.  Save it in a file, remove anything before
 # this line, and then unpack it by entering "sh file".  Note, it may
 # create directories; files and directories will be owned by you and
 # have default permissions.
 #
 # This archive contains:
 #
 #	patches/patch-ipc_glue_CrossProcessSemaphore.h
 #	patches/patch-ipc_glue_CrossProcessSemaphore__posix.cpp
 #
 echo x - patches/patch-ipc_glue_CrossProcessSemaphore.h
 sed 's/^X//' >patches/patch-ipc_glue_CrossProcessSemaphore.h << 'END-of-patches/patch-ipc_glue_CrossProcessSemaphore.h'
 X$NetBSD$
 X
 X- avoid use of sem_t on NetBSD
 X  http://mail-index.netbsd.org/pkgsrc-bugs/2017/06/23/msg062225.html
 X
 X--- ipc/glue/CrossProcessSemaphore.h.orig	2017-06-05 20:45:20.000000000 +0000
 X+++ ipc/glue/CrossProcessSemaphore.h
 X@@ -91,7 +91,13 @@ private:
 X   HANDLE mSemaphore;
 X #elif !defined(OS_MACOSX)
 X   RefPtr<mozilla::ipc::SharedMemoryBasic> mSharedBuffer;
 X+#if defined(__NetBSD__)
 X+  pthread_mutex_t* mMutex;
 X+  pthread_cond_t* mNotZero;
 X+  uint32_t* mValue;
 X+#else
 X   sem_t* mSemaphore;
 X+#endif
 X   mozilla::Atomic<int32_t>* mRefCount;
 X #endif
 X };
 END-of-patches/patch-ipc_glue_CrossProcessSemaphore.h
 echo x - patches/patch-ipc_glue_CrossProcessSemaphore__posix.cpp
 sed 's/^X//' >patches/patch-ipc_glue_CrossProcessSemaphore__posix.cpp << 'END-of-patches/patch-ipc_glue_CrossProcessSemaphore__posix.cpp'
 X$NetBSD$
 X
 X- avoid use of sem_t on NetBSD
 X  http://mail-index.netbsd.org/pkgsrc-bugs/2017/06/23/msg062225.html
 X
 X--- ipc/glue/CrossProcessSemaphore_posix.cpp.orig	2017-06-25 05:29:49.000000000 +0000
 X+++ ipc/glue/CrossProcessSemaphore_posix.cpp
 X@@ -9,6 +9,11 @@
 X #include "nsDebug.h"
 X #include "nsISupportsImpl.h"
 X #include <errno.h>
 X+#if defined(__NetBSD__)
 X+#include <iostream>
 X+#include <unistd.h>
 X+#include <limits>
 X+#endif
 X 
 X static const uint64_t kNsPerMs = 1000000;
 X static const uint64_t kNsPerSec = 1000000000;
 X@@ -17,7 +22,13 @@ namespace {
 X 
 X 
 X struct SemaphoreData {
 X+#if defined(__NetBSD__)
 X+  pthread_mutex_t mMutex;
 X+  pthread_cond_t mNotZero;
 X+  uint32_t mValue;
 X+#else
 X   sem_t mSemaphore;
 X+#endif
 X   mozilla::Atomic<int32_t> mRefCount;
 X   uint32_t mInitialValue;
 X };
 X@@ -44,13 +55,27 @@ CrossProcessSemaphore::Create(const char
 X     return nullptr;
 X   }
 X 
 X+#if defined(__NetBSD__)
 X+  data->mValue = aInitialValue;
 X+  if (pthread_mutex_init(&data->mMutex, NULL) ||
 X+      pthread_cond_init(&data->mNotZero, NULL) ) {
 X+    return nullptr;
 X+  }
 X+#else
 X   if (sem_init(&data->mSemaphore, 1, aInitialValue)) {
 X     return nullptr;
 X   }
 X+#endif
 X 
 X   CrossProcessSemaphore* sem = new CrossProcessSemaphore;
 X   sem->mSharedBuffer = sharedBuffer;
 X+#if defined(__NetBSD__)
 X+  sem->mMutex = &data->mMutex;  
 X+  sem->mNotZero = &data->mNotZero;  
 X+  sem->mValue = &data->mValue;
 X+#else
 X   sem->mSemaphore = &data->mSemaphore;
 X+#endif
 X   sem->mRefCount = &data->mRefCount;
 X   *sem->mRefCount = 1;
 X 
 X@@ -84,24 +109,44 @@ CrossProcessSemaphore::Create(CrossProce
 X 
 X   int32_t oldCount = data->mRefCount++;
 X   if (oldCount == 0) {
 X+#if defined(__NetBSD__)
 X+    if (pthread_mutex_init(&data->mMutex, NULL) ||
 X+        pthread_cond_init(&data->mNotZero, NULL) ) {
 X+      data->mRefCount--;
 X+      return nullptr;
 X+    }
 X+#else
 X     // The other side has already let go of their CrossProcessSemaphore, so now
 X     // mSemaphore is garbage. We need to re-initialize it.
 X     if (sem_init(&data->mSemaphore, 1, data->mInitialValue)) {
 X       data->mRefCount--;
 X       return nullptr;
 X     }
 X+#endif
 X   }
 X 
 X   CrossProcessSemaphore* sem = new CrossProcessSemaphore;
 X   sem->mSharedBuffer = sharedBuffer;
 X+#if defined(__NetBSD__)
 X+  sem->mMutex = &data->mMutex;  
 X+  sem->mNotZero = &data->mNotZero;  
 X+  sem->mValue = &data->mValue;
 X+#else
 X   sem->mSemaphore = &data->mSemaphore;
 X+#endif
 X   sem->mRefCount = &data->mRefCount;
 X   return sem;
 X }
 X 
 X 
 X CrossProcessSemaphore::CrossProcessSemaphore()
 X+#if defined(__NetBSD__)
 X+  : mMutex (nullptr)
 X+  , mNotZero (nullptr)
 X+  , mValue (nullptr)
 X+#else
 X   : mSemaphore(nullptr)
 X+#endif
 X   , mRefCount(nullptr)
 X {
 X   MOZ_COUNT_CTOR(CrossProcessSemaphore);
 X@@ -113,17 +158,58 @@ CrossProcessSemaphore::~CrossProcessSema
 X 
 X   if (oldCount == 0) {
 X     // Nothing can be done if the destroy fails so ignore return code.
 X+#if defined(__NetBSD__)
 X+    (void)pthread_cond_destroy(mNotZero);
 X+    (void)pthread_mutex_destroy(mMutex);
 X+#else
 X     Unused << sem_destroy(mSemaphore);
 X+#endif
 X   }
 X 
 X   MOZ_COUNT_DTOR(CrossProcessSemaphore);
 X }
 X 
 X+#if defined(__NetBSD__)
 X+static struct timespec
 X+makeAbsTime(const Maybe<TimeDuration>& aWaitTime) {
 X+  struct timespec ts;
 X+  if (aWaitTime.isSome()) {
 X+    clock_gettime(CLOCK_REALTIME, &ts);
 X+    ts.tv_nsec += (kNsPerMs * aWaitTime->ToMilliseconds());
 X+    ts.tv_sec += ts.tv_nsec / kNsPerSec;
 X+    ts.tv_nsec %= kNsPerSec;
 X+  }
 X+  else {
 X+    ts.tv_sec = std::numeric_limits<time_t>::max();
 X+    ts.tv_nsec = 0;
 X+  }
 X+  return ts;
 X+}
 X+#endif
 X+
 X bool
 X CrossProcessSemaphore::Wait(const Maybe<TimeDuration>& aWaitTime)
 X {
 X   MOZ_ASSERT(*mRefCount > 0, "Attempting to wait on a semaphore with zero ref count");
 X   int ret;
 X+#if defined(__NetBSD__)
 X+  struct timespec ts = makeAbsTime(aWaitTime);
 X+
 X+  ret = pthread_mutex_lock(mMutex);
 X+
 X+  if (ret == 0) {
 X+    while (ret == 0 && mValue == 0) {
 X+      ret = pthread_cond_timedwait(mNotZero, mMutex, &ts);
 X+      while (ret == -1 && errno == EINTR) {
 X+        ret = pthread_cond_timedwait(mNotZero, mMutex, &ts);
 X+      }
 X+    }
 X+    if (ret == 0) {
 X+      --(*mValue);
 X+    }
 X+    pthread_mutex_unlock(mMutex);
 X+  }
 X+#else
 X   if (aWaitTime.isSome()) {
 X     struct timespec ts;
 X     if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
 X@@ -142,6 +228,7 @@ CrossProcessSemaphore::Wait(const Maybe<
 X       continue;
 X     }
 X   }
 X+#endif
 X   return ret == 0;
 X }
 X 
 X@@ -149,7 +236,17 @@ void
 X CrossProcessSemaphore::Signal()
 X {
 X   MOZ_ASSERT(*mRefCount > 0, "Attempting to signal a semaphore with zero ref count");
 X+#if defined(__NetBSD__)
 X+  int ret;
 X+  ret = pthread_mutex_lock(mMutex);
 X+  if (ret == 0) {
 X+    ++(*mValue);
 X+    pthread_cond_signal(mNotZero);
 X+    pthread_mutex_unlock(mMutex);
 X+  }
 X+#else
 X   sem_post(mSemaphore);
 X+#endif
 X }
 X 
 X CrossProcessSemaphoreHandle
 END-of-patches/patch-ipc_glue_CrossProcessSemaphore__posix.cpp
 exit


 ---
 Izumi Tsutsui

From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/51966 CVS commit: pkgsrc/www/firefox
Date: Thu, 29 Jun 2017 08:07:59 +0000

 Module Name:	pkgsrc
 Committed By:	martin
 Date:		Thu Jun 29 08:07:59 UTC 2017

 Modified Files:
 	pkgsrc/www/firefox: Makefile distinfo
 Added Files:
 	pkgsrc/www/firefox/patches: patch-ipc_glue_CrossProcessSemaphore.h
 	    patch-ipc_glue_CrossProcessSemaphore__posix.cpp

 Log Message:
 Add patch from PR 51966.


 To generate a diff of this commit:
 cvs rdiff -u -r1.297 -r1.298 pkgsrc/www/firefox/Makefile
 cvs rdiff -u -r1.282 -r1.283 pkgsrc/www/firefox/distinfo
 cvs rdiff -u -r0 -r1.1 \
     pkgsrc/www/firefox/patches/patch-ipc_glue_CrossProcessSemaphore.h \
     pkgsrc/www/firefox/patches/patch-ipc_glue_CrossProcessSemaphore__posix.cpp

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2014 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.