2017-03-21 09:47:32 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* machinarium.
|
2017-03-21 09:58:58 +00:00
|
|
|
*
|
2017-03-21 09:47:32 +00:00
|
|
|
* cooperative multitasking engine.
|
|
|
|
*/
|
|
|
|
|
2017-03-21 12:55:23 +00:00
|
|
|
#include <machinarium.h>
|
2017-05-17 14:20:04 +00:00
|
|
|
#include <machinarium_private.h>
|
|
|
|
|
|
|
|
typedef struct mm_t mm_t;
|
|
|
|
|
|
|
|
struct mm_t {
|
|
|
|
pthread_spinlock_t lock;
|
|
|
|
mm_list_t machine_list;
|
|
|
|
int machine_count;
|
|
|
|
int machine_seq;
|
|
|
|
};
|
|
|
|
|
|
|
|
static mm_t machinarium;
|
|
|
|
|
|
|
|
void
|
|
|
|
mm_attach(mm_machine_t *machine)
|
|
|
|
{
|
|
|
|
pthread_spin_lock(&machinarium.lock);
|
|
|
|
machine->id = machinarium.machine_seq++;
|
|
|
|
mm_list_append(&machinarium.machine_list, &machine->link);
|
|
|
|
machinarium.machine_count++;
|
|
|
|
pthread_spin_unlock(&machinarium.lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
mm_detach(mm_machine_t *machine)
|
|
|
|
{
|
|
|
|
pthread_spin_lock(&machinarium.lock);
|
|
|
|
mm_list_unlink(&machine->link);
|
|
|
|
machinarium.machine_count--;
|
|
|
|
pthread_spin_unlock(&machinarium.lock);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
mm_detach_by_id(int id, mm_machine_t **ret)
|
|
|
|
{
|
|
|
|
pthread_spin_lock(&machinarium.lock);
|
|
|
|
mm_list_t *i;
|
|
|
|
mm_list_foreach(&machinarium.machine_list, i) {
|
|
|
|
mm_machine_t *machine;
|
|
|
|
machine = mm_container_of(i, mm_machine_t, link);
|
|
|
|
if (machine->id == id) {
|
|
|
|
mm_list_unlink(&machine->link);
|
|
|
|
machinarium.machine_count--;
|
|
|
|
*ret = machine;
|
|
|
|
pthread_spin_unlock(&machinarium.lock);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pthread_spin_unlock(&machinarium.lock);
|
|
|
|
return -1;
|
|
|
|
}
|
2017-03-21 09:47:32 +00:00
|
|
|
|
2017-03-24 13:50:23 +00:00
|
|
|
MACHINE_API int
|
|
|
|
machinarium_init(void)
|
|
|
|
{
|
2017-05-17 14:20:04 +00:00
|
|
|
pthread_spin_init(&machinarium.lock, PTHREAD_PROCESS_PRIVATE);
|
|
|
|
mm_list_init(&machinarium.machine_list);
|
|
|
|
machinarium.machine_seq = 0;
|
|
|
|
machinarium.machine_count = 0;
|
2017-04-13 19:41:18 +00:00
|
|
|
mm_tls_init();
|
2017-03-28 11:51:57 +00:00
|
|
|
return 0;
|
2017-03-24 13:50:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MACHINE_API void
|
|
|
|
machinarium_free(void)
|
2017-05-17 14:20:04 +00:00
|
|
|
{
|
|
|
|
pthread_spin_destroy(&machinarium.lock);
|
|
|
|
}
|