diff options
Diffstat (limited to 'nptl/pthread_attr_copy.c')
-rw-r--r-- | nptl/pthread_attr_copy.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/nptl/pthread_attr_copy.c b/nptl/pthread_attr_copy.c new file mode 100644 index 0000000000..77a1a43eeb --- /dev/null +++ b/nptl/pthread_attr_copy.c @@ -0,0 +1,57 @@ +/* Deep copy of a pthread_attr_t object. + Copyright (C) 2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <pthreadP.h> +#include <stdlib.h> + +int +__pthread_attr_copy (pthread_attr_t *target, const pthread_attr_t *source) +{ + /* Avoid overwriting *TARGET until all allocations have + succeeded. */ + union pthread_attr_transparent temp; + temp.external = *source; + + /* Force new allocation. This function has full ownership of temp. */ + temp.internal.cpuset = NULL; + temp.internal.cpusetsize = 0; + + int ret = 0; + + struct pthread_attr *isource = (struct pthread_attr *) source; + + /* Propagate affinity mask information. */ + if (isource->cpusetsize > 0) + ret = __pthread_attr_setaffinity_np (&temp.external, + isource->cpusetsize, + isource->cpuset); + + if (ret != 0) + { + /* Deallocate because we have ownership. */ + __pthread_attr_destroy (&temp.external); + return ret; + } + + /* Transfer ownership. *target is not assumed to have been + initialized. */ + *target = temp.external; + return 0; +} +libc_hidden_def (__pthread_attr_copy) |