source: mainline/uspace/srv/sysman/unit.c@ d89b259

Last change on this file since d89b259 was dda2602, checked in by Matthieu Riolo <matthieu.riolo@…>, 6 years ago

sysman: Create units to start up to compositor

  • add necessary units to support basic GUI (barber, vterm)
  • lacking autostart is compensated with explicit dependencies
  • IPC_FLAG_AUTOSTART in compositor and locsrv fix
  • paths to v* binaries
  • refactored job closure creation

Conflicts:

boot/Makefile.common
uspace/app/vlaunch/vlaunch.c
uspace/srv/hid/compositor/compositor.c
uspace/srv/locsrv/locsrv.c

  • Property mode set to 100644
File size: 5.4 KB
Line 
1/*
2 * Copyright (c) 2015 Michal Koutny
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <assert.h>
30#include <errno.h>
31#include <fibril_synch.h>
32#include <conf/configuration.h>
33#include <conf/ini.h>
34#include <mem.h>
35#include <stddef.h>
36#include <stdio.h>
37#include <stdlib.h>
38#include <str.h>
39#include <sysman/unit.h>
40
41#include "dep.h"
42#include "log.h"
43#include "sysman.h"
44#include "unit.h"
45
46/** Virtual method table for each unit type */
47unit_vmt_t *unit_type_vmts[] = {
48 [UNIT_CONFIGURATION] = &unit_cfg_vmt,
49 [UNIT_MOUNT] = &unit_mnt_vmt,
50 [UNIT_TARGET] = &unit_tgt_vmt,
51 [UNIT_SERVICE] = &unit_svc_vmt
52};
53
54static const char *section_name = "Unit";
55
56static config_item_t unit_configuration[] = {
57 {"After", &unit_parse_unit_list, 0, ""},
58 CONFIGURATION_ITEM_SENTINEL
59};
60
61
62static void unit_init(unit_t *unit, unit_type_t type)
63{
64 assert(unit);
65
66 size_t size = unit_type_vmts[type]->size;
67 memset(unit, 0, size);
68
69 unit->type = type;
70 unit->state = STATE_EMBRYO;
71
72 link_initialize(&unit->units);
73 link_initialize(&unit->bfs_link);
74 list_initialize(&unit->dependants);
75 list_initialize(&unit->dependencies);
76
77 UNIT_VMT(unit)->init(unit);
78}
79
80unit_t *unit_create(unit_type_t type)
81{
82 size_t size = unit_type_vmts[type]->size;
83 unit_t *unit = malloc(size);
84 if (unit != NULL) {
85 unit_init(unit, type);
86 }
87 return unit;
88}
89
90/** Release resources used by unit structure */
91void unit_destroy(unit_t **unit_ptr)
92{
93 unit_t *unit = *unit_ptr;
94 if (unit == NULL)
95 return;
96
97 UNIT_VMT(unit)->destroy(unit);
98 /* TODO:
99 * edges,
100 * check it's not an active unit,
101 * other resources to come
102 */
103 free(unit->name);
104 free(unit);
105 unit_ptr = NULL;
106}
107
108int unit_load(unit_t *unit, ini_configuration_t *ini_conf,
109 text_parse_t *text_parse)
110{
111 sysman_log(LVL_DEBUG, "%s('%s')", __func__, unit_name(unit));
112
113 int rc = EOK;
114 ini_section_t *unit_section = ini_get_section(ini_conf, section_name);
115 if (unit_section) {
116 rc = config_load_ini_section(unit_configuration,
117 unit_section, unit, text_parse);
118 }
119
120 if (rc != EOK) {
121 return rc;
122 } else {
123 return UNIT_VMT(unit)->load(unit, ini_conf, text_parse);
124 }
125}
126
127/** Issue request to restarter to start a unit
128 *
129 * Ideally this function is non-blocking synchronous, however, some units
130 * cannot be started synchronously and thus return from this function generally
131 * means that start was requested.
132 *
133 * Check state of the unit for actual result, start method can end in states:
134 * - STATE_STARTED, (succesful synchronous start)
135 * - STATE_STARTING, (succesful asynchronous start request)
136 * - STATE_FAILED. (unit state changed and error occured)
137 */
138int unit_start(unit_t *unit)
139{
140 sysman_log(LVL_DEBUG, "%s('%s')", __func__, unit_name(unit));
141 return UNIT_VMT(unit)->start(unit);
142}
143
144void unit_exposee_created(unit_t *unit)
145{
146 sysman_log(LVL_DEBUG, "%s('%s')", __func__, unit_name(unit));
147 return UNIT_VMT(unit)->exposee_created(unit);
148}
149
150void unit_fail(unit_t *unit)
151{
152 sysman_log(LVL_DEBUG, "%s('%s')", __func__, unit_name(unit));
153 return UNIT_VMT(unit)->fail(unit);
154}
155
156void unit_notify_state(unit_t *unit)
157{
158 sysman_raise_event(&sysman_event_unit_state_changed, unit);
159}
160
161unit_type_t unit_type_name_to_type(const char *type_name)
162{
163 if (str_cmp(type_name, UNIT_CFG_TYPE_NAME) == 0)
164 return UNIT_CONFIGURATION;
165
166 else if (str_cmp(type_name, UNIT_MNT_TYPE_NAME) == 0)
167 return UNIT_MOUNT;
168
169 else if (str_cmp(type_name, UNIT_TGT_TYPE_NAME) == 0)
170 return UNIT_TARGET;
171
172 else if (str_cmp(type_name, UNIT_SVC_TYPE_NAME) == 0)
173 return UNIT_SERVICE;
174
175 else
176 return UNIT_TYPE_INVALID;
177}
178
179/** Format unit name to be presented to user */
180const char *unit_name(const unit_t *unit)
181{
182 return unit->name ? unit->name : "";
183}
184
185bool unit_parse_unit_list(const char *string, void *dst, text_parse_t *parse,
186 size_t lineno)
187{
188 unit_t *unit = dst;
189 bool result;
190 char *my_string = str_dup(string);
191
192 if (!my_string) {
193 result = false;
194 goto finish;
195 }
196
197 char *to_split = my_string;
198 char *cur_tok;
199
200 while ((cur_tok = str_tok(to_split, " ", &to_split))) {
201 if (dep_sprout_dependency(unit, cur_tok) != EOK) {
202 result = false;
203 goto finish;
204 }
205 }
206
207 result = true;
208
209finish:
210 free(my_string);
211 return result;
212}
Note: See TracBrowser for help on using the repository browser.