Author: davidxu
Date: Mon Oct 25 09:16:04 2010
New Revision: 214334
URL: http://svn.freebsd.org/changeset/base/214334

Log:
  Get cpuset in pthread_attr_get_np() and free it in pthread_attr_destroy().
  
  MFC after:    7 days

Modified:
  head/lib/libthr/thread/thr_attr.c
  head/lib/libthr/thread/thr_private.h

Modified: head/lib/libthr/thread/thr_attr.c
==============================================================================
--- head/lib/libthr/thread/thr_attr.c   Mon Oct 25 08:30:19 2010        
(r214333)
+++ head/lib/libthr/thread/thr_attr.c   Mon Oct 25 09:16:04 2010        
(r214334)
@@ -104,6 +104,8 @@
 
 #include "thr_private.h"
 
+static size_t  _get_kern_cpuset_size(void);
+
 __weak_reference(_pthread_attr_destroy, pthread_attr_destroy);
 
 int
@@ -116,6 +118,8 @@ _pthread_attr_destroy(pthread_attr_t *at
                /* Invalid argument: */
                ret = EINVAL;
        else {
+               if ((*attr)->cpuset != NULL)
+                       free((*attr)->cpuset);
                /* Free the memory allocated to the attribute object: */
                free(*attr);
 
@@ -132,28 +136,43 @@ _pthread_attr_destroy(pthread_attr_t *at
 __weak_reference(_pthread_attr_get_np, pthread_attr_get_np);
 
 int
-_pthread_attr_get_np(pthread_t pthread, pthread_attr_t *dst)
+_pthread_attr_get_np(pthread_t pthread, pthread_attr_t *dstattr)
 {
        struct pthread *curthread;
-       struct pthread_attr attr;
+       struct pthread_attr attr, *dst;
        int     ret;
+       size_t  cpusetsize;
 
-       if (pthread == NULL || dst == NULL || *dst == NULL)
+       if (pthread == NULL || dst_attr == NULL || (dst = *dstattr) == NULL)
                return (EINVAL);
-
+       cpusetsize = _get_kern_cpuset_size();
+       if (dst->cpusetsize < cpusetsize) {
+               char *newset = realloc(dst->cpuset, cpusetsize);
+               if (newset == NULL)
+                       return (errno);
+               memset(newset + dst->cpusetsize, 0, cpusetsize -
+                       dst->cpusetsize);
+               dst->cpuset = (cpuset_t *)newset;
+               dst->cpusetsize = cpusetsize;
+       }
        curthread = _get_curthread();
        if ((ret = _thr_find_thread(curthread, pthread, /*include dead*/0)) != 
0)
                return (ret);
        attr = pthread->attr;
        if (pthread->flags & THR_FLAGS_DETACHED)
                attr.flags |= PTHREAD_DETACHED;
+       ret = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, TID(pthread),
+               dst->cpusetsize, dst->cpuset);
+       if (ret == -1)
+               ret = errno;
        THR_THREAD_UNLOCK(curthread, pthread);
-
-       memcpy(*dst, &attr, sizeof(struct pthread_attr));
-       /* XXX */
-       (*dst)->cpuset = NULL;
-       (*dst)->cpusetsize = 0;
-       return (0);
+       if (ret == 0) {
+               memcpy(&dst->pthread_attr_start_copy, 
+                       &attr.pthread_attr_start_copy, 
+                       offsetof(struct pthread_attr, pthread_attr_end_copy) -
+                       offsetof(struct pthread_attr, pthread_attr_start_copy));
+       }
+       return (ret);
 }
 
 __weak_reference(_pthread_attr_getdetachstate, pthread_attr_getdetachstate);

Modified: head/lib/libthr/thread/thr_private.h
==============================================================================
--- head/lib/libthr/thread/thr_private.h        Mon Oct 25 08:30:19 2010        
(r214333)
+++ head/lib/libthr/thread/thr_private.h        Mon Oct 25 09:16:04 2010        
(r214334)
@@ -230,6 +230,7 @@ struct pthread_atfork {
 };
 
 struct pthread_attr {
+#define pthread_attr_start_copy        sched_policy
        int     sched_policy;
        int     sched_inherit;
        int     prio;
@@ -239,6 +240,7 @@ struct pthread_attr {
        void    *stackaddr_attr;
        size_t  stacksize_attr;
        size_t  guardsize_attr;
+#define pthread_attr_end_copy  cpuset
        cpuset_t        *cpuset;
        size_t  cpusetsize;
 };
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to