-
Notifications
You must be signed in to change notification settings - Fork 0
/
level_worker.c
87 lines (73 loc) · 1.71 KB
/
level_worker.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "worker.h"
#include "client.h"
#include "level.h"
#include "level_worker.h"
struct {
struct worker save;
struct worker load;
struct worker make;
struct worker send;
} s_level_workers;
struct level_make_job
{
struct level_t *level;
char *type;
};
void save_worker(void *data)
{
level_save_thread(data);
}
void load_worker(void *data)
{
level_load_thread(data);
}
void make_worker(void *data)
{
struct level_make_job *job = data;
level_gen_thread(job->level, job->type);
free(job->type);
free(job);
}
void send_worker(void *data)
{
struct client_t *client = data;
if (client_inuse(client, true))
{
level_send(client);
if (client->waiting_for_level) level_send_queue(client);
client_inuse(client, false);
}
}
void level_worker_init(void)
{
worker_init(&s_level_workers.save, "save", 30000, 10, &save_worker);
worker_init(&s_level_workers.load, "load", 30000, 1, &load_worker);
worker_init(&s_level_workers.make, "make", 30000, 10, &make_worker);
worker_init(&s_level_workers.send, "send", 30000, 1, &send_worker);
}
void level_worker_deinit(void)
{
worker_deinit(&s_level_workers.save);
worker_deinit(&s_level_workers.load);
worker_deinit(&s_level_workers.make);
worker_deinit(&s_level_workers.send);
}
void level_save_queue(struct level_t *level)
{
worker_queue(&s_level_workers.save, level);
}
void level_load_queue(struct level_t *level)
{
worker_queue(&s_level_workers.load, level);
}
void level_make_queue(struct level_t *level, const char *type)
{
struct level_make_job *job = malloc(sizeof *job);
job->level = level;
job->type = strdup(type);
worker_queue(&s_level_workers.make, job);
}
void level_send_queue(struct client_t *client)
{
worker_queue(&s_level_workers.send, client);
}