shithub: pain

ref: 0cd1f6455c02fe0c2ade3e630debb315f054b253
dir: /utils.c/

View raw version
#include <u.h>
#include <libc.h>
#include <draw.h>

#include "dat.h"
#include "fns.h"

#define TASKLISTSIZE 10

QLock TaskLock;
Task TaskList[TASKLISTSIZE] = {0};

int newtask(ulong s, void (*f)(void))
{
	uint i;
	
	qlock(&TaskLock);
	for (i = 0; i < ARRLEN(TaskList); i++) {
		if (TaskList[i].func != nil)
			continue;

		TaskList[i] = (Task) { s, f };
		break;
	}
	qunlock(&TaskLock);
	
	return i >= ARRLEN(TaskList) ? -1 : i;
}

int removetask(int id)
{
	if (id < 0 || id >= ARRLEN(TaskList))
		return -1;
	qlock(&TaskLock);
	TaskList[id] = (Task) {0, nil};
	qunlock(&TaskLock);
	return 0;
}

void runtasks(void)
{
	Task * t;
	Task tl[ARRLEN(TaskList)];
	ulong i;
	
	qlock(&TaskLock);
	memcpy(tl, TaskList, sizeof(TaskList));
	qunlock(&TaskLock);

	for (i = 0; i < ARRLEN(tl); i++) {
		t = &tl[i];
		if (t->func == nil || t->start > msec())
			continue;

		t->func();
		removetask(i);
	}
}

void
quitloop(void)
{
	RunLoop = 0;
}

Point
mulptf(Point p, float f)
{
	p.x = (int)(((float)p.x) * f);
	p.y = (int)(((float)p.y) * f);
	return p;
}