monitoring done; scheduling not implemented

This commit is contained in:
Semere M. Mebrahtom 2026-03-26 11:54:56 +01:00
parent f08c635390
commit b171edf043
Signed by: semere
GPG key ID: 7FC937214DF30488
2 changed files with 44 additions and 1 deletions

View file

@ -49,6 +49,7 @@ typedef struct s_coder
long last_compile; long last_compile;
int compiles_done; int compiles_done;
t_state *state; t_state *state;
pthread_mutex_t last_mutex;
} t_coder; } t_coder;
typedef struct s_state typedef struct s_state

View file

@ -33,6 +33,16 @@ void print(char *str, t_state *state, int coder_idx)
pthread_mutex_unlock(&state->print_mutex); pthread_mutex_unlock(&state->print_mutex);
} }
bool is_over(t_state *state)
{
bool is_over;
pthread_mutex_lock(&state->over_mutex);
is_over = state->is_over;
pthread_mutex_unlock(&state->over_mutex);
return (is_over);
}
void compile_op(t_coder *coder, t_state *state) void compile_op(t_coder *coder, t_state *state)
{ {
t_dongle *first; t_dongle *first;
@ -54,7 +64,9 @@ void compile_op(t_coder *coder, t_state *state)
pthread_mutex_lock(&second->lock); pthread_mutex_lock(&second->lock);
second->last_used = now(); second->last_used = now();
print("%ld %d has taken a dongle\n", state, coder->idx); print("%ld %d has taken a dongle\n", state, coder->idx);
pthread_mutex_lock(&coder->last_mutex);
coder->last_compile = now(); coder->last_compile = now();
pthread_mutex_unlock(&coder->last_mutex);
print("%ld %d is compiling\n", state, coder->idx); print("%ld %d is compiling\n", state, coder->idx);
usleep(state->args.time_to_compile * 1000L); usleep(state->args.time_to_compile * 1000L);
pthread_mutex_unlock(&first->lock); pthread_mutex_unlock(&first->lock);
@ -85,8 +97,14 @@ void *run(void *param)
i = 0; i = 0;
while (i < state->args.number_of_compiles_required) while (i < state->args.number_of_compiles_required)
{ {
if (is_over(state))
return (NULL);
compile_op(coder, state); compile_op(coder, state);
if (is_over(state))
return (NULL);
debug_op(coder, state); debug_op(coder, state);
if (is_over(state))
return (NULL);
refactor_op(coder, state); refactor_op(coder, state);
i++; i++;
} }
@ -95,7 +113,30 @@ void *run(void *param)
void *monitor(void *param) void *monitor(void *param)
{ {
(void)param; t_state *state;
int i;
long last;
state = param;
while (!is_over(state))
{
usleep(1000);
i = -1;
while (++i < state->args.number_of_coders)
{
pthread_mutex_lock(&state->coders[i].last_mutex);
last = state->coders[i].last_compile;
pthread_mutex_unlock(&state->coders[i].last_mutex);
if (now() - last >= state->args.time_to_burnout)
{
pthread_mutex_lock(&state->over_mutex);
state->is_over = true;
pthread_mutex_unlock(&state->over_mutex);
print("%ld %d has burned out\n", state, state->coders[i].idx);
return (NULL);
}
}
}
return (NULL); return (NULL);
} }
@ -158,6 +199,7 @@ t_coder *init_coders(t_args *args, t_state *state)
coders[i].right_dongle = &state->dongles[(i + 1) coders[i].right_dongle = &state->dongles[(i + 1)
% args->number_of_coders]; % args->number_of_coders];
coders[i].state = state; coders[i].state = state;
pthread_mutex_init(&coders[i].last_mutex, NULL);
} }
return (coders); return (coders);
} }