Add task types
This commit is contained in:
parent
56c86718fd
commit
77a879c0a0
7
emu.h
7
emu.h
@ -37,11 +37,18 @@ struct ovni_ethread;
|
|||||||
|
|
||||||
struct nosv_task {
|
struct nosv_task {
|
||||||
int id;
|
int id;
|
||||||
|
int type_id;
|
||||||
struct ovni_ethread *thread;
|
struct ovni_ethread *thread;
|
||||||
enum nosv_task_state state;
|
enum nosv_task_state state;
|
||||||
UT_hash_handle hh;
|
UT_hash_handle hh;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct nosv_task_type {
|
||||||
|
int id;
|
||||||
|
UT_hash_handle hh;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* State of each emulated thread */
|
/* State of each emulated thread */
|
||||||
struct ovni_ethread {
|
struct ovni_ethread {
|
||||||
/* Emulated thread tid */
|
/* Emulated thread tid */
|
||||||
|
62
emu_nosv.c
62
emu_nosv.c
@ -5,26 +5,30 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
struct nosv_task *tasks = NULL;
|
struct nosv_task *tasks = NULL;
|
||||||
|
struct nosv_task_type *types = NULL;
|
||||||
|
|
||||||
struct hook_entry {
|
struct hook_entry {
|
||||||
char id[4];
|
char id[4];
|
||||||
void (*hook)(struct ovni_emu *);
|
void (*hook)(struct ovni_emu *);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* --------------------------- pre ------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pre_task_create(struct ovni_emu *emu)
|
pre_task_create(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
struct nosv_task *task, *p = NULL;
|
struct nosv_task *task, *p = NULL;
|
||||||
|
|
||||||
task = malloc(sizeof(*task));
|
task = calloc(1, sizeof(*task));
|
||||||
|
|
||||||
if(task == NULL)
|
if(task == NULL)
|
||||||
{
|
{
|
||||||
perror("malloc");
|
perror("calloc");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
task->id = emu->cur_ev->payload.i32[0];
|
task->id = emu->cur_ev->payload.i32[0];
|
||||||
|
task->type_id = emu->cur_ev->payload.i32[1];
|
||||||
task->state = TASK_ST_CREATED;
|
task->state = TASK_ST_CREATED;
|
||||||
|
|
||||||
/* Ensure the task id is new */
|
/* Ensure the task id is new */
|
||||||
@ -32,7 +36,7 @@ pre_task_create(struct ovni_emu *emu)
|
|||||||
|
|
||||||
if(p != NULL)
|
if(p != NULL)
|
||||||
{
|
{
|
||||||
err("A task with id %d already exists\n", task->id);
|
err("A task with id %d already exists\n", p->id);
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,7 +126,6 @@ pre_task_end(struct ovni_emu *emu)
|
|||||||
|
|
||||||
taskid = emu->cur_ev->payload.i32[0];
|
taskid = emu->cur_ev->payload.i32[0];
|
||||||
|
|
||||||
/* Ensure the task id is new */
|
|
||||||
HASH_FIND_INT(tasks, &taskid, task);
|
HASH_FIND_INT(tasks, &taskid, task);
|
||||||
|
|
||||||
assert(task != NULL);
|
assert(task != NULL);
|
||||||
@ -158,6 +161,50 @@ pre_task(struct ovni_emu *emu)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pre_type_create(struct ovni_emu *emu)
|
||||||
|
{
|
||||||
|
struct nosv_task_type *type, *p = NULL;
|
||||||
|
int typeid;
|
||||||
|
|
||||||
|
typeid = emu->cur_ev->payload.i32[0];
|
||||||
|
|
||||||
|
/* Ensure the type id is new */
|
||||||
|
HASH_FIND_INT(types, &typeid, type);
|
||||||
|
|
||||||
|
if(type != NULL)
|
||||||
|
{
|
||||||
|
err("A task type with id %d already exists\n", p->id);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
type = calloc(1, sizeof(*type));
|
||||||
|
|
||||||
|
if(type == NULL)
|
||||||
|
{
|
||||||
|
perror("calloc");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
type->id = typeid;
|
||||||
|
|
||||||
|
/* Add the new task type to the hash table */
|
||||||
|
HASH_ADD_INT(types, id, type);
|
||||||
|
|
||||||
|
dbg("new task type created id=%d\n", type->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pre_type(struct ovni_emu *emu)
|
||||||
|
{
|
||||||
|
switch(emu->cur_ev->value)
|
||||||
|
{
|
||||||
|
case 'c': pre_type_create(emu); break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
hook_pre_nosv(struct ovni_emu *emu)
|
hook_pre_nosv(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
@ -165,12 +212,13 @@ hook_pre_nosv(struct ovni_emu *emu)
|
|||||||
switch(emu->cur_ev->class)
|
switch(emu->cur_ev->class)
|
||||||
{
|
{
|
||||||
case 'T': pre_task(emu); break;
|
case 'T': pre_task(emu); break;
|
||||||
|
case 'Y': pre_type(emu); break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------- views ------------------------------- */
|
/* --------------------------- emit ------------------------------- */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_prv(struct ovni_emu *emu, int type, int val)
|
emit_prv(struct ovni_emu *emu, int type, int val)
|
||||||
@ -191,24 +239,28 @@ static void
|
|||||||
emit_task_execute(struct ovni_emu *emu)
|
emit_task_execute(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
emit_prv(emu, 200, emu->cur_task->id + 1);
|
emit_prv(emu, 200, emu->cur_task->id + 1);
|
||||||
|
emit_prv(emu, 300, emu->cur_task->type_id + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_task_pause(struct ovni_emu *emu)
|
emit_task_pause(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
emit_prv(emu, 200, 0);
|
emit_prv(emu, 200, 0);
|
||||||
|
emit_prv(emu, 300, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_task_resume(struct ovni_emu *emu)
|
emit_task_resume(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
emit_prv(emu, 200, emu->cur_task->id + 1);
|
emit_prv(emu, 200, emu->cur_task->id + 1);
|
||||||
|
emit_prv(emu, 300, emu->cur_task->type_id + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emit_task_end(struct ovni_emu *emu)
|
emit_task_end(struct ovni_emu *emu)
|
||||||
{
|
{
|
||||||
emit_prv(emu, 200, 0);
|
emit_prv(emu, 200, 0);
|
||||||
|
emit_prv(emu, 300, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user