X-Loop: help-debbugs@HIDDEN Subject: bug#26711: Multithreading segfaults Resent-From: Jacek Swiergocki <jswiergo@HIDDEN> Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> Resent-CC: bug-guile@HIDDEN Resent-Date: Sat, 29 Apr 2017 16:56:01 +0000 Resent-Message-ID: <handler.26711.B.149348491427095 <at> debbugs.gnu.org> Resent-Sender: help-debbugs@HIDDEN X-GNU-PR-Message: report 26711 X-GNU-PR-Package: guile X-GNU-PR-Keywords: To: 26711 <at> debbugs.gnu.org X-Debbugs-Original-To: bug-guile@HIDDEN Received: via spool by submit <at> debbugs.gnu.org id=B.149348491427095 (code B ref -1); Sat, 29 Apr 2017 16:56:01 +0000 Received: (at submit) by debbugs.gnu.org; 29 Apr 2017 16:55:14 +0000 Received: from localhost ([127.0.0.1]:46544 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1d4VeM-00072x-0H for submit <at> debbugs.gnu.org; Sat, 29 Apr 2017 12:55:14 -0400 Received: from eggs.gnu.org ([208.118.235.92]:35767) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <jswiergo@HIDDEN>) id 1d4QMU-0005gi-2g for submit <at> debbugs.gnu.org; Sat, 29 Apr 2017 07:16:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <jswiergo@HIDDEN>) id 1d4QMN-0005px-28 for submit <at> debbugs.gnu.org; Sat, 29 Apr 2017 07:16:20 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:32887) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from <jswiergo@HIDDEN>) id 1d4QMM-0005ps-UL for submit <at> debbugs.gnu.org; Sat, 29 Apr 2017 07:16:18 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54957) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from <jswiergo@HIDDEN>) id 1d4QML-0000wf-5n for bug-guile@HIDDEN; Sat, 29 Apr 2017 07:16:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from <jswiergo@HIDDEN>) id 1d4QMJ-0005oe-HY for bug-guile@HIDDEN; Sat, 29 Apr 2017 07:16:17 -0400 Received: from mail-qt0-x22b.google.com ([2607:f8b0:400d:c0d::22b]:35692) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from <jswiergo@HIDDEN>) id 1d4QMJ-0005oN-Cj for bug-guile@HIDDEN; Sat, 29 Apr 2017 07:16:15 -0400 Received: by mail-qt0-x22b.google.com with SMTP id y33so66714781qta.2 for <bug-guile@HIDDEN>; Sat, 29 Apr 2017 04:16:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=2RSnOsSr1v8OPSHbs8hRuIKG05rn+krg/A6QglI9t6w=; b=unH9EJkVOyW0BtJkX1KAP/AvSK6H29eTnrEjoLJFHp5nGsdBIxFVb+hLulxwk69Dn/ qxtT0jCm9SlqA2f697uIIWUNtBqiSiae1D7n4Eotbfhox3ibUAO7sxulCqm1E/hqSYWm 27wFzB+zSwE80V6FLylj0EhjDhDmdMNvNCCDmmAXmOQJTraWOQpBKRy4BhqdZtWNdLlZ ANPqUBWlBVbmhwR/1W4pbNwOwtFsi7S1IZaVYMH0iwRh1tyTfUYOkRGo/gvppdwKDwV+ aZfWespVJuqKo2x3VTFXlwGxH/tC2cMgPjQGh0CnIlgvR8mYx+riffYFNUbnzwxa2rNw waYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=2RSnOsSr1v8OPSHbs8hRuIKG05rn+krg/A6QglI9t6w=; b=i6DlOQakT4PZnAuoUG165FS6wepZ6tIdjX5RMGFVT4EoWJZYwb4EXPCoT62GB7HG/K Vqf0iBda1DgioC9rM6J53FFJ7iopKApk+Ib+x9sZDamZOlxPAssLYeWkrwIGeV03bxkH ddAoYHsWgZvU/qeNh1vIPKvXw8qI/EvtNcxKFANiCBsI4vmWrJfLcb6VXSUNICmr+8wI Bgx0z26LHgacvJ5uhKZVfOM6YnCdOfDRRCeBolLTG1yYTzD1K/5+wvnQrVW+y86UYF22 OhxukuBknXvL8vfZ510fvv+jWUzvsILql5G58cO//LXFL1yTRXfj4XNaUTkdLJh7wMh0 rWYA== X-Gm-Message-State: AN3rC/7bVVcPaoMxYwza93X2xP/shfOayE5wFsZxnyf90dncJTE408ux oujdg2tOs9teOPYxACquN72Aw3CTkzC6 X-Received: by 10.237.38.135 with SMTP id q7mr13681619qtd.115.1493464574466; Sat, 29 Apr 2017 04:16:14 -0700 (PDT) MIME-Version: 1.0 Received: by 10.12.150.123 with HTTP; Sat, 29 Apr 2017 04:16:13 -0700 (PDT) From: Jacek Swiergocki <jswiergo@HIDDEN> Date: Sat, 29 Apr 2017 13:16:13 +0200 Message-ID: <CAPLvL3_rXNC7L-vQ8ANsFsHqmW3mQPsga1LDsZf5czsJZU6QTA@HIDDEN> Content-Type: multipart/alternative; boundary=94eb2c125580722374054e4c51cf X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -4.0 (----) X-Mailman-Approved-At: Sat, 29 Apr 2017 12:55:13 -0400 X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -4.0 (----) --94eb2c125580722374054e4c51cf Content-Type: text/plain; charset=UTF-8 Hi all, I have two examples of multi threading code that crash with segmentation fault. If there is a bug in guile please fix it. If there is a problem only in my code please help me how it can be workaround. I am using Ubuntu 14.04 and guile compiled from the repository. The examples are compiled by: g++ demo.cc -Wall -std=c++11 -pthread -I/usr/local/test/include/guile/2.2 -L/usr/local/test/lib -lguile-2.2 -lgc The first example has started to segfault since guile tagged v2.1.7. I have not encountered problems for v2.1.6 and older versions. However for recent version v2.2.2 it requires much more iterations to fail than v2.1.7 that fails instantly. //////////////////////////////////////////////////////////////////////////// // Example 1. #include <libguile.h> #include <thread> #include <vector> #include <atomic> #include <mutex> static volatile bool hold = true; static std::atomic_int start_cnt(0); static std::mutex init_once_mtx; static bool start_inited_once = false; static bool is_inited_once = false; static std::mutex gc_mtx; class Eval { public: Eval(); ~Eval(); }; void* c_wrap_init(void*) { return nullptr; } Eval::Eval() { scm_with_guile(c_wrap_init, this); } Eval::~Eval() { std::lock_guard<std::mutex> lck(gc_mtx); scm_gc(); } void* c_wrap_init_only_once(void*) { is_inited_once = true; return nullptr; } void init_only_once() { std::lock_guard<std::mutex> lck(init_once_mtx); if (!start_inited_once) { start_inited_once = true; scm_with_guile(c_wrap_init_only_once, nullptr); } while (!is_inited_once); // spin; } void threadedInit(int thread_id) { start_cnt ++; while (hold) {} // spin init_only_once(); Eval* ev = new Eval(); delete ev; } void test_init_race() { int n_threads = 120; start_cnt = 0; hold = true; std::vector<std::thread> thread_pool; for (int i = 0; i < n_threads; i++) thread_pool.push_back(std::thread(&threadedInit, i)); while (start_cnt != n_threads) {} // spin printf("Done creating %d threads\n", n_threads); hold = false; for (std::thread& t : thread_pool) t.join(); printf("Done joining %d threads\n", n_threads); } int main() { for (int k = 0; k < 10000; k++) { test_init_race(); printf("------------------ done iteration %d\n", k); } The second example requires much more iterations to crash with segfault. Sometimes hundreds, sometimes thousands, it seems to be random. You need to wait over a dozen of minutes, sometimes you need try again and restart. I have found this problem for old versions e.g. v2.0.11 as well as for recent version v2.2.2, so it seems to be an old problem. //////////////////////////////////////////////////////////////////////////// // Example 2. #include <libguile.h> #include <thread> #include <vector> #include <atomic> #include <mutex> static volatile bool hold = true; static std::atomic_int start_cnt(0); static std::mutex init_once_mtx; static bool start_inited_once = false; static bool is_inited_once = false; void* c_wrap_init_only_once(void*) { is_inited_once = true; return nullptr; } void* c_wrap_eval(void*) { return nullptr; } void init_only_once() { std::lock_guard<std::mutex> lck(init_once_mtx); if (!start_inited_once) { start_inited_once = true; scm_with_guile(c_wrap_init_only_once, nullptr); } while (!is_inited_once); // spin; } void threadedInit(int thread_id) { start_cnt ++; while (hold) {} // spin init_only_once(); for (int i = 0; i < 100; ++i) { scm_with_guile(c_wrap_eval, nullptr); } } void test_init_race() { int n_threads = 120; start_cnt = 0; hold = true; std::vector<std::thread> thread_pool; for (int i = 0; i < n_threads; i++) thread_pool.push_back(std::thread(&threadedInit, i)); while (start_cnt != n_threads) {} // spin printf("Done creating %d threads\n", n_threads); hold = false; for (std::thread& t : thread_pool) t.join(); printf("Done joining %d threads\n", n_threads); } int main() { for (int k = 0; k < 10000; k++) { test_init_race(); printf("------------------ done iteration %d\n", k); } } -- Jacek --94eb2c125580722374054e4c51cf Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div>Hi all,</div><div><br></div><div>I have two examples = of multi threading code that crash with segmentation fault. If there is a b= ug in guile please fix it. If there is a problem only in my code please hel= p me how it can be workaround.</div><div><br></div><div>I am using Ubuntu 1= 4.04 and guile compiled from the repository. The examples are compiled by:<= /div><div>g++ demo.cc -Wall -std=3Dc++11 -pthread -I/usr/local/test/include= /guile/2.2 -L/usr/local/test/lib -lguile-2.2 -lgc</div><div><br></div><div>= The first example has started to segfault since guile tagged v2.1.7. I have= not encountered problems for v2.1.6 and older versions. However for recent= version v2.2.2 it requires much more iterations to fail than v2.1.7 that f= ails instantly.</div><div><br></div><div>//////////////////////////////////= //////////////////////////////////////////</div><div>// Example 1.</div><di= v><br></div><div>#include <libguile.h></div><div><br></div><div>#incl= ude <thread></div><div>#include <vector></div><div>#include <= ;atomic></div><div>#include <mutex></div><div><br></div><div>stati= c volatile bool hold =3D true;</div><div>static std::atomic_int start_cnt(0= );</div><div><br></div><div>static std::mutex init_once_mtx;</div><div>stat= ic bool start_inited_once =3D false;</div><div>static bool is_inited_once = =3D false;</div><div><br></div><div>static std::mutex gc_mtx;</div><div><br= ></div><div>class Eval</div><div>{</div><div>public:</div><div>=C2=A0 =C2= =A0 Eval();</div><div>=C2=A0 =C2=A0 ~Eval();</div><div>};</div><div><br></d= iv><div><div><div>void* c_wrap_init(void*)</div><div>{</div><div>=C2=A0 =C2= =A0 return nullptr;</div><div>}</div></div><div><br></div></div><div>Eval::= Eval()<br></div><div>{</div><div>=C2=A0 =C2=A0 scm_with_guile(c_wrap_init, = this);</div><div>}</div><div><br></div><div>Eval::~Eval()</div><div>{</div>= <div>=C2=A0 =C2=A0 std::lock_guard<std::mutex> lck(gc_mtx);</div><div= >=C2=A0 =C2=A0 scm_gc();</div><div>}</div><div><div><br></div></div><div>vo= id* c_wrap_init_only_once(void*)</div><div>{</div><div>=C2=A0 =C2=A0 is_ini= ted_once =3D true;</div><div>=C2=A0 =C2=A0 return nullptr;</div><div>}</div= ><div><br></div><div>void init_only_once()</div><div>{</div><div>=C2=A0 =C2= =A0 std::lock_guard<std::mutex> lck(init_once_mtx);</div><div>=C2=A0 = =C2=A0 if (!start_inited_once)</div><div>=C2=A0 =C2=A0 {</div><div>=C2=A0 = =C2=A0 =C2=A0 =C2=A0 start_inited_once =3D true;</div><div>=C2=A0 =C2=A0 = =C2=A0 =C2=A0 scm_with_guile(c_wrap_init_only_once, nullptr);</div><div>=C2= =A0 =C2=A0 }</div><div>=C2=A0 =C2=A0 while (!is_inited_once); // spin;</div= ><div>}</div><div><br></div><div>void threadedInit(int thread_id)</div><div= >{</div><div>=C2=A0 =C2=A0 start_cnt ++;</div><div>=C2=A0 =C2=A0 while (hol= d) {} // spin</div><div><br></div><div>=C2=A0 =C2=A0 init_only_once();</div= ><div>=C2=A0 =C2=A0 Eval* ev =3D new Eval();</div><div><br></div><div>=C2= =A0 =C2=A0 delete ev;</div><div>}</div><div><br></div><div>void test_init_r= ace()</div><div>{</div><div>=C2=A0 =C2=A0 int n_threads =3D 120;</div><div>= =C2=A0 =C2=A0 start_cnt =3D 0;</div><div>=C2=A0 =C2=A0 hold =3D true;</div>= <div><br></div><div>=C2=A0 =C2=A0 std::vector<std::thread> thread_poo= l;</div><div>=C2=A0 =C2=A0 for (int i =3D 0; i < n_threads; i++)</div><d= iv>=C2=A0 =C2=A0 =C2=A0 =C2=A0 thread_pool.push_back(std::thread(&threa= dedInit, i));</div><div><br></div><div>=C2=A0 =C2=A0 while (start_cnt !=3D = n_threads) {} =C2=A0// spin</div><div>=C2=A0 =C2=A0 printf("Done creat= ing %d threads\n", n_threads);</div><div>=C2=A0 =C2=A0 hold =3D false;= </div><div><br></div><div>=C2=A0 =C2=A0 for (std::thread& t : thread_po= ol) t.join();</div><div>=C2=A0 =C2=A0 printf("Done joining %d threads\= n", n_threads);</div><div>}</div><div><br></div><div>int main()</div><= div>{</div><div>=C2=A0 =C2=A0 for (int k =3D 0; k < 10000; k++)</div><di= v>=C2=A0 =C2=A0 {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 test_init_race();</= div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 printf("------------------ done i= teration %d\n", k);</div><div>}</div><div><br></div><div>The second ex= ample requires much more iterations to crash with segfault. Sometimes hundr= eds, sometimes thousands, it seems to be random. You need to wait over a do= zen of minutes, sometimes you need try again and restart. I have found this= problem for old versions e.g. v2.0.11 as well as for recent version v2.2.2= , so it seems to be an old problem.</div><div><br></div><div>//////////////= //////////////////////////////////////////////////////////////</div><div>//= Example 2.</div><div><br></div><div>#include <libguile.h></div><div>= <br></div><div>#include <thread></div><div>#include <vector></d= iv><div>#include <atomic></div><div>#include <mutex></div><div>= <br></div><div>static volatile bool hold =3D true;</div><div>static std::at= omic_int start_cnt(0);</div><div><br></div><div>static std::mutex init_once= _mtx;</div><div>static bool start_inited_once =3D false;</div><div>static b= ool is_inited_once =3D false;</div><div><br></div><div>void* c_wrap_init_on= ly_once(void*)</div><div>{</div><div>=C2=A0 =C2=A0 is_inited_once =3D true;= </div><div>=C2=A0 =C2=A0 return nullptr;</div><div>}</div><div><br></div><d= iv>void* c_wrap_eval(void*)</div><div>{</div><div>=C2=A0 =C2=A0 return null= ptr;</div><div>}</div><div><br></div><div>void init_only_once()</div><div>{= </div><div>=C2=A0 =C2=A0 std::lock_guard<std::mutex> lck(init_once_mt= x);</div><div>=C2=A0 =C2=A0 if (!start_inited_once)</div><div>=C2=A0 =C2=A0= {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 start_inited_once =3D true;</div><= div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 scm_with_guile(c_wrap_init_only_once, nullp= tr);</div><div>=C2=A0 =C2=A0 }</div><div>=C2=A0 =C2=A0 while (!is_inited_on= ce); // spin;</div><div>}</div><div><br></div><div>void threadedInit(int th= read_id)</div><div>{</div><div>=C2=A0 =C2=A0 start_cnt ++;</div><div>=C2=A0= =C2=A0 while (hold) {} // spin</div><div><br></div><div>=C2=A0 =C2=A0 init= _only_once();</div><div>=C2=A0 =C2=A0 for (int i =3D 0; i < 100; ++i)</d= iv><div>=C2=A0 =C2=A0 {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 scm_with_guil= e(c_wrap_eval, nullptr);</div><div>=C2=A0 =C2=A0 }</div><div>}</div><div><b= r></div><div>void test_init_race()</div><div>{</div><div>=C2=A0 =C2=A0 int = n_threads =3D 120;</div><div>=C2=A0 =C2=A0 start_cnt =3D 0;</div><div>=C2= =A0 =C2=A0 hold =3D true;</div><div><br></div><div>=C2=A0 =C2=A0 std::vecto= r<std::thread> thread_pool;</div><div>=C2=A0 =C2=A0 for (int i =3D 0;= i < n_threads; i++)</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 thread_pool.p= ush_back(std::thread(&threadedInit, i));</div><div><br></div><div>=C2= =A0 =C2=A0 while (start_cnt !=3D n_threads) {} =C2=A0// spin</div><div>=C2= =A0 =C2=A0 printf("Done creating %d threads\n", n_threads);</div>= <div>=C2=A0 =C2=A0 hold =3D false;</div><div><br></div><div>=C2=A0 =C2=A0 f= or (std::thread& t : thread_pool) t.join();</div><div>=C2=A0 =C2=A0 pri= ntf("Done joining %d threads\n", n_threads);</div><div>}</div><di= v><br></div><div>int main()</div><div>{</div><div>=C2=A0 =C2=A0 for (int k = =3D 0; k < 10000; k++)</div><div>=C2=A0 =C2=A0 {</div><div>=C2=A0 =C2=A0= =C2=A0 =C2=A0 test_init_race();</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 prin= tf("------------------ done iteration %d\n", k);</div><div>=C2=A0= =C2=A0 }</div><div>}</div><div><br></div><div>--</div><div>Jacek</div><div= ><br></div></div> --94eb2c125580722374054e4c51cf--
Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) Content-Type: text/plain; charset=utf-8 X-Loop: help-debbugs@HIDDEN From: help-debbugs@HIDDEN (GNU bug Tracking System) To: Jacek Swiergocki <jswiergo@HIDDEN> Subject: bug#26711: Acknowledgement (Multithreading segfaults) Message-ID: <handler.26711.B.149348491427095.ack <at> debbugs.gnu.org> References: <CAPLvL3_rXNC7L-vQ8ANsFsHqmW3mQPsga1LDsZf5czsJZU6QTA@HIDDEN> X-Gnu-PR-Message: ack 26711 X-Gnu-PR-Package: guile Reply-To: 26711 <at> debbugs.gnu.org Date: Sat, 29 Apr 2017 16:56:01 +0000 Thank you for filing a new bug report with debbugs.gnu.org. This is an automatically generated reply to let you know your message has been received. Your message is being forwarded to the package maintainers and other interested parties for their attention; they will reply in due course. Your message has been sent to the package maintainer(s): bug-guile@HIDDEN If you wish to submit further information on this problem, please send it to 26711 <at> debbugs.gnu.org. Please do not send mail to help-debbugs@HIDDEN unless you wish to report a problem with the Bug-tracking system. --=20 26711: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D26711 GNU Bug Tracking System Contact help-debbugs@HIDDEN with problems
X-Loop: help-debbugs@HIDDEN Subject: bug#26711: Example1 is buggy References: <CAPLvL3_rXNC7L-vQ8ANsFsHqmW3mQPsga1LDsZf5czsJZU6QTA@HIDDEN> In-Reply-To: <CAPLvL3_rXNC7L-vQ8ANsFsHqmW3mQPsga1LDsZf5czsJZU6QTA@HIDDEN> Resent-From: Linas Vepstas <linasvepstas@HIDDEN> Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> Resent-CC: bug-guile@HIDDEN Resent-Date: Sun, 30 Apr 2017 22:01:01 +0000 Resent-Message-ID: <handler.26711.B26711.149358960316960 <at> debbugs.gnu.org> Resent-Sender: help-debbugs@HIDDEN X-GNU-PR-Message: followup 26711 X-GNU-PR-Package: guile X-GNU-PR-Keywords: To: 26711 <at> debbugs.gnu.org Reply-To: linasvepstas@HIDDEN Received: via spool by 26711-submit <at> debbugs.gnu.org id=B26711.149358960316960 (code B ref 26711); Sun, 30 Apr 2017 22:01:01 +0000 Received: (at 26711) by debbugs.gnu.org; 30 Apr 2017 22:00:03 +0000 Received: from localhost ([127.0.0.1]:48180 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1d4wss-0004PN-Jv for submit <at> debbugs.gnu.org; Sun, 30 Apr 2017 18:00:03 -0400 Received: from mail-qk0-f173.google.com ([209.85.220.173]:35304) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <linasvepstas@HIDDEN>) id 1d4wsq-0004OT-I0 for 26711 <at> debbugs.gnu.org; Sun, 30 Apr 2017 18:00:00 -0400 Received: by mail-qk0-f173.google.com with SMTP id q1so10525863qkd.2 for <26711 <at> debbugs.gnu.org>; Sun, 30 Apr 2017 15:00:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:reply-to:from:date:message-id:subject:to; bh=Q1noS1YpgmghGjo9bGVv8eJCb1IOLL/hTzQHx562WvE=; b=u9YFjG+XkL57TVtj1lthn36ZPzW+bsBq9NCjoA0gMjawMHRhaqSWY15snKRSIy0x3d NO05pWTEaXan3beojgYXlvwAISMqgrhehM07kqCF/zfXxMEXs4aLJ5O9TaVUiEt47GtZ Fm1UVpqvzzW36hygFtj3FeiXdJaRmOnCoGgIiaOIr9jHWlHabeUG1mo6Pt1A45dSFZas ro86MxVC+FmL7LIOSEdP0k4OOQElZPx/JKrq6K6RNqzV+332zDqcVXWa7jYUfVrpw6Lv zvQw9vP7PlaY3/WbT8Oll4teeAQwO+7nGT4VZd4jnOnUMTU6pY0kgdhIwbLjE0/PHYuu xNyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:reply-to:from:date:message-id :subject:to; bh=Q1noS1YpgmghGjo9bGVv8eJCb1IOLL/hTzQHx562WvE=; b=DsJw6lakgmGndz9tEc0neh3PEV5F8l0RNNKniEDesCh/Y0qQRk3+qRMv4igfP4cCmP U2AgqUak+v25kShwCG8mvQrGlOKuCb/Usa+O5XUCckoPHYuS4zjwYVVMqviQaIEUAgRD 4X1ZMDRWLpBSGLxoSPTCV90N2QuVltv2suES/UvOgzdSFFN/0RJU7kvKT8ZiZrlCR1NO Sz/TGS+nPQ3WRLq4tgVDpW+i4Luzf/Mb4+Tzb/a9hC37zZng9Tbs0QhXhr4EsYK7SSpA ngMIfB2cjy2NeDmjlHPnbxDlRc5eWA3RzKosGeRZsMLzMHk46dldOk57DRraLiakkx0B OX7w== X-Gm-Message-State: AN3rC/7c6YnKgyZAkgakyzZL9OK+cyVWXzW+5+RXFvcm5zhsmy8rau6n hKHilQVc2ukhyXIHpBq3KQ1V1np30g== X-Received: by 10.55.23.96 with SMTP id i93mr21550506qkh.114.1493589594885; Sun, 30 Apr 2017 14:59:54 -0700 (PDT) MIME-Version: 1.0 Received: by 10.12.135.88 with HTTP; Sun, 30 Apr 2017 14:59:34 -0700 (PDT) From: Linas Vepstas <linasvepstas@HIDDEN> Date: Sun, 30 Apr 2017 16:59:34 -0500 Message-ID: <CAHrUA34dgQDbKvSMEDz-jtHXSvU_WcEa8dmd5Zsbs2Z7F8dq7g@HIDDEN> Content-Type: multipart/alternative; boundary=001a1146d04e3e550c054e696d73 X-Spam-Score: 0.5 (/) X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: 0.5 (/) --001a1146d04e3e550c054e696d73 Content-Type: text/plain; charset=UTF-8 Example1.cc is has a work-around -- main() needs to call scm_init_guile() or scm_with_guile(). If this is done, the problem goes away. The problem with example1 is that the first thread to initialize guile is eventually destroyed. However, the first thread to call guile never ever sets "needs_unregister" in libguile/threads.c and thus, bdwgc never finds out that this thread no longer exists. Sooner or later, bdwgc touches this non-existent thread, and crashes. If its OK to initialize guile for the first time ever in a transient thread, then there's a bug in guile; else there's a bug in the example. I'm now looking into example2. --linas --001a1146d04e3e550c054e696d73 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div><div><div><div><div>Example1.cc is has a work-around = -- main() needs to call scm_init_guile() or scm_with_guile().=C2=A0 If this= is done, the problem goes away.<br></div><br></div>The problem with exampl= e1 is that the first thread to initialize guile is eventually destroyed. Ho= wever, the first thread to call guile never ever sets "needs_unregiste= r" in libguile/threads.c and thus, bdwgc never finds out that this thr= ead no longer exists. Sooner or later, bdwgc touches this non-existent thre= ad, and crashes.<br><br></div>If its OK to initialize guile for the first t= ime ever in a transient thread, then there's a bug in guile; else there= 's a bug in the example.<br><br></div>I'm now looking into example2= .<br><br></div>--linas<br></div> --001a1146d04e3e550c054e696d73--
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.