[go: up one dir, main page]

File: ds_task.c

package info (click to toggle)
cctools 9.9-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 44,624 kB
  • sloc: ansic: 192,539; python: 20,827; cpp: 20,199; sh: 11,719; perl: 4,106; xml: 3,688; makefile: 1,224
file content (107 lines) | stat: -rw-r--r-- 2,426 bytes parent folder | download
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "ds_task.h"
#include "ds_mount.h"
#include "ds_resources.h"

#include "jx_print.h"
#include "jx_parse.h"

#include <stdlib.h>
#include <string.h>
#include <assert.h>

struct ds_task * ds_task_create( struct jx *jtask )
{
	struct ds_task *t = malloc(sizeof(*t));
	memset(t,0,sizeof(*t));

	t->command = jx_lookup_string_dup(jtask,"command");
	t->taskid = jx_lookup_string_dup(jtask,"task-id");

	t->environment = jx_lookup(jtask,"environment");
	if(t->environment) t->environment = jx_copy(t->environment);

	t->resources = ds_resources_create_from_jx(jx_lookup(jtask,"resources"));
	t->mounts = ds_mounts_create(jx_lookup(jtask,"namespace"));

	t->state = DS_TASK_ACTIVE;

	t->worker = NULL;
	t->attempts = NULL;

	t->subscribers = set_create(0);

	return t;

}

struct ds_task * ds_task_create_from_file( const char *filename )
{
	FILE *file = fopen(filename,"r");
	if(!file) return 0;

	struct jx *jtask = jx_parse_stream(file);
	if(!jtask) {
		fclose(file);
		return 0;
	}

	struct ds_task *t = ds_task_create(jtask);

	jx_delete(jtask);
	fclose(file);

	return t;
}

const char * ds_task_state_string( ds_task_state_t state )
{
	switch(state) {
		case DS_TASK_ACTIVE: return "active";
		case DS_TASK_DONE: return "done";
		case DS_TASK_DELETING: return "deleting";
		case DS_TASK_DELETED: return "deleted";
		default: return "unknown";
	}
}

struct jx * ds_task_to_jx( struct ds_task *t )
{
	struct jx *jtask = jx_object(0);
	if(t->command) jx_insert_string(jtask,"command",t->command);
	if(t->taskid) jx_insert_string(jtask,"task-id",t->taskid);
	if(t->environment) jx_insert(jtask,jx_string("environment"),jx_copy(t->environment));
	if(t->resources) jx_insert(jtask,jx_string("resources"),ds_resources_to_jx(t->resources));
	if(t->mounts) jx_insert(jtask,jx_string("namespace"),ds_mounts_to_jx(t->mounts));
	jx_insert_string(jtask,"state",ds_task_state_string(t->state));
	return jtask;
}

int ds_task_to_file( struct ds_task *t, const char *filename )
{
	struct jx *jtask = ds_task_to_jx(t);
	if(!jtask) return 0;

	FILE *file = fopen(filename,"w");
	if(!file) {
		jx_delete(jtask);
		return 0;
	}

	jx_print_stream(jtask,file);

	jx_delete(jtask);
	fclose(file);

	return 1;
}

void ds_task_delete( struct ds_task *t )
{
	if(!t) return;
	if(t->command) free(t->command);
	if(t->taskid) free(t->taskid);
	ds_resources_delete(t->resources);
	ds_mount_delete(t->mounts);
	set_delete(t->subscribers);
	free(t);
}