From dd3f56983db530edc2322f8b7f81ccf466ad392d Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Wed, 10 Dec 2008 11:18:37 -0800 Subject: [PATCH] Add stack_getbounds() and thr_stksegment() interfaces --- zfs/lib/libspl/include/sys/frame.h | 8 +++++ zfs/lib/libspl/include/sys/stack.h | 58 ++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 zfs/lib/libspl/include/sys/frame.h create mode 100644 zfs/lib/libspl/include/sys/stack.h diff --git a/zfs/lib/libspl/include/sys/frame.h b/zfs/lib/libspl/include/sys/frame.h new file mode 100644 index 0000000000..9e2fa0bb2f --- /dev/null +++ b/zfs/lib/libspl/include/sys/frame.h @@ -0,0 +1,8 @@ +/* + * This header file distributed under the terms of the CDDL. + * Portions Copyright 2008 Sun Microsystems, Inc. All Rights reserved. + */ +#ifndef _SYS_FRAME_H +#define _SYS_FRAME_H + +#endif /* _SYS_FRAME_H */ diff --git a/zfs/lib/libspl/include/sys/stack.h b/zfs/lib/libspl/include/sys/stack.h new file mode 100644 index 0000000000..a8f5a921d3 --- /dev/null +++ b/zfs/lib/libspl/include/sys/stack.h @@ -0,0 +1,58 @@ +/* + * This header file distributed under the terms of the CDDL. + * Portions Copyright 2008 Sun Microsystems, Inc. All Rights reserved. + */ +#ifndef _SYS_STACK_H +#define _SYS_STACK_H + +#include + +#define STACK_BIAS 0 + +typedef struct { + void *ss_sp; + size_t ss_size; + int ss_flags; +} stack_t; + +#ifdef __USE_GNU + +static inline int +stack_getbounds(stack_t *sp) +{ + pthread_attr_t attr; + int rc; + + rc = pthread_getattr_np(pthread_self(), &attr); + if (rc) + return rc; + + rc = pthread_attr_getstack(&attr, &sp->ss_sp, &sp->ss_size); + if (rc == 0) + sp->ss_flags = 0; + + pthread_attr_destroy(&attr); + + return rc; +} + +static inline int +thr_stksegment(stack_t *sp) +{ + int rc; + + rc = stack_getbounds(sp); + if (rc) + return rc; + + /* thr_stksegment() is expected to set sp.ss_sp to the high stack + * address, but the stack_getbounds() interface is expected to + * set sp.ss_sp to the low address. Adjust accordingly. */ + sp->ss_sp = (void *)(((uintptr_t)sp->ss_sp) + sp->ss_size); + sp->ss_flags = 0; + + return rc; +} + +#endif /* __USE_GNU */ +#endif /* _SYS_STACK_H */