Lines Matching refs:manager

6 #include "action-manager.h"
40 * struct action_manager - Definition of an action manager.
42 * @state: The state of this action manager.
50 * @context: Opaque data associated with this action manager.
91 * vdo_make_action_manager() - Make an action manager.
99 * @manager_ptr: A pointer to hold the new action manager.
109 struct action_manager *manager;
110 int result = vdo_allocate(1, struct action_manager, __func__, &manager);
115 *manager = (struct action_manager) {
124 manager->actions[0].next = &manager->actions[1];
125 manager->current_action = manager->actions[1].next =
126 &manager->actions[0];
127 vdo_set_admin_state_code(&manager->state, VDO_ADMIN_STATE_NORMAL_OPERATION);
128 vdo_initialize_completion(&manager->completion, vdo, VDO_ACTION_COMPLETION);
129 *manager_ptr = manager;
133 const struct admin_state_code *vdo_get_current_manager_operation(struct action_manager *manager)
135 return vdo_get_admin_state_code(&manager->state);
138 void *vdo_get_current_action_context(struct action_manager *manager)
140 return manager->current_action->in_use ? manager->current_action->context : NULL;
146 static thread_id_t get_acting_zone_thread_id(struct action_manager *manager)
148 return manager->get_zone_thread_id(manager->context, manager->acting_zone);
160 static void prepare_for_next_zone(struct action_manager *manager)
162 vdo_prepare_completion_for_requeue(&manager->completion, apply_to_zone,
164 get_acting_zone_thread_id(manager),
165 manager->current_action->parent);
168 static void prepare_for_conclusion(struct action_manager *manager)
170 vdo_prepare_completion_for_requeue(&manager->completion, finish_action_callback,
171 preserve_error, manager->initiator_thread_id,
172 manager->current_action->parent);
178 struct action_manager *manager = as_action_manager(completion);
180 VDO_ASSERT_LOG_ONLY((vdo_get_callback_thread_id() == get_acting_zone_thread_id(manager)),
183 zone = manager->acting_zone++;
184 if (manager->acting_zone == manager->zones) {
189 prepare_for_conclusion(manager);
192 prepare_for_next_zone(manager);
195 manager->current_action->zone_action(manager->context, zone, completion);
205 static void launch_current_action(struct action_manager *manager)
207 struct action *action = manager->current_action;
208 int result = vdo_start_operation(&manager->state, action->operation);
216 finish_action_callback(&manager->completion);
221 prepare_for_conclusion(manager);
223 manager->acting_zone = 0;
224 vdo_prepare_completion_for_requeue(&manager->completion, apply_to_zone,
226 get_acting_zone_thread_id(manager),
227 manager->current_action->parent);
230 action->preamble(manager->context, &manager->completion);
235 * @manager: The action manager.
237 * If the manager is not operating normally, the action will not be scheduled.
241 bool vdo_schedule_default_action(struct action_manager *manager)
244 const struct admin_state_code *code = vdo_get_current_manager_operation(manager);
247 manager->scheduler(manager->context));
254 struct action_manager *manager = as_action_manager(completion);
255 struct action action = *(manager->current_action);
257 manager->current_action->in_use = false;
258 manager->current_action = manager->current_action->next;
262 * notifying the parent results in the manager being freed.
265 (manager->current_action->in_use || vdo_schedule_default_action(manager));
266 result = action.conclusion(manager->context);
267 vdo_finish_operation(&manager->state, VDO_SUCCESS);
272 launch_current_action(manager);
277 * @manager: The action manager to schedule the action on.
293 bool vdo_schedule_action(struct action_manager *manager, vdo_action_preamble_fn preamble,
297 return vdo_schedule_operation(manager, VDO_ADMIN_STATE_OPERATING, preamble,
303 * @manager: The action manager to schedule the action on.
320 bool vdo_schedule_operation(struct action_manager *manager,
326 return vdo_schedule_operation_with_context(manager, operation, preamble, action,
332 * @manager: The action manager to schedule the action on.
351 bool vdo_schedule_operation_with_context(struct action_manager *manager,
360 VDO_ASSERT_LOG_ONLY((vdo_get_callback_thread_id() == manager->initiator_thread_id),
362 if (!manager->current_action->in_use) {
363 current_action = manager->current_action;
364 } else if (!manager->current_action->next->in_use) {
365 current_action = manager->current_action->next;
384 if (current_action == manager->current_action)
385 launch_current_action(manager);