agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
vheap_task_pthread.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_VHEAP_TASK_PTHREAD_H
8 #define ZRTOS_VHEAP_TASK_PTHREAD_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/error.h>
15 #include <zrtos/vheap.h>
17 #include <zrtos/task_mutex.h>
18 #include <zrtos/types.h>
19 
20 
21 typedef struct{
22  size_t stacksize;
24 
25 typedef struct{
27 }pthread_t;
28 
29 typedef struct{
31 
32 typedef struct{
33  zrtos_task_mutex_t mutex;
35 
36 #define PTHREAD_MUTEX_INITIALIZER \
37  { \
38  .mutex = ZRTOS_TASK_MUTEX__INIT() \
39  }
40 
44  ;
45  return 0;
46 }
47 
49  return 0;
50 }
51 
52 int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize){
53  attr->stacksize = stacksize;
54  return 0;
55 }
56 
58  return 0;
59 }
60 
62  return 0;
63 }
64 
66  pthread_mutex_t *restrict mutex
67  ,const pthread_mutexattr_t *restrict attr
68 ){
69  return zrtos_task_mutex__init(&mutex->mutex) ? 0 : ZRTOS_ERROR__INVAL;
70 }
71 
74  return 0;
75 }
76 
81  );
82  pthread_t ret;
83  ret.id = chunk
86  ;
87  return ret;
88 }
89 
91  pthread_t *restrict thread
92  ,const pthread_attr_t *restrict attr
93  ,void *(*start_routine)(void *)
94  ,void *restrict arg
95 ){
96  size_t stack_size_min = ZRTOS_ARCH__GET_CPU_STATE_BUFFER_LENGTH()
98  ;
100  size_t stacksize_min = sizeof(zrtos_vheap_task_t) + (
101  attr
103  stack_size_min
104  ,attr->stacksize
105  )
106  : stack_size_min
107  );
109  mem
110  ,pthread_self().id
112  ,stacksize_min
113  );
114  int ret = ZRTOS_ERROR__NOMEM;
115 
116  if(chunk){
117  void *mem_chunk_last_address = zrtos_vheap_chunk__get_last_address(
118  chunk
119  );
121  mem_chunk_last_address
122  ,sizeof(zrtos_vheap_task_t)
123  );
125  task
126  ,(zrtos_arch_stack_t*)(task - 1)
127  ,stacksize_min
128  ,start_routine
129  ,arg
130  );
134  mem_chunk_last_address
135  ,task->stack_ptr
136  )
137  );
138  ret = 0;
139  }
140 
141  return ret;
142 }
143 
145  return zrtos_vheap_chunk_uid__cmp(&t1.id,&t2.id);
146 }
147 
148 int pthread_join(pthread_t thread, void **retval){
149  int ret = ESRCH;
150 
151  do{
154  ,thread.id
155  );
156  if(chunk){
157  zrtos_vheap_task_t *task;
158 
160  chunk
162  )){
164  continue;
165  }
166 
169  chunk
170  )
171  ,sizeof(zrtos_vheap_task_t)
172  );
173  *retval = zrtos_vheap_task__get_return_value(task);
176  ,chunk
177  );
178  ret = 0;
179  }
180  break;
181  }while(1);
182 
183  return ret;
184 }
185 
187  return zrtos_task_mutex__lock(&mutex->mutex);
188 }
189 
191  return zrtos_task_mutex__try_lock(&mutex->mutex);
192 }
193 
195  return zrtos_task_mutex__unlock(&mutex->mutex);
196 }
197 
198 
199 #ifdef __cplusplus
200 }
201 #endif
202 #endif
int pthread_join(pthread_t thread, void **retval)
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr)
zrtos_task_mutex_t mutex
Definition: task_pthread.h:33
uint8_t zrtos_arch_stack_t
Definition: atmega2560.h:19
void * zrtos_types__ptr_subtract(void *ptr, size_t byte_len)
Definition: types.h:39
void _zrtos_vheap__free(zrtos_vheap_t *thiz, zrtos_vheap_chunk_t *chunk)
Definition: vheap.h:275
#define ZRTOS_TYPES__MAX(a, b)
Definition: types.h:79
int zrtos_task_mutex__try_lock(zrtos_task_mutex_t *thiz)
Definition: task_mutex.h:33
int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void *), void *restrict arg)
int pthread_mutex_trylock(pthread_mutex_t *mutex)
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr)
#define ZRTOS_ARCH__GET_CPU_STATE_BUFFER_LENGTH()
Definition: atmega2560.h:192
zrtos_vheap_chunk_uid_t id
zrtos_vheap_chunk_t * zrtos_vheap__get_by_id(zrtos_vheap_t *thiz, zrtos_vheap_chunk_uid_t uid)
Definition: vheap.h:81
void zrtos_task_mutex__deinit(zrtos_task_mutex_t *thiz)
Definition: task_mutex.h:29
int pthread_mutex_destroy(pthread_mutex_t *mutex)
int pthread_mutex_lock(pthread_mutex_t *mutex)
zrtos_vheap_chunk_t * zrtos_vheap__get_by_type_ex(zrtos_vheap_t *thiz, zrtos_vheap_type_t type)
Definition: vheap.h:107
int zrtos_vheap_chunk_uid__cmp(zrtos_vheap_chunk_uid_t *a, zrtos_vheap_chunk_uid_t *b)
int zrtos_task_mutex__unlock(zrtos_task_mutex_t *thiz)
Definition: task_mutex.h:62
zrtos_vheap_chunk_uid_t zrtos_vheap_chunk__get_uid(zrtos_vheap_chunk_t *thiz)
Definition: vheap_chunk.h:36
int zrtos_task_mutex__lock(zrtos_task_mutex_t *thiz)
Definition: task_mutex.h:44
zrtos_vheap_chunk_t * _zrtos_vheap__malloc(zrtos_vheap_t *thiz, zrtos_vheap_chunk_uid_t parent, zrtos_vheap_type_t type, size_t length)
Definition: vheap.h:145
int pthread_equal(pthread_t t1, pthread_t t2)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
void * zrtos_vheap__get_last_address(zrtos_vheap_t *thiz)
Definition: vheap.h:52
size_t zrtos_types__ptr_get_byte_distance(void *bigger, void *smaller)
Definition: types.h:43
bool zrtos_task_mutex__init(zrtos_task_mutex_t *thiz)
Definition: task_mutex.h:24
void * zrtos_vheap_task__get_return_value(zrtos_vheap_task_t *thiz)
Definition: vheap_task.h:102
int pthread_attr_destroy(pthread_attr_t *attr)
bool zrtos_vheap_chunk__is_type_eq(zrtos_vheap_chunk_t *thiz, zrtos_vheap_type_t type)
Definition: vheap_chunk.h:60
Invalid argument.
Definition: error.h:46
zrtos_arch_stack_t * stack_ptr
Definition: vheap_task.h:30
zrtos_vheap_chunk_uid_t zrtos_vheap_chunk_uid__error(void)
Out of memory.
Definition: error.h:36
size_t stacksize
Definition: task_pthread.h:22
int pthread_mutexattr_init(pthread_mutexattr_t *attr)
struct _zrtos_vheap_task_t zrtos_vheap_task_t
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
pthread_t pthread_self(void)
void * zrtos_vheap_chunk__get_last_address(zrtos_vheap_chunk_t *thiz)
Definition: vheap_chunk.h:53
void zrtos_vheap_task_scheduler__delay_ms(zrtos_vheap_task_delay_t ms)
bool zrtos_vheap_task__init(zrtos_vheap_task_t *thiz, zrtos_arch_stack_t *heap, size_t stacksize_min, zrtos_arch_callback_t callback, void *args)
Definition: vheap_task.h:37
zrtos_vheap_t * zrtos_vheap_task_scheduler__get_heap(void)
#define ZRTOS_ARCH__GET_FN_CALL_STACK_LENGTH()
Definition: atmega2560.h:193
int pthread_attr_init(pthread_attr_t *attr)