Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
threads_arch.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2025 The Paparazzi Team
3 *
4 * This file is part of paparazzi.
5 *
6 * Paparazzi is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * See LICENSE file for the full license version, or see http://www.gnu.org/licenses/
12 */
14#include "modules/core/threads_arch.h"
15#include "stdbool.h"
16#include <semaphore.h>
17#include <stdlib.h>
18#include <time.h>
19
20
24
28
32
36
37
38
43
47
49 struct timespec ts;
53 ts.tv_sec += timeout_secs;
54 ts.tv_nsec += timeout_nsecs;
55 return sem_timedwait(&bsem->sem, &ts);
56}
57
59 int val;
61 if(!sem_getvalue(&bsem->sem, &val)) {
62 if(val < 1) {
63 sem_post(&bsem->sem);
64 }
65 }
67}
68
69
70
71// stub function argument: the thread function to run with its argument.
73{
74 void (*func)(void*);
75 void* arg;
76};
77
78// stub function, ran in a new thread
79static void* stub(void* arg) {
80 struct stub_arg* sa = (struct stub_arg*) arg;
81 sa->func(sa->arg);
82 free(sa);
83 return NULL;
84}
85
86int pprz_thread_create(pprz_thread_t* thread, size_t size, const char *name, uint8_t prio, void (*func)(void*), void* arg) {
87 (void)size;
88 (void)prio;
89 struct stub_arg *sa = malloc(sizeof(struct stub_arg)); // allocate a stub arg. Must be allocated on the heap
90 sa->func = func;
91 sa->arg = arg;
92 int ret = pthread_create(thread, NULL, stub, (void*)sa); // launch the stub in a new thread
93 if(ret) {return ret;}
94 return pthread_setname_np(*thread, name);
95}
96
100
102 return pthread_join(*thread, retval);
103}
104
106 return pthread_tryjoin_np(*thread, retval);
107}
int pprz_mtx_trylock(pprz_mutex_t *mtx)
Performs a nonblocking lock on the mutex.
int pprz_thread_join(pprz_thread_t *thread, void **retval)
Wait for the thread to terminate.
int pprz_bsem_wait_timeout(pprz_bsem_t *bsem, float timeout)
Wait on semaphore no more than timeout.
int pprz_mtx_unlock(pprz_mutex_t *mtx)
void pprz_bsem_init(pprz_bsem_t *bsem, bool taken)
int pprz_thread_create(pprz_thread_t *thread, size_t size, const char *name, uint8_t prio, void(*pf)(void *), void *arg)
Creates a new thread whose stack is dynamically allocated.
int pprz_mtx_init(pprz_mutex_t *mtx)
int pprz_mtx_lock(pprz_mutex_t *mtx)
void pprz_bsem_signal(pprz_bsem_t *bsem)
int pprz_thread_tryjoin(pprz_thread_t *thread, void **retval)
Performs a nonblocking join with the thread.
void pprz_thread_exit(void *retval)
Exit the current thread.
void pprz_bsem_wait(pprz_bsem_t *bsem)
thread_t * pprz_thread_t
static void * stub(void *arg)
uint16_t foo
Definition main_demo5.c:58
static float timeout
sem_t sem
pthread_mutex_t mtx
mutex_t mtx
void(* func)(void *)
void * arg
uint16_t val[TCOUPLE_NB]
pprz_bsem_t bsem
Definition thd_test.c:34
pprz_mutex_t mtx
Definition thd_test.c:36
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.