Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
4455a78b44d6ceba2ab229188a85ccf9811f322d
[simgrid.git] / src / gras / gs / type_driver.c
1 /* gs_type_driver.c */
2
3 #include "gs/gs_private.h"
4
5 static
6 gras_dict_t *p_type_driver_dict = NULL;
7
8 void
9 gs_type_drivers_init(void) {
10         gras_dict_insert(p_type_driver_dict, "rl", gs_rl_type_driver(), NULL);
11 }
12
13
14 struct s_gs_type_driver *
15 gs_type_driver_init(const char *name) {
16
17         struct s_gs_type_driver_ops     *type_driver_ops = NULL;
18         struct s_gs_type_driver         *p_type_driver   = NULL;
19
20         gras_dict_retrieve(p_type_driver_dict, name, (void **)&type_driver_ops);
21         if (!type_driver_ops)
22                 GS_FAILURE("type driver not found");
23
24         p_type_driver           = calloc(1, sizeof (struct s_gs_type_driver));
25         p_type_driver->type_ops = type_driver_ops;
26         p_type_driver->specific = NULL;
27
28         if (type_driver_ops->_init) {
29                 type_driver_ops->_init(p_type_driver);
30         }
31
32         return p_type_driver;
33 }
34
35
36
37 void
38 gs_type_driver_exit(struct s_gs_type_driver     *p_type_driver){
39
40         struct s_gs_type_driver_ops     *type_driver_ops = NULL;
41
42         type_driver_ops = p_type_driver->type_ops;
43         if (type_driver_ops->_exit) {
44                 type_driver_ops->_exit(p_type_driver);
45         }
46
47         p_type_driver->type_ops = NULL;
48
49         if (p_type_driver->specific) {
50                 free(p_type_driver->specific);
51                 p_type_driver->specific = NULL;
52         }
53
54         free(p_type_driver);
55 }
56
57 struct s_gs_type_bag *
58 gs_type_bag_alloc(struct s_gs_type_driver       *p_driver) {
59
60         struct s_gs_type_bag            *p_bag   = NULL;
61         struct s_gs_type_bag_ops        *bag_ops = p_driver->bag_ops;
62
63         p_bag = calloc(1, sizeof(struct s_gs_type_bag));
64
65         p_bag->bag_ops          = bag_ops;
66         p_bag->p_type_driver    = p_driver;
67         p_bag->specific         = NULL;
68
69         if (bag_ops->_init) {
70                 bag_ops->_init(p_bag);
71         }
72
73         return p_bag;
74 }
75
76 void
77 gs_type_bag_free(struct s_gs_type_bag   *p_bag) {
78
79         struct s_gs_type_bag_ops        *bag_ops = p_bag->bag_ops;
80
81         if (bag_ops->_exit) {
82                 bag_ops->_exit(p_bag);
83         }
84
85         if (p_bag->specific) {
86                 free(p_bag->specific);
87                 p_bag->specific = NULL;
88         }
89
90         free(p_bag);
91 }
92