-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bundles musl 1.1.21 See #514
- Loading branch information
Showing
1,801 changed files
with
75,395 additions
and
289 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
#include <aio.h> | ||
#include <errno.h> | ||
#include <time.h> | ||
#include "atomic.h" | ||
#include "pthread_impl.h" | ||
|
||
int aio_suspend(const struct aiocb *const cbs[], int cnt, const struct timespec *ts) | ||
{ | ||
int i, tid = 0, ret, expect = 0; | ||
struct timespec at; | ||
volatile int dummy_fut, *pfut; | ||
int nzcnt = 0; | ||
const struct aiocb *cb = 0; | ||
|
||
pthread_testcancel(); | ||
|
||
if (cnt<0) { | ||
errno = EINVAL; | ||
return -1; | ||
} | ||
|
||
for (i=0; i<cnt; i++) if (cbs[i]) { | ||
if (aio_error(cbs[i]) != EINPROGRESS) return 0; | ||
nzcnt++; | ||
cb = cbs[i]; | ||
} | ||
|
||
if (ts) { | ||
clock_gettime(CLOCK_MONOTONIC, &at); | ||
at.tv_sec += ts->tv_sec; | ||
if ((at.tv_nsec += ts->tv_nsec) >= 1000000000) { | ||
at.tv_nsec -= 1000000000; | ||
at.tv_sec++; | ||
} | ||
} | ||
|
||
for (;;) { | ||
for (i=0; i<cnt; i++) | ||
if (cbs[i] && aio_error(cbs[i]) != EINPROGRESS) | ||
return 0; | ||
|
||
switch (nzcnt) { | ||
case 0: | ||
pfut = &dummy_fut; | ||
break; | ||
case 1: | ||
pfut = (void *)&cb->__err; | ||
expect = EINPROGRESS | 0x80000000; | ||
a_cas(pfut, EINPROGRESS, expect); | ||
break; | ||
default: | ||
pfut = &__aio_fut; | ||
if (!tid) tid = __pthread_self()->tid; | ||
expect = a_cas(pfut, 0, tid); | ||
if (!expect) expect = tid; | ||
/* Need to recheck the predicate before waiting. */ | ||
for (i=0; i<cnt; i++) | ||
if (cbs[i] && aio_error(cbs[i]) != EINPROGRESS) | ||
return 0; | ||
break; | ||
} | ||
|
||
ret = __timedwait_cp(pfut, expect, CLOCK_MONOTONIC, ts?&at:0, 1); | ||
|
||
switch (ret) { | ||
case ETIMEDOUT: | ||
ret = EAGAIN; | ||
case ECANCELED: | ||
case EINTR: | ||
errno = ret; | ||
return -1; | ||
} | ||
} | ||
} | ||
|
||
weak_alias(aio_suspend, aio_suspend64); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,143 @@ | ||
#include <aio.h> | ||
#include <errno.h> | ||
#include <unistd.h> | ||
#include <string.h> | ||
#include "pthread_impl.h" | ||
|
||
struct lio_state { | ||
struct sigevent *sev; | ||
int cnt; | ||
struct aiocb *cbs[]; | ||
}; | ||
|
||
static int lio_wait(struct lio_state *st) | ||
{ | ||
int i, err, got_err = 0; | ||
int cnt = st->cnt; | ||
struct aiocb **cbs = st->cbs; | ||
|
||
for (;;) { | ||
for (i=0; i<cnt; i++) { | ||
if (!cbs[i]) continue; | ||
err = aio_error(cbs[i]); | ||
if (err==EINPROGRESS) | ||
break; | ||
if (err) got_err=1; | ||
cbs[i] = 0; | ||
} | ||
if (i==cnt) { | ||
if (got_err) { | ||
errno = EIO; | ||
return -1; | ||
} | ||
return 0; | ||
} | ||
if (aio_suspend((void *)cbs, cnt, 0)) | ||
return -1; | ||
} | ||
} | ||
|
||
static void notify_signal(struct sigevent *sev) | ||
{ | ||
siginfo_t si = { | ||
.si_signo = sev->sigev_signo, | ||
.si_value = sev->sigev_value, | ||
.si_code = SI_ASYNCIO, | ||
.si_pid = getpid(), | ||
.si_uid = getuid() | ||
}; | ||
__syscall(SYS_rt_sigqueueinfo, si.si_pid, si.si_signo, &si); | ||
} | ||
|
||
static void *wait_thread(void *p) | ||
{ | ||
struct lio_state *st = p; | ||
struct sigevent *sev = st->sev; | ||
lio_wait(st); | ||
free(st); | ||
switch (sev->sigev_notify) { | ||
case SIGEV_SIGNAL: | ||
notify_signal(sev); | ||
break; | ||
case SIGEV_THREAD: | ||
sev->sigev_notify_function(sev->sigev_value); | ||
break; | ||
} | ||
return 0; | ||
} | ||
|
||
int lio_listio(int mode, struct aiocb *restrict const *restrict cbs, int cnt, struct sigevent *restrict sev) | ||
{ | ||
int i, ret; | ||
struct lio_state *st=0; | ||
|
||
if (cnt < 0) { | ||
errno = EINVAL; | ||
return -1; | ||
} | ||
|
||
if (mode == LIO_WAIT || (sev && sev->sigev_notify != SIGEV_NONE)) { | ||
if (!(st = malloc(sizeof *st + cnt*sizeof *cbs))) { | ||
errno = EAGAIN; | ||
return -1; | ||
} | ||
st->cnt = cnt; | ||
st->sev = sev; | ||
memcpy(st->cbs, (void*) cbs, cnt*sizeof *cbs); | ||
} | ||
|
||
for (i=0; i<cnt; i++) { | ||
if (!cbs[i]) continue; | ||
switch (cbs[i]->aio_lio_opcode) { | ||
case LIO_READ: | ||
ret = aio_read(cbs[i]); | ||
break; | ||
case LIO_WRITE: | ||
ret = aio_write(cbs[i]); | ||
break; | ||
default: | ||
continue; | ||
} | ||
if (ret) { | ||
free(st); | ||
errno = EAGAIN; | ||
return -1; | ||
} | ||
} | ||
|
||
if (mode == LIO_WAIT) { | ||
ret = lio_wait(st); | ||
free(st); | ||
return ret; | ||
} | ||
|
||
if (st) { | ||
pthread_attr_t a; | ||
sigset_t set; | ||
pthread_t td; | ||
|
||
if (sev->sigev_notify == SIGEV_THREAD) { | ||
if (sev->sigev_notify_attributes) | ||
a = *sev->sigev_notify_attributes; | ||
else | ||
pthread_attr_init(&a); | ||
} else { | ||
pthread_attr_init(&a); | ||
pthread_attr_setstacksize(&a, PAGE_SIZE); | ||
pthread_attr_setguardsize(&a, 0); | ||
} | ||
pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED); | ||
sigfillset(&set); | ||
pthread_sigmask(SIG_BLOCK, &set, &set); | ||
if (pthread_create(&td, &a, wait_thread, st)) { | ||
free(st); | ||
errno = EAGAIN; | ||
return -1; | ||
} | ||
pthread_sigmask(SIG_SETMASK, &set, 0); | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
weak_alias(lio_listio, lio_listio64); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
/* origin: FreeBSD /usr/src/lib/msun/src/k_exp.c */ | ||
/*- | ||
* Copyright (c) 2011 David Schultz <[email protected]> | ||
* 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 AUTHOR 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 AUTHOR 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 "libm.h" | ||
|
||
static const uint32_t k = 1799; /* constant for reduction */ | ||
static const double kln2 = 1246.97177782734161156; /* k * ln2 */ | ||
|
||
/* | ||
* Compute exp(x), scaled to avoid spurious overflow. An exponent is | ||
* returned separately in 'expt'. | ||
* | ||
* Input: ln(DBL_MAX) <= x < ln(2 * DBL_MAX / DBL_MIN_DENORM) ~= 1454.91 | ||
* Output: 2**1023 <= y < 2**1024 | ||
*/ | ||
static double __frexp_exp(double x, int *expt) | ||
{ | ||
double exp_x; | ||
uint32_t hx; | ||
|
||
/* | ||
* We use exp(x) = exp(x - kln2) * 2**k, carefully chosen to | ||
* minimize |exp(kln2) - 2**k|. We also scale the exponent of | ||
* exp_x to MAX_EXP so that the result can be multiplied by | ||
* a tiny number without losing accuracy due to denormalization. | ||
*/ | ||
exp_x = exp(x - kln2); | ||
GET_HIGH_WORD(hx, exp_x); | ||
*expt = (hx >> 20) - (0x3ff + 1023) + k; | ||
SET_HIGH_WORD(exp_x, (hx & 0xfffff) | ((0x3ff + 1023) << 20)); | ||
return exp_x; | ||
} | ||
|
||
/* | ||
* __ldexp_cexp(x, expt) compute exp(x) * 2**expt. | ||
* It is intended for large arguments (real part >= ln(DBL_MAX)) | ||
* where care is needed to avoid overflow. | ||
* | ||
* The present implementation is narrowly tailored for our hyperbolic and | ||
* exponential functions. We assume expt is small (0 or -1), and the caller | ||
* has filtered out very large x, for which overflow would be inevitable. | ||
*/ | ||
double complex __ldexp_cexp(double complex z, int expt) | ||
{ | ||
double x, y, exp_x, scale1, scale2; | ||
int ex_expt, half_expt; | ||
|
||
x = creal(z); | ||
y = cimag(z); | ||
exp_x = __frexp_exp(x, &ex_expt); | ||
expt += ex_expt; | ||
|
||
/* | ||
* Arrange so that scale1 * scale2 == 2**expt. We use this to | ||
* compensate for scalbn being horrendously slow. | ||
*/ | ||
half_expt = expt / 2; | ||
INSERT_WORDS(scale1, (0x3ff + half_expt) << 20, 0); | ||
half_expt = expt - half_expt; | ||
INSERT_WORDS(scale2, (0x3ff + half_expt) << 20, 0); | ||
|
||
return CMPLX(cos(y) * exp_x * scale1 * scale2, sin(y) * exp_x * scale1 * scale2); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
/* origin: FreeBSD /usr/src/lib/msun/src/k_expf.c */ | ||
/*- | ||
* Copyright (c) 2011 David Schultz <[email protected]> | ||
* 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 AUTHOR 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 AUTHOR 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 "libm.h" | ||
|
||
static const uint32_t k = 235; /* constant for reduction */ | ||
static const float kln2 = 162.88958740F; /* k * ln2 */ | ||
|
||
/* | ||
* See __cexp.c for details. | ||
* | ||
* Input: ln(FLT_MAX) <= x < ln(2 * FLT_MAX / FLT_MIN_DENORM) ~= 192.7 | ||
* Output: 2**127 <= y < 2**128 | ||
*/ | ||
static float __frexp_expf(float x, int *expt) | ||
{ | ||
float exp_x; | ||
uint32_t hx; | ||
|
||
exp_x = expf(x - kln2); | ||
GET_FLOAT_WORD(hx, exp_x); | ||
*expt = (hx >> 23) - (0x7f + 127) + k; | ||
SET_FLOAT_WORD(exp_x, (hx & 0x7fffff) | ((0x7f + 127) << 23)); | ||
return exp_x; | ||
} | ||
|
||
float complex __ldexp_cexpf(float complex z, int expt) | ||
{ | ||
float x, y, exp_x, scale1, scale2; | ||
int ex_expt, half_expt; | ||
|
||
x = crealf(z); | ||
y = cimagf(z); | ||
exp_x = __frexp_expf(x, &ex_expt); | ||
expt += ex_expt; | ||
|
||
half_expt = expt / 2; | ||
SET_FLOAT_WORD(scale1, (0x7f + half_expt) << 23); | ||
half_expt = expt - half_expt; | ||
SET_FLOAT_WORD(scale2, (0x7f + half_expt) << 23); | ||
|
||
return CMPLXF(cosf(y) * exp_x * scale1 * scale2, | ||
sinf(y) * exp_x * scale1 * scale2); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#include "libm.h" | ||
|
||
double cabs(double complex z) | ||
{ | ||
return hypot(creal(z), cimag(z)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#include "libm.h" | ||
|
||
float cabsf(float complex z) | ||
{ | ||
return hypotf(crealf(z), cimagf(z)); | ||
} |
Oops, something went wrong.