From mboxrd@z Thu Jan 1 00:00:00 1970
Path: news.gmane.org!.POSTED!not-for-mail
From: Philipp Stephani
Newsgroups: gmane.emacs.devel
Subject: [PATCH] Make error checking for thread functions stricter.
Date: Sat, 2 Jun 2018 22:42:31 +0200
Message-ID: <20180602204231.92373-1-phst@google.com>
NNTP-Posting-Host: blaine.gmane.org
X-Trace: blaine.gmane.org 1527972062 5376 195.159.176.226 (2 Jun 2018 20:41:02 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Sat, 2 Jun 2018 20:41:02 +0000 (UTC)
Cc: Philipp Stephani
To: emacs-devel@gnu.org
Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Jun 02 22:40:58 2018
Return-path:
Envelope-to: ged-emacs-devel@m.gmane.org
Original-Received: from lists.gnu.org ([208.118.235.17])
by blaine.gmane.org with esmtp (Exim 4.84_2)
(envelope-from )
id 1fPDKc-0001HE-Cu
for ged-emacs-devel@m.gmane.org; Sat, 02 Jun 2018 22:40:58 +0200
Original-Received: from localhost ([::1]:60981 helo=lists.gnu.org)
by lists.gnu.org with esmtp (Exim 4.71)
(envelope-from )
id 1fPDMh-0001V2-NG
for ged-emacs-devel@m.gmane.org; Sat, 02 Jun 2018 16:43:07 -0400
Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:37931)
by lists.gnu.org with esmtp (Exim 4.71)
(envelope-from ) id 1fPDMb-0001Um-5L
for emacs-devel@gnu.org; Sat, 02 Jun 2018 16:43:02 -0400
Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
(envelope-from ) id 1fPDMW-0003jh-6h
for emacs-devel@gnu.org; Sat, 02 Jun 2018 16:43:01 -0400
Original-Received: from mail-wr0-x235.google.com ([2a00:1450:400c:c0c::235]:34993)
by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)
(Exim 4.71) (envelope-from )
id 1fPDMV-0003jR-Sa
for emacs-devel@gnu.org; Sat, 02 Jun 2018 16:42:56 -0400
Original-Received: by mail-wr0-x235.google.com with SMTP id l10-v6so4516820wrn.2
for ; Sat, 02 Jun 2018 13:42:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
h=from:to:cc:subject:date:message-id;
bh=tde2d3coolLX0cz6r0OdOhVFZNMheaIG+3cICnTE2lc=;
b=upRm+i7wFd3tXEJJj2a5r/nKfB4efac9TfBCg1BOOZoiOBikPTV+hqnPKTiagpzKxt
DdSiqqhH3nwD/rkoDKTyD4xb1S4xyAnrUOiDUAapkZ9WqHz2OLyNPOVZKadaMtQP7xxf
62psQc6pCD0CCEPuAqvFswl8xfe/YGhKXaNsuQj/qmiB+qJdrTzMf96nifOQpVw34G6B
JahCO72Te2X7Idwa9FKIMfnKFI425xOH7tY+6MG97n8SiZ7TJ2Q3QWaiRuzqKBAPXSlI
5G0wdXNZ6skPkCsg989vlO4+wXQLqQMM5b4r0QO5kdAl+Hx8NrzX6KKMdj2Yqd4jZ9kL
7d5Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20161025;
h=x-gm-message-state:from:to:cc:subject:date:message-id;
bh=tde2d3coolLX0cz6r0OdOhVFZNMheaIG+3cICnTE2lc=;
b=OK+rSBp8KYl69sXSLztlLzJATos3KVCDiSz5Yx1/ugVH5frnq0+e+qhKaosB191Y5p
4Iauo4Zqkw6OF/X6qT8PDAFQjmvPxoz5OoVeu+8F9/ER4IZKpaFeUXq8ANuYDEphO0jE
X40+wYo1gM4ahDYNnZT0ao/XGNmLKRjTJ0hTr44eAHJn2/uTsFBrnYtxYj7alkvYe0z4
B0wzhTzMUjzUBoFF+2g8MQE2LJuYmywEUOD4KutYgfTGnCVjFZ7B1an2JtBShKnyDnEG
sp1gyPAUK7mEUKGQmd+NzyM4rTHc8/dWkCFm2s9ityFvH8R5QP4rqyTF2LL2Kqs5UW58
Q13A==
X-Gm-Message-State: ALKqPwfqKTGOxNcjtJnXoLWCYdQSNqBASao3gbt15KiQiWvK9THEWurg
5xJ7JynTynS5TdP06FAnD/RubUtD
X-Google-Smtp-Source: ADUXVKLbTXxX2DmlTub6RQRN0ORDvCeFKF+cil/A35QzvcsbpWTGhTckuRLJifQj8nj2neAi5oNzrQ==
X-Received: by 2002:adf:9724:: with SMTP id
r33-v6mr12823434wrb.79.1527972174469;
Sat, 02 Jun 2018 13:42:54 -0700 (PDT)
Original-Received: from p.cm.cablesurf.de (46.128.198.151.dynamic.cablesurf.de.
[46.128.198.151]) by smtp.gmail.com with ESMTPSA id
a203-v6sm3869498wme.46.2018.06.02.13.42.53
(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
Sat, 02 Jun 2018 13:42:53 -0700 (PDT)
X-Google-Original-From: Philipp Stephani
X-Mailer: git-send-email 2.17.1
X-detected-operating-system: by eggs.gnu.org: Genre and OS details not
recognized.
X-Received-From: 2a00:1450:400c:c0c::235
X-BeenThere: emacs-devel@gnu.org
X-Mailman-Version: 2.1.21
Precedence: list
List-Id: "Emacs development discussions."
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org
Original-Sender: "Emacs-devel"
Xref: news.gmane.org gmane.emacs.devel:225940
Archived-At:
* src/systhread.c (sys_thread_create): Change return type to bool.
Check for errors returned by pthread_attr_setstacksize and
pthread_attr_destroy.
(sys_mutex_init, sys_cond_init): Abort on errors.
(sys_mutex_lock, sys_mutex_unlock, sys_cond_wait)
(sys_cond_signal, sys_cond_broadcast, sys_cond_destroy): Check for
errors in debug mode.
---
src/systhread.c | 61 ++++++++++++++++++++++++++++++++++---------------
src/systhread.h | 14 ++++++++----
2 files changed, 52 insertions(+), 23 deletions(-)
diff --git a/src/systhread.c b/src/systhread.c
index e972ed398a..71c13aa67b 100644
--- a/src/systhread.c
+++ b/src/systhread.c
@@ -18,6 +18,8 @@ along with GNU Emacs. If not, see . */
#include
#include
+#include
+#include
#include "lisp.h"
#ifdef HAVE_NS
@@ -80,11 +82,11 @@ sys_thread_equal (sys_thread_t t, sys_thread_t u)
return t == u;
}
-int
+bool
sys_thread_create (sys_thread_t *t, const char *name,
thread_creation_function *func, void *datum)
{
- return 0;
+ return false;
}
void
@@ -103,43 +105,60 @@ sys_thread_yield (void)
void
sys_mutex_init (sys_mutex_t *mutex)
{
- pthread_mutex_init (mutex, NULL);
+ int error = pthread_mutex_init (mutex, NULL);
+ /* We could get ENOMEM. Can't do anything except aborting. */
+ if (error != 0)
+ {
+ fprintf (stderr, "\npthread_mutex_init failed: %s\n", strerror (error));
+ emacs_abort ();
+ }
}
void
sys_mutex_lock (sys_mutex_t *mutex)
{
- pthread_mutex_lock (mutex);
+ int error = pthread_mutex_lock (mutex);
+ eassert (error == 0);
}
void
sys_mutex_unlock (sys_mutex_t *mutex)
{
- pthread_mutex_unlock (mutex);
+ int error = pthread_mutex_unlock (mutex);
+ eassert (error == 0);
}
void
sys_cond_init (sys_cond_t *cond)
{
- pthread_cond_init (cond, NULL);
+ int error = pthread_cond_init (cond, NULL);
+ /* We could get ENOMEM. Can't do anything except aborting. */
+ if (error != 0)
+ {
+ fprintf (stderr, "\npthread_cond_init failed: %s\n", strerror (error));
+ emacs_abort ();
+ }
}
void
sys_cond_wait (sys_cond_t *cond, sys_mutex_t *mutex)
{
- pthread_cond_wait (cond, mutex);
+ int error = pthread_cond_wait (cond, mutex);
+ eassert (error == 0);
}
void
sys_cond_signal (sys_cond_t *cond)
{
- pthread_cond_signal (cond);
+ int error = pthread_cond_signal (cond);
+ eassert (error == 0);
}
void
sys_cond_broadcast (sys_cond_t *cond)
{
- pthread_cond_broadcast (cond);
+ int error = pthread_cond_broadcast (cond);
+ eassert (error == 0);
#ifdef HAVE_NS
/* Send an app defined event to break out of the NS run loop.
It seems that if ns_select is running the NS run loop, this
@@ -152,7 +171,8 @@ sys_cond_broadcast (sys_cond_t *cond)
void
sys_cond_destroy (sys_cond_t *cond)
{
- pthread_cond_destroy (cond);
+ int error = pthread_cond_destroy (cond);
+ eassert (error == 0);
}
sys_thread_t
@@ -167,22 +187,25 @@ sys_thread_equal (sys_thread_t t, sys_thread_t u)
return pthread_equal (t, u);
}
-int
+bool
sys_thread_create (sys_thread_t *thread_ptr, const char *name,
thread_creation_function *func, void *arg)
{
pthread_attr_t attr;
- int result = 0;
+ bool result = false;
if (pthread_attr_init (&attr))
- return 0;
+ return false;
/* Avoid crash on macOS with deeply nested GC (Bug#30364). */
size_t stack_size;
size_t required_stack_size = sizeof (void *) * 1024 * 1024;
if (pthread_attr_getstacksize (&attr, &stack_size) == 0
&& stack_size < required_stack_size)
- pthread_attr_setstacksize (&attr, required_stack_size);
+ {
+ if (pthread_attr_setstacksize (&attr, required_stack_size) != 0)
+ goto out;
+ }
if (!pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED))
{
@@ -193,7 +216,9 @@ sys_thread_create (sys_thread_t *thread_ptr, const char *name,
#endif
}
- pthread_attr_destroy (&attr);
+ out: ;
+ int error = pthread_attr_destroy (&attr);
+ eassert (error == 0);
return result;
}
@@ -359,7 +384,7 @@ w32_beginthread_wrapper (void *arg)
(void)thread_start_address (arg);
}
-int
+bool
sys_thread_create (sys_thread_t *thread_ptr, const char *name,
thread_creation_function *func, void *arg)
{
@@ -383,7 +408,7 @@ sys_thread_create (sys_thread_t *thread_ptr, const char *name,
rule in many places... */
thandle = _beginthread (w32_beginthread_wrapper, stack_size, arg);
if (thandle == (uintptr_t)-1L)
- return 0;
+ return false;
/* Kludge alert! We use the Windows thread ID, an unsigned 32-bit
number, as the sys_thread_t type, because that ID is the only
@@ -398,7 +423,7 @@ sys_thread_create (sys_thread_t *thread_ptr, const char *name,
Therefore, we return some more or less arbitrary value of the
thread ID from this function. */
*thread_ptr = thandle & 0xFFFFFFFF;
- return 1;
+ return true;
}
void
diff --git a/src/systhread.h b/src/systhread.h
index 5dbb12dffb..a392feb080 100644
--- a/src/systhread.h
+++ b/src/systhread.h
@@ -19,6 +19,8 @@ along with GNU Emacs. If not, see . */
#ifndef SYSTHREAD_H
#define SYSTHREAD_H
+#include
+
#ifdef THREADS_ENABLED
#ifdef HAVE_PTHREAD
@@ -99,12 +101,14 @@ extern void sys_cond_signal (sys_cond_t *);
extern void sys_cond_broadcast (sys_cond_t *);
extern void sys_cond_destroy (sys_cond_t *);
-extern sys_thread_t sys_thread_self (void);
-extern bool sys_thread_equal (sys_thread_t, sys_thread_t);
+extern sys_thread_t sys_thread_self (void)
+ __attribute__ ((__warn_unused_result__));
+extern bool sys_thread_equal (sys_thread_t, sys_thread_t)
+ __attribute__ ((__warn_unused_result__));
-extern int sys_thread_create (sys_thread_t *, const char *,
- thread_creation_function *,
- void *);
+extern bool sys_thread_create (sys_thread_t *, const char *,
+ thread_creation_function *, void *)
+ __attribute__ ((__warn_unused_result__));
extern void sys_thread_yield (void);
--
2.17.1