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