// covered by the GNU Public License.
// -----------------------------------------------------------------------
-#include "fosa_app_def_sched.h"
-#include "fosa_threads_and_signals.h"
-#include "fosa_mutexes_and_condvars.h"
-#include "fosa_clocks_and_timers.h"
#include <stdio.h> // for printf
#include <string.h> // for strlen, strncpy
#include <unistd.h> // for sleep
#include <time.h> // for nanosleep
-#include <misc/load.h> // for adjust, eat
+
// TODO: use #include <assert.h> when it works for all architectures
#include <stdlib.h> // for exit in assert
+#include "fosa.h"
+
static void inline assert(expression)
{
if (!expression) {
static void *thread_code(void *arg);
-static void frsh_callback_init
+static void fosa_callback_init
(void *sched_data, void *arg);
-static void frsh_callback_new_thread
+static void fosa_callback_new_thread
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time);
-static void frsh_callback_thread_terminate
+static void fosa_callback_thread_terminate
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time);
-static void frsh_callback_thread_ready
+static void fosa_callback_thread_ready
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time);
-static void frsh_callback_thread_block
+static void fosa_callback_thread_block
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time);
-static void frsh_callback_change_sched_param_thread
+static void fosa_callback_change_sched_param_thread
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time);
-static void frsh_callback_explicit_call_with_data
+static void fosa_callback_explicit_call_with_data
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
const void * msg,
size_t msg_size,
void *reply,
fosa_ads_actions_t *actions,
struct timespec *current_time);
-static void frsh_callback_notification_for_thread
+static void fosa_callback_notification_for_thread
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_clock_id_t clock,
fosa_ads_actions_t *actions,
struct timespec *current_time);
-static void frsh_callback_timeout
+static void fosa_callback_timeout
(void *sched_data,
fosa_ads_actions_t *actions,
struct timespec *current_time);
-static void frsh_callback_signal
+static void fosa_callback_signal
(void *sched_data,
- frsh_signal_t signal,
- frsh_signal_info_t siginfo,
+ fosa_signal_t signal,
+ fosa_signal_info_t siginfo,
fosa_ads_actions_t *actions,
struct timespec *current_time);
-static void frsh_callback_appsched_error
+static void fosa_callback_appsched_error
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_error_cause_t cause,
fosa_ads_actions_t *actions);
///////////////////////////////////////////////////////
static fosa_ads_scheduler_ops_t scheduler_ops = {
- .init = frsh_callback_init,
- .new_thread = frsh_callback_new_thread,
- .thread_terminate = frsh_callback_thread_terminate,
- .thread_ready = frsh_callback_thread_ready,
- .thread_block = frsh_callback_thread_block,
- .change_sched_param_thread = frsh_callback_change_sched_param_thread,
- .explicit_call_with_data = frsh_callback_explicit_call_with_data,
- .notification_for_thread = frsh_callback_notification_for_thread,
- .timeout = frsh_callback_timeout,
- .signal = frsh_callback_signal,
- .appsched_error = frsh_callback_appsched_error,
+ .init = fosa_callback_init,
+ .new_thread = fosa_callback_new_thread,
+ .thread_terminate = fosa_callback_thread_terminate,
+ .thread_ready = fosa_callback_thread_ready,
+ .thread_block = fosa_callback_thread_block,
+ .change_sched_param_thread = fosa_callback_change_sched_param_thread,
+ .explicit_call_with_data = fosa_callback_explicit_call_with_data,
+ .notification_for_thread = fosa_callback_notification_for_thread,
+ .timeout = fosa_callback_timeout,
+ .signal = fosa_callback_signal,
+ .appsched_error = fosa_callback_appsched_error,
};
-static frsh_mutex_t lock;
+static fosa_mutex_t lock;
const unsigned int MX_INIT_ARGS_STRING = 30;
const unsigned int MX_PRIO = 20;
typedef struct {
fosa_ads_urgency_t array_prio[MX_THREADS];
int array_status[MX_THREADS];
-} frsh_sched_data_t;
+} fosa_sched_data_t;
typedef struct {
fosa_ads_urgency_t prio;
} command_t;
typedef struct {
- frsh_thread_id_t thread_id;
+ fosa_thread_id_t thread_id;
command_t command;
} signal_action_t;
int err;
char init_args_string[MX_INIT_ARGS_STRING + 1];
- frsh_thread_id_t tid1, tid2, tid3;
- frsh_thread_attr_t th_attr;
+ fosa_thread_id_t tid1, tid2, tid3;
+ fosa_thread_attr_t th_attr;
bool is_appsched;
appsched_params_t params;
- frsh_signal_info_t timer_info;
+ fosa_signal_info_t timer_info;
fosa_timer_id_t timerid;
struct timespec timerval;
signal_action_t signal_action;
- adjust(); // for function eat
err = fosa_thread_set_prio (fosa_thread_self(), MX_PRIO + 1);
printf("set main to highest priority, err=%d\n", err);
err = fosa_ads_scheduler_create
(&scheduler_ops,
- sizeof(frsh_sched_data_t),
+ sizeof(fosa_sched_data_t),
init_args_string, // INIT IS CALLED INMEDIATELY??!!!
strlen(init_args_string) + 1);
printf("scheduler created, err=%d\n", err);
printf("--------------------------------------------------\n");
printf("2b) Create two application scheduled threads\n");
- err = frsh_thread_attr_init(&th_attr);
+ err = fosa_thread_attr_init(&th_attr);
printf("thread attributes object initialized, err=%d\n", err);
assert(err == 0);
- err = frsh_thread_attr_set_stacksize(&th_attr,40000);
+ err = fosa_thread_attr_set_stacksize(&th_attr,40000);
printf("thread attr set stack size to 40000, err=%d\n", err);
assert(err == 0);
printf("created thread 3 (rejected=%d), err=%d\n",
(err == FOSA_EREJECT), err);
- err = frsh_thread_attr_destroy(&th_attr);
+ err = fosa_thread_attr_destroy(&th_attr);
printf("thread attributes object destroyed, err=%d\n",err);
assert(err == 0);
char whoami[] = "who am i?";
int reply;
size_t reply_size;
+ struct timespec one_second = {1, 0};
printf("THREAD %d - starts\n", (int)arg);
for (i=1;i<50;i++) {
err=fosa_mutex_lock(&lock);
assert(err == 0);
- eat (1.0);
+ fosa_eat (&one_second);
printf("THREAD %d - unlocking mutex\n", (int)arg);
err=fosa_mutex_unlock(&lock);
///////////////////////////////////////////////////////
// 4) Implementation of Application Defined Callbacks
///////////////////////////////////////////////////////
-static void frsh_callback_init
+static void fosa_callback_init
(void *sched_data, void *arg)
{
- frsh_sched_data_t *frsh = (frsh_sched_data_t *)sched_data;
+ fosa_sched_data_t *frsh = (fosa_sched_data_t *)sched_data;
int i, err;
- frsh_signal_t sched_signal = FOSA_SIGNAL_MAX; // HOW TO PUT SIGNALS IF IS OPAQUE??
+ fosa_signal_t sched_signal = FOSA_SIGNAL_MAX; // HOW TO PUT SIGNALS IF IS OPAQUE??
printf ("BEGIN CALLBACK: %s \n", __func__);
printf ("init args string received: %s \n", (char *)arg);
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_new_thread
+static void fosa_callback_new_thread
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time)
{
int err;
unsigned int i, index;
- frsh_sched_data_t *frsh = (frsh_sched_data_t *)sched_data;
+ fosa_sched_data_t *frsh = (fosa_sched_data_t *)sched_data;
appsched_params_t params;
size_t size;
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_thread_terminate
+static void fosa_callback_thread_terminate
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time)
{
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_thread_ready
+static void fosa_callback_thread_ready
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time)
{
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_thread_block
+static void fosa_callback_thread_block
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time)
{
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_change_sched_param_thread
+static void fosa_callback_change_sched_param_thread
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_actions_t *actions,
struct timespec *current_time)
{
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_explicit_call_with_data
+static void fosa_callback_explicit_call_with_data
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
const void * msg,
size_t msg_size,
void *reply,
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_notification_for_thread
+static void fosa_callback_notification_for_thread
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_clock_id_t clock,
fosa_ads_actions_t *actions,
struct timespec *current_time)
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_timeout // WHY NOT WATCHDOG????
+static void fosa_callback_timeout // WHY NOT WATCHDOG????
(void *sched_data,
fosa_ads_actions_t *actions,
struct timespec *current_time) // WHY IS IN OUT and not IN???
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_signal
+static void fosa_callback_signal
(void *sched_data,
- frsh_signal_t signal,
- frsh_signal_info_t siginfo, // HOW DO I KNOW THE ORIGIN (see signal_info type)
+ fosa_signal_t signal,
+ fosa_signal_info_t siginfo, // HOW DO I KNOW THE ORIGIN (see signal_info type)
fosa_ads_actions_t *actions,
struct timespec *current_time)
{
int err;
signal_action_t *signal_action = (signal_action_t *)siginfo.sival_ptr;
- frsh_sched_data_t *frsh = (frsh_sched_data_t *)sched_data;
+ fosa_sched_data_t *frsh = (fosa_sched_data_t *)sched_data;
printf ("BEGIN CALLBACK: %s \n", __func__);
case CAUSE_ERROR:
// cause an error by overwriting actions with 666 ;D
*(int *)actions = 666;
+ err = 666;
printf("causing an error, err=%d\n", err);
break;
}
printf ("END CALLBACK: %s \n", __func__);
}
-static void frsh_callback_appsched_error
+static void fosa_callback_appsched_error
(void *sched_data,
- frsh_thread_id_t thread,
+ fosa_thread_id_t thread,
fosa_ads_error_cause_t cause,
fosa_ads_actions_t *actions)
{