123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615 |
- /*
- * Copyright (c) 2006-2023, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2010-10-26 Bernard the first version
- */
- #include <rtthread.h>
- #include "pthread.h"
- #include "sched.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 */
- PTHREAD_INHERIT_SCHED, /* Inherit parent prio/policy */
- SCHED_FIFO, /* scheduler policy */
- {
- DEFAULT_PRIORITY, /* scheduler priority */
- },
- PTHREAD_CREATE_JOINABLE, /* detach state */
- };
- /**
- * @brief This function will initialize thread attributes object.
- *
- * @note The pthread_attr_t type should be treated as opaque: any access to the object other
- * than via pthreads functions is nonportable and produces undefined results.
- * The resulting attribute object (possibly modified by setting individual attribute values),
- * when used by pthread_create(), defines the attributes of the thread created. A single attributes
- * object can be used in multiple simultaneous calls to pthread_create().
- *
- * @see pthread_create()
- *
- * @param attr is a thread attributes object.
- *
- * @return Upon successful completion, pthread_attr_init() return a value of 0.
- * Otherwise, it means that the event detach failed.
- *
- * @warning This function will fail if attr is null.
- */
- int pthread_attr_init(pthread_attr_t *attr)
- {
- RT_ASSERT(attr != RT_NULL);
- *attr = pthread_default_attr;
- return 0;
- }
- RTM_EXPORT(pthread_attr_init);
- /**
- * @brief This function will destroy thread attributes object.
- *
- * @note When a thread attributes object is no longer required, it should be destroyed
- * using the pthread_attr_destroy() function. Destroying a thread attributes object
- * has no effect on threads that were created using that object.
- * Once a thread attributes object has been destroyed, it can be reinitialized using pthread_attr_init().
- * Any other use of a destroyed thread attributes object has undefined results.
- *
- * @see pthread_attr_init(), pthread_attr_getdetachstate(), pthread_create()
- *
- * @param attr is a thread attributes object.
- *
- * @return Upon successful completion, pthread_attr_destroy() and shall return a value of 0;
- * Otherwise, an error number shall be returned to indicate the error.
- *
- * @warning This function will fail if attr is null.
- */
- int pthread_attr_destroy(pthread_attr_t *attr)
- {
- RT_ASSERT(attr != RT_NULL);
- memset(attr, 0, sizeof(pthread_attr_t));
- return 0;
- }
- RTM_EXPORT(pthread_attr_destroy);
- /**
- * @brief This function set detach state attribute in thread attributes object.
- *
- * @note This function sets the detach state attribute of the thread attributes object
- * referred to by attr to the value specified in detachstate. The detach state
- * attribute determines whether a thread created using the thread attributes
- * object attr will be created in a joinable or a detached state.
- *
- * @see pthread_attr_init(), pthread_create(), pthread_detach(), pthread_join(), pthreads()
- *
- * @param attr is a thread attributes object.
- *
- * @param state is attribute in the attr object.
- * attribute controls whether the thread is created in a detached state.
- * The detachstate can be ONE of the following values:
- *
- * PTHREAD_CREATE_DETACHED It causes all threads created with attr to be in the detached state.
- *
- * PTHREAD_CREATE_JOINABLE Default value, it causes all threads created with attr to be in the joinable state.
- *
- * @return Upon successful completion, pthread_attr_setdetachstate() and return a value of 0.
- * Otherwise, an error number is returned to indicate the error.
- *
- * @warning The pthread_attr_setdetachstate() function will fail if:
- * [EINVAL]
- * The value of detach state was not valid
- */
- 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;
- }
- RTM_EXPORT(pthread_attr_setdetachstate);
- /**
- * @brief This function get detach state attribute in thread attributes object.
- *
- * @note The detachstate attribute controls whether the thread is created in a detached state.
- * If the thread is created detached, then use of the ID of the newly created thread by
- * the pthread_detach() or pthread_join() function is an error.
- *
- * @see pthread_attr_destroy(), pthread_attr_getstackaddr(), pthread_attr_getstacksize(), pthread_create()
- *
- * @param attr is a thread attributes object.
- *
- * @param state is attribute in the attr object.
- * attribute controls whether the thread is created in a detached state.
- * The detachstate can be ONE of the following values:
- *
- * PTHREAD_CREATE_DETACHED It causes all threads created with attr to be in the detached state.
- *
- * PTHREAD_CREATE_JOINABLE Default value, it causes all threads created with attr to be in the joinable state.
- *
- * @return Upon successful completion, pthread_attr_getdetachstate() and shall return a value of 0;
- * otherwise, an error number shall be returned to indicate the error.
- *
- * The pthread_attr_getdetachstate() function stores the value of the detachstate
- * attribute in detachstate if successful.
- */
- int pthread_attr_getdetachstate(pthread_attr_t const *attr, int *state)
- {
- RT_ASSERT(attr != RT_NULL);
- *state = (int)attr->detachstate;
- return 0;
- }
- RTM_EXPORT(pthread_attr_getdetachstate);
- /**
- * @brief This function sets schedpolicy attribute.
- *
- * @note The function function sets the scheduling policy attribute of the thread
- * attributes object referred to by attr to the value specified in policy.
- *
- * @see pthread_attr_init(), pthread_attr_setscope(), pthread_attr_setinheritsched(), pthread_attr_setschedparam(), pthread_create()
- *
- * @param attr is a thread attributes object.
- *
- * @param policy is attribute in the attr object.
- * The policy can be ONE of the following values:
- *
- * SCHED_FIFO First in-first out scheduling.
- *
- * SCHED_RR Round-robin scheduling.
- *
- * SCHED_OTHER Default Linux time-sharing scheduling.
- *
- * @return On success, these functions return 0.
- */
- int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy)
- {
- RT_ASSERT(attr != RT_NULL);
- attr->schedpolicy = policy;
- return 0;
- }
- RTM_EXPORT(pthread_attr_setschedpolicy);
- /**
- * @brief This function gets schedpolicy attribute.
- *
- * @note The function gets the schedpolicy attribute in the attr argument.
- *
- * @see pthread_attr_destroy(), pthread_attr_getscope(), pthread_attr_getinheritsched(), pthread_attr_getschedparam(), pthread_create()
- *
- * @param attr is a thread attributes object.
- *
- * @param policy is attribute in the attr object.
- * The policy can be ONE of the following values:
- *
- * SCHED_FIFO First in-first out scheduling.
- *
- * SCHED_RR Round-robin scheduling.
- *
- * SCHED_OTHER Default Linux time-sharing scheduling.
- *
- * @return On success, these functions return 0.
- */
- int pthread_attr_getschedpolicy(pthread_attr_t const *attr, int *policy)
- {
- RT_ASSERT(attr != RT_NULL);
- *policy = (int)attr->schedpolicy;
- return 0;
- }
- RTM_EXPORT(pthread_attr_getschedpolicy);
- /**
- * @brief This function set the scheduling parameter attributes in the attr argument.
- * @see pthread_attr_init(), pthread_attr_setscope(), pthread_attr_setinheritsched(), pthread_attr_setschedpolicy()
- *
- * @param attr is a thread attributes object.
- *
- * @param param is scheduling parameter attributes in the attr argument.
- * The contents of the param structure are defined in <pthread.h>.
- * For the SCHED_FIFO and SCHED_RR policies, the only required member of param is sched_priority.
- *
- * @return On success, these functions 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->schedparam.sched_priority = param->sched_priority;
- return 0;
- }
- RTM_EXPORT(pthread_attr_setschedparam);
- /**
- * @brief This function get the scheduling parameter attributes in the attr argument.
- * @see pthread_attr_init(), pthread_attr_setscope(), pthread_attr_setinheritsched(), pthread_attr_setschedpolicy()
- *
- * @param attr is a thread attributes object.
- *
- * @param param is scheduling parameter attributes in the attr argument.
- * The contents of the param structure are defined in <pthread.h>.
- * For the SCHED_FIFO and SCHED_RR policies, the only required member of param is sched_priority.
- *
- * @return On success, these functions 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->schedparam.sched_priority;
- return 0;
- }
- RTM_EXPORT(pthread_attr_getschedparam);
- /**
- * @brief This function set the thread creation stacksize attribute in the attr object.
- *
- * @see pthread_attr_init(), pthread_attr_setstackaddr(), pthread_attr_setdetachstate()
- *
- * @param attr is a thread attributes object.
- *
- * @param stack_size is the minimum stack size (in bytes) allocated for the created threads stack.
- *
- * @return Upon successful completion, This function return a value of 0.
- */
- int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stack_size)
- {
- RT_ASSERT(attr != RT_NULL);
- attr->stacksize = stack_size;
- return 0;
- }
- RTM_EXPORT(pthread_attr_setstacksize);
- /**
- * @brief This function get the thread creation stacksize attribute in the attr object.
- *
- * @see pthread_attr_init(), pthread_attr_getstackaddr(), pthread_attr_getdetachstate()
- *
- * @param attr is a thread attributes object.
- *
- * @param stack_size is the minimum stack size (in bytes) allocated for the created threads stack.
- *
- * @return Upon successful completion, This function return a value of 0.
- */
- int pthread_attr_getstacksize(pthread_attr_t const *attr, size_t *stack_size)
- {
- RT_ASSERT(attr != RT_NULL);
- *stack_size = attr->stacksize;
- return 0;
- }
- RTM_EXPORT(pthread_attr_getstacksize);
- /**
- * @brief This function sets the thread creation stackaddr attribute in the attr object.
- *
- * @see pthread_attr_init(), pthread_attr_setdetachstate(), pthread_attr_setstacksize()
- *
- * @param attr is a thread attributes object.
- *
- * @param The stack_addr attribute specifies the location of storage to be used for the created
- * thread's stack.
- *
- * @return Upon successful completion, This function return a value of 0.
- */
- int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stack_addr)
- {
- RT_ASSERT(attr != RT_NULL);
- return EOPNOTSUPP;
- }
- RTM_EXPORT(pthread_attr_setstackaddr);
- /**
- * @brief This function gets the thread creation stackaddr attribute in the attr object.
- *
- * @see pthread_attr_init(), pthread_attr_setdetachstate(), pthread_attr_setstacksize()
- *
- * @param attr is a thread attributes object.
- *
- * @param The stack_addr attribute specifies the location of storage to be used for the created
- * thread's stack.
- *
- * @return Upon successful completion, This function return a value of 0.
- */
- int pthread_attr_getstackaddr(pthread_attr_t const *attr, void **stack_addr)
- {
- RT_ASSERT(attr != RT_NULL);
- return EOPNOTSUPP;
- }
- RTM_EXPORT(pthread_attr_getstackaddr);
- /**
- * @brief This function set the thread creation stack attributes stackaddr and stacksize in the attr object.
- *
- * @note The stack attributes specify the area of storage to be used for the created thread's stack.
- * The base (lowest addressable byte) of the storage shall be stack_base, and the size of the storage
- * shall be stack_size bytes.
- * All pages within the stack described by stackaddr and stacksize shall be both readable
- * and writable by the thread.
- *
- * @see pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_getstacksize, pthread_create
- *
- * @param attr is a thread attributes object.
- *
- * @param stack_base is the base (lowest addressable byte) of the storage.
- *
- * @param stack_size is the size of the storage.
- *
- * @return Upon successful completion, these functions shall return a value of 0;
- * otherwise, an error number shall be returned to indicate the error.
- *
- * @warning The behavior is undefined if the value specified by the attr argument to or pthread_attr_setstack()
- * does not refer to an initialized thread attributes object.
- */
- int pthread_attr_setstack(pthread_attr_t *attr,
- void *stack_base,
- size_t stack_size)
- {
- RT_ASSERT(attr != RT_NULL);
- attr->stackaddr = stack_base;
- attr->stacksize = RT_ALIGN_DOWN(stack_size, RT_ALIGN_SIZE);
- return 0;
- }
- RTM_EXPORT(pthread_attr_setstack);
- /**
- * @brief This function shall get the thread creation stack attributes stackaddr and stacksize in the attr object.
- *
- * @note The stack attributes specify the area of storage to be used for the created thread's stack.
- * The base (lowest addressable byte) of the storage shall be stack_base, and the size of the storage
- * shall be stack_size bytes.
- * All pages within the stack described by stack_base and stack_size shall be both readable
- * and writable by the thread.
- *
- * @see pthread_attr_destroy, pthread_attr_getdetachstate, pthread_attr_getstacksize, pthread_create
- *
- * @param attr is a thread attributes object.
- *
- * @param stack_base is the base (lowest addressable byte) of the storage.
- *
- * @param stack_size is the size of the storage.
- *
- * @return Upon successful completion, these functions shall return a value of 0;
- * otherwise, an error number shall be returned to indicate the error.
- * This function shall store the stack attribute values in stack_base and stack_size if successful.
- */
- int pthread_attr_getstack(pthread_attr_t const *attr,
- void **stack_base,
- size_t *stack_size)
- {
- RT_ASSERT(attr != RT_NULL);
- *stack_base = attr->stackaddr;
- *stack_size = attr->stacksize;
- return 0;
- }
- RTM_EXPORT(pthread_attr_getstack);
- /**
- * @brief This function shall set the guardsize attribute in the attr object.
- *
- * @note The guardsize attribute controls the size of the guard area for the created thread's stack.
- * The guardsize attribute provides protection against overflow of the stack pointer.
- * If a thread's stack is created with guard protection, the implementation allocates extra
- * memory at the overflow end of the stack as a buffer against stack overflow of the stack pointer.
- * If an application overflows into this buffer an error shall result (possibly in a SIGSEGV signal
- * being delivered to the thread).
- *
- * @see <pthread.h>, <sys/mman.h>
- *
- * @param attr is a thread attributes object.
- *
- * @param guard_size is the size of the guard area for the created thread's stack.
- *
- * @return Upon successful completion, these functions shall return a value of 0;
- *
- * @warning The guardsize attribute is provided to the application for two reasons:
- *
- * 1. Overflow protection can potentially result in wasted system resources.
- * An application that creates a large number of threads, and which knows its threads
- * never overflow their stack, can save system resources by turning off guard areas.
- *
- * 2. When threads allocate large data structures on the stack, large guard areas may be
- * needed to detect stack overflow.
- *
- * The default size of the guard area is left implementation-defined since on systems
- * supporting very large page sizes, the overhead might be substantial if at least one guard
- * page is required by default.
- */
- int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guard_size)
- {
- return EOPNOTSUPP;
- }
- /**
- * @brief This function get the guardsize attribute in the attr object.
- * This attribute shall be returned in the guard_size parameter.
- *
- * @note The guardsize attribute controls the size of the guard area for the created thread's stack.
- * The guardsize attribute provides protection against overflow of the stack pointer.
- * If a thread's stack is created with guard protection, the implementation allocates extra
- * memory at the overflow end of the stack as a buffer against stack overflow of the stack pointer.
- *
- * @see <pthread.h>, <sys/mman.h>
- *
- * @param attr is a thread attributes object.
- *
- * @param guard_size is the size of the guard area for the created thread's stack.
- *
- * @return Upon successful completion, these functions shall return a value of 0;
- *
- * @warning The guardsize attribute is provided to the application for two reasons:
- *
- * 1. Overflow protection can potentially result in wasted system resources.
- * An application that creates a large number of threads, and which knows its threads
- * never overflow their stack, can save system resources by turning off guard areas.
- *
- * 2. When threads allocate large data structures on the stack, large guard areas may be
- * needed to detect stack overflow.
- *
- * The default size of the guard area is left implementation-defined since on systems
- * supporting very large page sizes, the overhead might be substantial if at least one guard
- * page is required by default.
- */
- int pthread_attr_getguardsize(pthread_attr_t const *attr, size_t *guard_size)
- {
- return EOPNOTSUPP;
- }
- RTM_EXPORT(pthread_attr_getguardsize);
- /**
- * @brief This function sets inherit-scheduler attribute in thread attributes object.
- *
- * @note The function sets the inherit-scheduler attribute of the thread attributes object
- * referred to by attr to the value specified in inheritsched.
- * The inherit-scheduler attribute determines whether a thread created using the thread
- * attributes object attr will inherit its scheduling attributes from the calling thread
- * or whether it will take them from attr.
- *
- * @see pthread_attr_init(), pthread_attr_setschedpolicy(), pthread_attr_setschedparam()
- *
- * @param attr is a thread attributes object.
- *
- * @param inheritsched the inheritsched attribute determines how the other scheduling attributes of the created thread are to be set:
- * The policy can be ONE of the following values:
- *
- * PTHREAD_INHERIT_SCHED Specifies that the scheduling policy and associated attributes are
- * to be inherited from the creating thread, and the scheduling attributes
- * in this attr argument are to be ignored.
- *
- * PTHREAD_EXPLICIT_SCHED Specifies that the scheduling policy and associated attributes are to be
- * set to the corresponding values from this attribute object.
- *
- * @return Upon successful completion, these functions shall return a value of 0;
- */
- int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched)
- {
- RT_ASSERT(attr != RT_NULL);
- attr->inheritsched = inheritsched;
- return 0;
- }
- RTM_EXPORT(pthread_attr_setinheritsched);
- /**
- * @brief This function get and set the inheritsched attribute in the attr argument.
- *
- * @note The function sets the inherit-scheduler attribute of the thread attributes object
- * referred to by attr to the value specified in inheritsched.
- * The inherit-scheduler attribute determines whether a thread created using the thread
- * attributes object attr will inherit its scheduling attributes from the calling thread
- * or whether it will take them from attr.
- *
- * @see pthread_attr_init(), pthread_attr_getschedpolicy(), pthread_attr_getschedparam()
- *
- * @param attr is a thread attributes object.
- *
- * @param inheritsched the inheritsched attribute determines how the other scheduling attributes of the created thread are to be set:
- * The inheritsched can be ONE of the following values:
- *
- * PTHREAD_INHERIT_SCHED Specifies that the scheduling policy and associated attributes are
- * to be inherited from the creating thread, and the scheduling attributes
- * in this attr argument are to be ignored.
- *
- * PTHREAD_EXPLICIT_SCHED Specifies that the scheduling policy and associated attributes are to be
- * set to the corresponding values from this attribute object.
- *
- * @return Upon successful completion, these functions shall return a value of 0;
- */
- int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched)
- {
- RT_ASSERT(attr != RT_NULL);
- *inheritsched = attr->inheritsched;
- return 0;
- }
- RTM_EXPORT(pthread_attr_getinheritsched);
- /**
- * @brief This function set contentionscope attribute.
- *
- * @note The function are used to set the contentionscope attribute in the attr object.
- *
- * @param attr is a thread attributes object.
- *
- * @param scope is the value of contentionscope attribute.
- * The scope can be ONE of the following values:
- *
- * PTHREAD_SCOPE_SYSTEM signifying system scheduling contention scope.
- *
- * PTHREAD_SCOPE_PROCESS signifying process scheduling contention scope.
- *
- * @return Upon successful completion, these functions shall return a value of 0;
- */
- int pthread_attr_setscope(pthread_attr_t *attr, int scope)
- {
- if (scope == PTHREAD_SCOPE_SYSTEM)
- return 0;
- if (scope == PTHREAD_SCOPE_PROCESS)
- return EOPNOTSUPP;
- return EINVAL;
- }
- RTM_EXPORT(pthread_attr_setscope);
- /**
- * @brief This function get contentionscope attribute.
- *
- * @note The function are used to get the contentionscope attribute in the attr object.
- *
- * @param attr is a thread attributes object.
- *
- * @param scope is the value of contentionscope attribute.
- * The scope can be ONE of the following values:
- *
- * PTHREAD_SCOPE_SYSTEM signifying system scheduling contention scope.
- *
- * PTHREAD_SCOPE_PROCESS signifying process scheduling contention scope.
- *
- * @return Upon successful completion, these functions shall return a value of 0;
- */
- int pthread_attr_getscope(pthread_attr_t const *attr, int *scope)
- {
- return PTHREAD_SCOPE_SYSTEM;
- }
- RTM_EXPORT(pthread_attr_getscope);
|