Print this page
8158 Want named threads API
9857 proc manpages should have LIBRARY section
*** 23,37 ****
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
! * Copyright 2015, Joyent, Inc.
*/
#include "lint.h"
#include "thr_uberdata.h"
#include <sched.h>
/*
* Default attribute object for pthread_create() with NULL attr pointer.
* Note that the 'guardsize' field is initialized on the first call.
--- 23,39 ----
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
! * Copyright 2018, Joyent, Inc.
*/
#include "lint.h"
#include "thr_uberdata.h"
+ #include <sys/ctype.h>
+ #include <strings.h>
#include <sched.h>
/*
* Default attribute object for pthread_create() with NULL attr pointer.
* Note that the 'guardsize' field is initialized on the first call.
*** 46,56 ****
PTHREAD_CREATE_NONDAEMON_NP, /* daemonstate */
PTHREAD_SCOPE_PROCESS, /* scope */
0, /* prio */
SCHED_OTHER, /* policy */
PTHREAD_INHERIT_SCHED, /* inherit */
! 0 /* guardsize */
};
if (thrattr.guardsize == 0)
thrattr.guardsize = _sysconf(_SC_PAGESIZE);
return (&thrattr);
}
--- 48,59 ----
PTHREAD_CREATE_NONDAEMON_NP, /* daemonstate */
PTHREAD_SCOPE_PROCESS, /* scope */
0, /* prio */
SCHED_OTHER, /* policy */
PTHREAD_INHERIT_SCHED, /* inherit */
! 0, /* guardsize */
! { 0 } /* name */
};
if (thrattr.guardsize == 0)
thrattr.guardsize = _sysconf(_SC_PAGESIZE);
return (&thrattr);
}
*** 93,103 ****
int
pthread_attr_clone(pthread_attr_t *attr, const pthread_attr_t *old_attr)
{
thrattr_t *ap;
const thrattr_t *old_ap =
! old_attr? old_attr->__pthread_attrp : def_thrattr();
if (old_ap == NULL)
return (EINVAL);
if ((ap = lmalloc(sizeof (thrattr_t))) == NULL)
return (ENOMEM);
--- 96,106 ----
int
pthread_attr_clone(pthread_attr_t *attr, const pthread_attr_t *old_attr)
{
thrattr_t *ap;
const thrattr_t *old_ap =
! old_attr ? old_attr->__pthread_attrp : def_thrattr();
if (old_ap == NULL)
return (EINVAL);
if ((ap = lmalloc(sizeof (thrattr_t))) == NULL)
return (ENOMEM);
*** 112,123 ****
* This is a consolidation-private interface, for librt.
*/
int
pthread_attr_equal(const pthread_attr_t *attr1, const pthread_attr_t *attr2)
{
! const thrattr_t *ap1 = attr1? attr1->__pthread_attrp : def_thrattr();
! const thrattr_t *ap2 = attr2? attr2->__pthread_attrp : def_thrattr();
if (ap1 == NULL || ap2 == NULL)
return (0);
return (ap1 == ap2 || memcmp(ap1, ap2, sizeof (thrattr_t)) == 0);
}
--- 115,126 ----
* This is a consolidation-private interface, for librt.
*/
int
pthread_attr_equal(const pthread_attr_t *attr1, const pthread_attr_t *attr2)
{
! const thrattr_t *ap1 = attr1 ? attr1->__pthread_attrp : def_thrattr();
! const thrattr_t *ap2 = attr2 ? attr2->__pthread_attrp : def_thrattr();
if (ap1 == NULL || ap2 == NULL)
return (0);
return (ap1 == ap2 || memcmp(ap1, ap2, sizeof (thrattr_t)) == 0);
}
*** 474,483 ****
--- 477,533 ----
return (0);
}
return (EINVAL);
}
+ int
+ pthread_attr_setname_np(pthread_attr_t *attr, const char *name)
+ {
+ thrattr_t *ap;
+
+ if (attr == NULL || (ap = attr->__pthread_attrp) == NULL)
+ return (EINVAL);
+
+ if (name == NULL) {
+ bzero(ap->name, sizeof (ap->name));
+ return (0);
+ }
+
+ if (strlen(name) >= sizeof (ap->name))
+ return (ERANGE);
+
+ /*
+ * We really want the ASCII version of isprint() here...
+ */
+ for (size_t i = 0; name[i] != '\0'; i++) {
+ if (!ISPRINT(name[i]))
+ return (EINVAL);
+ }
+
+ /*
+ * not having garbage after the end of the string simplifies attr
+ * comparison
+ */
+ bzero(ap->name, sizeof (ap->name));
+ (void) strlcpy(ap->name, name, sizeof (ap->name));
+ return (0);
+ }
+
+ int
+ pthread_attr_getname_np(pthread_attr_t *attr, char *buf, size_t len)
+ {
+ thrattr_t *ap;
+
+ if (buf == NULL || attr == NULL ||
+ (ap = attr->__pthread_attrp) == NULL)
+ return (EINVAL);
+
+ if (strlcpy(buf, ap->name, len) > len)
+ return (ERANGE);
+ return (0);
+ }
+
/*
* This function is a common BSD extension to pthread which is used to obtain
* the attributes of a thread that might have changed after its creation, for
* example, it's stack address.
*
*** 549,558 ****
--- 599,609 ----
}
ap->prio = target->ul_pri;
ap->policy = target->ul_policy;
ap->inherit = target->ul_ptinherit;
ap->guardsize = target->ul_guardsize;
+ (void) pthread_getname_np(tid, ap->name, sizeof (ap->name));
ret = 0;
out:
ulwp_unlock(target, udp);
return (ret);