diff options
| author | bernard.xiong <[email protected]> | 2010-11-12 10:26:36 +0000 |
|---|---|---|
| committer | bernard.xiong <[email protected]> | 2010-11-12 10:26:36 +0000 |
| commit | 25f50375ef71f2aa4928fbf814973f118ed1fadd (patch) | |
| tree | e57c94ce971d50d9c7c3f1bfcb73b34d4382a788 /components/pthreads/pthread_attr.c | |
| parent | 7018ab0661e5a5c4be00283a5ab9eabc5d3ab0ee (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.c | 161 |
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;
+}
+
|
