aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2017-03-30 04:57:26 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2017-03-30 04:57:26 +0000
commit9851b3400ae1362185d9ffe3c163428b9faa6b9f (patch)
tree5310615d6631002e7262db4e9ea81f3338f4fcb8 /lib/libc/stdlib
parent653e7d639682be855c34415b1b7542d9388aafd6 (diff)
Notes
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r--lib/libc/stdlib/Makefile.inc4
-rw-r--r--lib/libc/stdlib/Symbol.map3
-rw-r--r--lib/libc/stdlib/set_constraint_handler_s.c95
3 files changed, 100 insertions, 2 deletions
diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc
index 00f90e2f81e08..25850929efa8c 100644
--- a/lib/libc/stdlib/Makefile.inc
+++ b/lib/libc/stdlib/Makefile.inc
@@ -13,8 +13,8 @@ MISRCS+=C99_Exit.c a64l.c abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c \
insque.c l64a.c labs.c ldiv.c llabs.c lldiv.c lsearch.c \
merge.c mergesort_b.c ptsname.c qsort.c qsort_r.c quick_exit.c \
radixsort.c rand.c \
- random.c reallocarray.c reallocf.c realpath.c remque.c strfmon.c \
- strtoimax.c \
+ random.c reallocarray.c reallocf.c realpath.c remque.c \
+ set_constraint_handler_s.c strfmon.c strtoimax.c \
strtol.c strtoll.c strtoq.c strtoul.c strtonum.c strtoull.c \
strtoumax.c strtouq.c system.c tdelete.c tfind.c tsearch.c twalk.c
diff --git a/lib/libc/stdlib/Symbol.map b/lib/libc/stdlib/Symbol.map
index a239a42018d6c..65a0ee9abf7c3 100644
--- a/lib/libc/stdlib/Symbol.map
+++ b/lib/libc/stdlib/Symbol.map
@@ -119,6 +119,9 @@ FBSD_1.4 {
FBSD_1.5 {
__cxa_thread_atexit;
__cxa_thread_atexit_impl;
+ abort_handler_s;
+ ignore_handler_s;
+ set_constraint_handler_s;
};
FBSDprivate_1.0 {
diff --git a/lib/libc/stdlib/set_constraint_handler_s.c b/lib/libc/stdlib/set_constraint_handler_s.c
new file mode 100644
index 0000000000000..dafdb16528be6
--- /dev/null
+++ b/lib/libc/stdlib/set_constraint_handler_s.c
@@ -0,0 +1,95 @@
+/*-
+ * Copyright (c) 2017 Juniper Networks. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include "namespace.h"
+#include <sys/types.h>
+#include <machine/atomic.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include "un-namespace.h"
+#include "libc_private.h"
+
+/*
+ * Rationale recommends allocating new memory each time.
+ */
+static constraint_handler_t *_ch = NULL;
+static pthread_mutex_t ch_lock = PTHREAD_MUTEX_INITIALIZER;
+
+constraint_handler_t
+set_constraint_handler_s(constraint_handler_t handler)
+{
+ constraint_handler_t *new, *old, ret;
+
+ new = malloc(sizeof(constraint_handler_t));
+ if (new == NULL)
+ return (NULL);
+ *new = handler;
+ if (__isthreaded)
+ _pthread_mutex_lock(&ch_lock);
+ old = _ch;
+ _ch = new;
+ if (__isthreaded)
+ _pthread_mutex_unlock(&ch_lock);
+ if (old == NULL) {
+ ret = NULL;
+ } else {
+ ret = *old;
+ free(old);
+ }
+ return (ret);
+}
+
+void
+__throw_constraint_handler_s(const char * restrict msg, errno_t error)
+{
+ constraint_handler_t ch;
+
+ if (__isthreaded)
+ _pthread_mutex_lock(&ch_lock);
+ ch = _ch != NULL ? *_ch : NULL;
+ if (__isthreaded)
+ _pthread_mutex_unlock(&ch_lock);
+ if (ch != NULL)
+ ch(msg, NULL, error);
+}
+
+void
+abort_handler_s(const char * restrict msg __unused,
+ void * restrict ptr __unused, errno_t error __unused)
+{
+
+ abort();
+}
+
+void
+ignore_handler_s(const char * restrict msg __unused,
+ void * restrict ptr __unused, errno_t error __unused)
+{
+}