summaryrefslogtreecommitdiff
path: root/libs/pthreads/src/create.c
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2021-06-06 22:01:10 +0300
committerGeorge Hazan <ghazan@miranda.im>2021-06-06 22:01:10 +0300
commitb18dd79bc6b6ee3658ef4513665cb84c24030368 (patch)
tree52dcfedbf246865021e0cb0e13f9ff22b08d9504 /libs/pthreads/src/create.c
parentfedcdca7ed8f402550227c5c6e9c1d28417b896c (diff)
fixes #2909 (pthreads updated to 2.11.0)
Diffstat (limited to 'libs/pthreads/src/create.c')
-rw-r--r--libs/pthreads/src/create.c263
1 files changed, 147 insertions, 116 deletions
diff --git a/libs/pthreads/src/create.c b/libs/pthreads/src/create.c
index 8b036cc2e9..cc59419bc1 100644
--- a/libs/pthreads/src/create.c
+++ b/libs/pthreads/src/create.c
@@ -7,34 +7,38 @@
*
* --------------------------------------------------------------------------
*
- * Pthreads-win32 - POSIX Threads Library for Win32
+ * Pthreads4w - POSIX Threads Library for Win32
* Copyright(C) 1998 John E. Bossom
- * Copyright(C) 1999,2005 Pthreads-win32 contributors
- *
- * Contact Email: rpj@callisto.canberra.edu.au
- *
+ * Copyright(C) 1999-2018, Pthreads4w contributors
+ *
+ * Homepage: https://sourceforge.net/projects/pthreads4w/
+ *
* The current list of contributors is contained
* in the file CONTRIBUTORS included with the source
* code distribution. The list can also be seen at the
* following World Wide Web location:
- * http://sources.redhat.com/pthreads-win32/contributors.html
- *
- * This 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 of the License, or (at your option) any later version.
- *
- * This 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 this library in the file COPYING.LIB;
- * if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * https://sourceforge.net/p/pthreads4w/wiki/Contributors/
+ *
+ * This file is part of Pthreads4w.
+ *
+ * Pthreads4w is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Pthreads4w 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Pthreads4w. If not, see <http://www.gnu.org/licenses/>. *
*/
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
#include "pthread.h"
#include "implement.h"
#if ! defined(_UWIN) && ! defined(WINCE)
@@ -43,48 +47,49 @@
int
pthread_create (pthread_t * tid,
- const pthread_attr_t * attr,
- void *(PTW32_CDECL *start) (void *), void *arg)
- /*
- * ------------------------------------------------------
- * DOCPUBLIC
- * This function creates a thread running the start function,
- * passing it the parameter value, 'arg'. The 'attr'
- * argument specifies optional creation attributes.
- * The identity of the new thread is returned
- * via 'tid', which should not be NULL.
- *
- * PARAMETERS
- * tid
- * pointer to an instance of pthread_t
- *
- * attr
- * optional pointer to an instance of pthread_attr_t
- *
- * start
- * pointer to the starting routine for the new thread
- *
- * arg
- * optional parameter passed to 'start'
- *
- *
- * DESCRIPTION
- * This function creates a thread running the start function,
- * passing it the parameter value, 'arg'. The 'attr'
- * argument specifies optional creation attributes.
- * The identity of the new thread is returned
- * via 'tid', which should not be the NULL pointer.
- *
- * RESULTS
- * 0 successfully created thread,
- * EINVAL attr invalid,
- * EAGAIN insufficient resources.
- *
- * ------------------------------------------------------
- */
+ const pthread_attr_t * attr,
+ void *(PTW32_CDECL *start) (void *), void *arg)
+/*
+ * ------------------------------------------------------
+ * DOCPUBLIC
+ * This function creates a thread running the start function,
+ * passing it the parameter value, 'arg'. The 'attr'
+ * argument specifies optional creation attributes.
+ * The identity of the new thread is returned
+ * via 'tid', which should not be NULL.
+ *
+ * PARAMETERS
+ * tid
+ * pointer to an instance of pthread_t
+ *
+ * attr
+ * optional pointer to an instance of pthread_attr_t
+ *
+ * start
+ * pointer to the starting routine for the new thread
+ *
+ * arg
+ * optional parameter passed to 'start'
+ *
+ *
+ * DESCRIPTION
+ * This function creates a thread running the start function,
+ * passing it the parameter value, 'arg'. The 'attr'
+ * argument specifies optional creation attributes.
+ * The identity of the new thread is returned
+ * via 'tid', which should not be the NULL pointer.
+ *
+ * RESULTS
+ * 0 successfully created thread,
+ * EINVAL attr invalid,
+ * EAGAIN insufficient resources.
+ *
+ * ------------------------------------------------------
+ */
{
pthread_t thread;
ptw32_thread_t * tp;
+ ptw32_thread_t * sp;
register pthread_attr_t a;
HANDLE threadH = 0;
int result = EAGAIN;
@@ -92,7 +97,6 @@ pthread_create (pthread_t * tid,
ThreadParms *parms = NULL;
unsigned int stackSize;
int priority;
- pthread_t self;
/*
* Before doing anything, check that tid can be stored through
@@ -102,6 +106,11 @@ pthread_create (pthread_t * tid,
*/
tid->x = 0;
+ if (NULL == (sp = (ptw32_thread_t *)pthread_self().p))
+ {
+ goto FAIL0;
+ }
+
if (attr != NULL)
{
a = *attr;
@@ -111,7 +120,8 @@ pthread_create (pthread_t * tid,
a = NULL;
}
- if ((thread = ptw32_new ()).p == NULL)
+ thread = ptw32_new();
+ if (thread.p == NULL)
{
goto FAIL0;
}
@@ -129,22 +139,34 @@ pthread_create (pthread_t * tid,
parms->start = start;
parms->arg = arg;
-#if defined(HAVE_SIGSET_T)
-
/*
- * Threads inherit their initial sigmask from their creator thread.
+ * Threads inherit their initial sigmask and CPU affinity from their creator thread.
*/
- self = pthread_self();
- tp->sigmask = ((ptw32_thread_t *)self.p)->sigmask;
-
-#endif /* HAVE_SIGSET_T */
-
+#if defined(HAVE_SIGSET_T)
+ tp->sigmask = sp->sigmask;
+#endif
+#if defined(HAVE_CPU_AFFINITY)
+ tp->cpuset = sp->cpuset;
+#endif
if (a != NULL)
{
+#if defined(HAVE_CPU_AFFINITY)
+ cpu_set_t none;
+ cpu_set_t attr_cpuset;
+ ((_sched_cpu_set_vector_*)&attr_cpuset)->_cpuset = a->cpuset;
+
+ CPU_ZERO(&none);
+ if (! CPU_EQUAL(&attr_cpuset, &none))
+ {
+ tp->cpuset = a->cpuset;
+ }
+#endif
stackSize = (unsigned int)a->stacksize;
tp->detachState = a->detachstate;
priority = a->param.sched_priority;
+ if (a->thrname != NULL)
+ tp->name = _strdup(a->thrname);
#if (THREAD_PRIORITY_LOWEST > THREAD_PRIORITY_NORMAL)
/* WinCE */
@@ -164,17 +186,14 @@ pthread_create (pthread_t * tid,
* PTHREAD_EXPLICIT_SCHED and priority THREAD_PRIORITY_NORMAL.
*/
if (PTHREAD_INHERIT_SCHED == a->inheritsched)
- {
- /*
- * If the thread that called pthread_create() is a Win32 thread
- * then the inherited priority could be the result of a temporary
- * system adjustment. This is not the case for POSIX threads.
- */
-#if ! defined(HAVE_SIGSET_T)
- self = pthread_self ();
-#endif
- priority = ((ptw32_thread_t *) self.p)->sched_priority;
- }
+ {
+ /*
+ * If the thread that called pthread_create() is a Win32 thread
+ * then the inherited priority could be the result of a temporary
+ * system adjustment. This is not the case for POSIX threads.
+ */
+ priority = sp->sched_priority;
+ }
#endif
@@ -200,29 +219,35 @@ pthread_create (pthread_t * tid,
* finished with it here.
*/
-#if ! (defined (__MINGW64__) || defined(__MINGW32__)) || defined (__MSVCRT__) || defined (__DMC__)
+#if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__)
tp->threadH =
- threadH =
- (HANDLE) _beginthreadex ((void *) NULL, /* No security info */
- stackSize, /* default stack size */
- ptw32_threadStart,
- parms,
- (unsigned)
- CREATE_SUSPENDED,
- (unsigned *) &(tp->thread));
+ threadH =
+ (HANDLE) _beginthreadex ((void *) NULL, /* No security info */
+ stackSize, /* default stack size */
+ ptw32_threadStart,
+ parms,
+ (unsigned)
+ CREATE_SUSPENDED,
+ (unsigned *) &(tp->thread));
if (threadH != 0)
{
if (a != NULL)
- {
- (void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority);
- }
+ {
+ (void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority);
+ }
+
+#if defined(HAVE_CPU_AFFINITY)
+
+ SetThreadAffinityMask(tp->threadH, tp->cpuset);
+
+#endif
if (run)
- {
- ResumeThread (threadH);
- }
+ {
+ ResumeThread (threadH);
+ }
}
#else
@@ -237,9 +262,9 @@ pthread_create (pthread_t * tid,
ptw32_mcs_lock_acquire(&tp->stateLock, &stateLock);
tp->threadH =
- threadH =
- (HANDLE) _beginthread (ptw32_threadStart, stackSize, /* default stack size */
- parms);
+ threadH =
+ (HANDLE) _beginthread (ptw32_threadStart, stackSize, /* default stack size */
+ parms);
/*
* Make the return code match _beginthreadex's.
@@ -251,19 +276,26 @@ pthread_create (pthread_t * tid,
else
{
if (!run)
- {
- /*
- * beginthread does not allow for create flags, so we do it now.
- * Note that beginthread itself creates the thread in SUSPENDED
- * mode, and then calls ResumeThread to start it.
- */
- SuspendThread (threadH);
- }
-
+ {
+ /*
+ * beginthread does not allow for create flags, so we do it now.
+ * Note that beginthread itself creates the thread in SUSPENDED
+ * mode, and then calls ResumeThread to start it.
+ */
+ SuspendThread (threadH);
+ }
+
if (a != NULL)
- {
- (void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority);
- }
+ {
+ (void) ptw32_setthreadpriority (thread, SCHED_OTHER, priority);
+ }
+
+#if defined(HAVE_CPU_AFFINITY)
+
+ SetThreadAffinityMask(tp->threadH, tp->cpuset);
+
+#endif
+
}
ptw32_mcs_lock_release (&stateLock);
@@ -282,7 +314,7 @@ pthread_create (pthread_t * tid,
* ------------
*/
-FAIL0:
+ FAIL0:
if (result != 0)
{
@@ -290,9 +322,9 @@ FAIL0:
tp = NULL;
if (parms != NULL)
- {
- free (parms);
- }
+ {
+ free (parms);
+ }
}
else
{
@@ -304,5 +336,4 @@ FAIL0:
pthread_count++;
#endif
return (result);
-
} /* pthread_create */