summaryrefslogtreecommitdiff
path: root/components/pthreads/pthread_attr.c
diff options
context:
space:
mode:
authorbernard.xiong <[email protected]>2010-11-12 10:26:36 +0000
committerbernard.xiong <[email protected]>2010-11-12 10:26:36 +0000
commit25f50375ef71f2aa4928fbf814973f118ed1fadd (patch)
treee57c94ce971d50d9c7c3f1bfcb73b34d4382a788 /components/pthreads/pthread_attr.c
parent7018ab0661e5a5c4be00283a5ab9eabc5d3ab0ee (diff)
add initial pthread implementation.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1044 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/pthreads/pthread_attr.c')
-rw-r--r--components/pthreads/pthread_attr.c161
1 files changed, 161 insertions, 0 deletions
diff --git a/components/pthreads/pthread_attr.c b/components/pthreads/pthread_attr.c
new file mode 100644
index 0000000000..02b9ec6cdd
--- /dev/null
+++ b/components/pthreads/pthread_attr.c
@@ -0,0 +1,161 @@
+#include <rtthread.h>
+#include "pthread.h"
+#include <string.h>
+
+#define DEFAULT_STACK_SIZE 2048
+#define DEFAULT_PRIORITY (RT_THREAD_PRIORITY_MAX/2 + RT_THREAD_PRIORITY_MAX/4)
+
+const pthread_attr_t pthread_default_attr =
+{
+ 0, /* stack base */
+ DEFAULT_STACK_SIZE, /* stack size */
+ DEFAULT_PRIORITY, /* priority */
+ PTHREAD_CREATE_JOINABLE, /* detach state */
+ SCHED_FIFO, /* scheduler policy */
+ PTHREAD_INHERIT_SCHED /* Inherit parent prio/policy */
+};
+
+int pthread_attr_init(pthread_attr_t *attr)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ *attr = pthread_default_attr;
+
+ return 0;
+}
+
+int pthread_attr_destroy(pthread_attr_t *attr)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ memset(attr, 0, sizeof(pthread_attr_t));
+ return 0;
+}
+
+int pthread_attr_setdetachstate(pthread_attr_t * attr, int state)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ if (state != PTHREAD_CREATE_JOINABLE && state != PTHREAD_CREATE_DETACHED)
+ return EINVAL;
+
+ attr->detachstate = state;
+ return 0;
+}
+
+int pthread_attr_getdetachstate(pthread_attr_t const * attr, int *state)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ *state = (int)attr->detachstate;
+
+ return 0;
+}
+
+int pthread_attr_setschedpolicy(pthread_attr_t * attr, int policy)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ attr->policy = policy;
+ return 0;
+}
+
+int pthread_attr_getschedpolicy(pthread_attr_t const *attr, int *policy)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ *policy = (int)attr->policy;
+ return 0;
+}
+
+int pthread_attr_setschedparam(pthread_attr_t *attr, struct sched_param const *param)
+{
+ RT_ASSERT(attr != RT_NULL);
+ RT_ASSERT(param != RT_NULL);
+
+ attr->priority = param->sched_priority;
+ return 0;
+}
+
+int pthread_attr_getschedparam(pthread_attr_t const *attr, struct sched_param *param)
+{
+ RT_ASSERT(attr != RT_NULL);
+ RT_ASSERT(param != RT_NULL);
+
+ param->sched_priority = attr->priority;
+ return 0;
+}
+
+int pthread_attr_setstacksize(pthread_attr_t * attr, size_t stack_size)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ attr->stack_size = stack_size;
+ return 0;
+}
+
+int pthread_attr_getstacksize(pthread_attr_t const * attr, size_t *stack_size)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ *stack_size = attr->stack_size;
+ return 0;
+}
+
+int pthread_attr_setstackaddr(pthread_attr_t * attr, void * stack_addr)
+{
+ RT_ASSERT(attr != RT_NULL);
+ return ENOTSUP;
+}
+
+int pthread_attr_getstackaddr(pthread_attr_t const * attr, void ** stack_addr)
+{
+ RT_ASSERT(attr != RT_NULL);
+ return ENOTSUP;
+}
+
+int pthread_attr_setstack(pthread_attr_t * attr, void *stack_base, size_t stack_size)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ attr->stack_base = stack_base;
+ attr->stack_size = RT_ALIGN_DOWN(stack_size, RT_ALIGN_SIZE);
+
+ return 0;
+}
+
+int pthread_attr_getstack(pthread_attr_t const * attr, void **stack_base, size_t *stack_size)
+{
+ RT_ASSERT(attr != RT_NULL);
+
+ *stack_base = attr->stack_base;
+ *stack_size = attr->stack_size;
+
+ return 0;
+}
+
+int pthread_attr_setguardsize(pthread_attr_t * attr, size_t guard_size)
+{
+ return ENOTSUP;
+}
+
+int pthread_attr_getguardsize(pthread_attr_t const * attr, size_t *guard_size)
+{
+ return ENOTSUP;
+}
+
+int pthread_attr_setscope(pthread_attr_t *attr, int scope)
+{
+ if (scope == PTHREAD_SCOPE_SYSTEM)
+ return 0;
+ if (scope == PTHREAD_SCOPE_PROCESS)
+ return ENOTSUP;
+
+ return EINVAL;
+}
+
+int pthread_attr_getscope(pthread_attr_t const *attr)
+{
+ return PTHREAD_SCOPE_SYSTEM;
+}
+