daemon: make stop and kill app commands async ones

This commit is contained in:
Nedko Arnaudov 2010-05-08 22:20:08 +03:00
parent d2782283a7
commit c830748430
4 changed files with 143 additions and 72 deletions

View File

@ -346,7 +346,7 @@ ladish_app_supervisor_enum(
#define app_ptr ((struct ladish_app *)app_handle)
bool ladish_app_supervisor_run(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle)
bool ladish_app_supervisor_start_app(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle)
{
app_ptr->zombie = false;
@ -364,7 +364,19 @@ bool ladish_app_supervisor_run(ladish_app_supervisor_handle supervisor_handle, l
return true;
}
void ladish_app_supervisor_remove(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle)
void ladish_app_supervisor_stop_app(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle)
{
app_ptr->state = LADISH_APP_STATE_STOPPING;
kill(app_ptr->pid, SIGTERM);
}
void ladish_app_supervisor_kill_app(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle)
{
app_ptr->state = LADISH_APP_STATE_KILL;
kill(app_ptr->pid, SIGKILL);
}
void ladish_app_supervisor_remove_app(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle)
{
remove_app_internal(supervisor_ptr, app_ptr);
}
@ -404,7 +416,7 @@ void ladish_app_supervisor_autorun(ladish_app_supervisor_handle supervisor_handl
log_info("autorun('%s', %s, '%s') called", app_ptr->name, app_ptr->terminal ? "terminal" : "shell", app_ptr->commandline);
if (!ladish_app_supervisor_run((ladish_app_supervisor_handle)supervisor_ptr, (ladish_app_handle)app_ptr))
if (!ladish_app_supervisor_start_app((ladish_app_supervisor_handle)supervisor_ptr, (ladish_app_handle)app_ptr))
{
log_error("Execution of '%s' failed", app_ptr->commandline);
return;
@ -634,7 +646,6 @@ static void start_app(struct dbus_method_call * call_ptr)
static void stop_app(struct dbus_method_call * call_ptr)
{
uint64_t id;
struct ladish_app * app_ptr;
if (!dbus_message_get_args(
call_ptr->message,
@ -647,29 +658,15 @@ static void stop_app(struct dbus_method_call * call_ptr)
return;
}
app_ptr = ladish_app_supervisor_find_app_by_id_internal(supervisor_ptr, id);
if (app_ptr == NULL)
if (ladish_command_change_app_state(call_ptr, ladish_studio_get_cmd_queue(), supervisor_ptr->opath, id, LADISH_APP_STATE_STOPPED))
{
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_INVALID_ARGS, "App with ID %"PRIu64" not found", id);
return;
method_return_new_void(call_ptr);
}
if (app_ptr->pid == 0)
{
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_INVALID_ARGS, "App %s is not running", app_ptr->name);
return;
}
app_ptr->state = LADISH_APP_STATE_STOPPING;
kill(app_ptr->pid, SIGTERM);
method_return_new_void(call_ptr);
}
static void kill_app(struct dbus_method_call * call_ptr)
{
uint64_t id;
struct ladish_app * app_ptr;
if (!dbus_message_get_args(
call_ptr->message,
@ -682,23 +679,10 @@ static void kill_app(struct dbus_method_call * call_ptr)
return;
}
app_ptr = ladish_app_supervisor_find_app_by_id_internal(supervisor_ptr, id);
if (app_ptr == NULL)
if (ladish_command_change_app_state(call_ptr, ladish_studio_get_cmd_queue(), supervisor_ptr->opath, id, LADISH_APP_STATE_KILL))
{
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_INVALID_ARGS, "App with ID %"PRIu64" not found", id);
return;
method_return_new_void(call_ptr);
}
if (app_ptr->pid == 0)
{
lash_dbus_error(call_ptr, LASH_DBUS_ERROR_INVALID_ARGS, "App %s is not running", app_ptr->name);
return;
}
app_ptr->state = LADISH_APP_STATE_KILL;
kill(app_ptr->pid, SIGKILL);
method_return_new_void(call_ptr);
}
static void get_app_properties(struct dbus_method_call * call_ptr)
@ -984,8 +968,8 @@ METHODS_BEGIN
METHOD_DESCRIBE(GetAll, get_all) /* sync */
METHOD_DESCRIBE(RunCustom, run_custom) /* async */
METHOD_DESCRIBE(StartApp, start_app) /* async */
METHOD_DESCRIBE(StopApp, stop_app) /* sync */
METHOD_DESCRIBE(KillApp, kill_app) /* sync */
METHOD_DESCRIBE(StopApp, stop_app) /* async */
METHOD_DESCRIBE(KillApp, kill_app) /* async */
METHOD_DESCRIBE(GetAppProperties, get_app_properties) /* sync */
METHOD_DESCRIBE(SetAppProperties, set_app_properties) /* sync */
METHOD_DESCRIBE(RemoveApp, remove_app) /* sync */

View File

@ -255,7 +255,23 @@ const char * ladish_app_supervisor_get_opath(ladish_app_supervisor_handle superv
*
* @return success status
*/
bool ladish_app_supervisor_run(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle);
bool ladish_app_supervisor_start_app(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle);
/**
* Stop an app. The app must be in started state.
*
* @param[in] supervisor_handle supervisor object handle
* @param[in] app_handle Handle of app to stop
*/
void ladish_app_supervisor_stop_app(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle);
/**
* Force kill an app. The app must be in started state.
*
* @param[in] supervisor_handle supervisor object handle
* @param[in] app_handle Handle of app to stop
*/
void ladish_app_supervisor_kill_app(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle);
/**
* Remove an app. The app must be in stopped state.
@ -263,7 +279,7 @@ bool ladish_app_supervisor_run(ladish_app_supervisor_handle supervisor_handle, l
* @param[in] supervisor_handle supervisor object handle
* @param[in] app_handle Handle of app to start
*/
void ladish_app_supervisor_remove(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle);
void ladish_app_supervisor_remove_app(ladish_app_supervisor_handle supervisor_handle, ladish_app_handle app_handle);
/**
* Get commandline for an app.

View File

@ -38,23 +38,10 @@ struct ladish_command_start_app
unsigned int target_state;
};
#define cmd_ptr ((struct ladish_command_start_app *)context)
static bool run(void * context)
static bool run_target_start(struct ladish_command_start_app * cmd_ptr, ladish_app_supervisor_handle supervisor, ladish_app_handle app)
{
ladish_app_supervisor_handle supervisor;
ladish_app_handle app;
ASSERT(cmd_ptr->command.state == LADISH_COMMAND_STATE_PENDING);
log_info("start_app command. opath='%s'", cmd_ptr->opath);
if (cmd_ptr->target_state != LADISH_APP_STATE_STARTED)
{
log_error("ATM only starting apps is implemented in the change app state command");
return false;
}
if (!ladish_studio_is_started())
{
log_error("cannot start app because studio is not started", cmd_ptr->opath);
@ -62,22 +49,6 @@ static bool run(void * context)
return false;
}
supervisor = ladish_studio_find_app_supervisor(cmd_ptr->opath);
if (supervisor == NULL)
{
log_error("cannot find supervisor '%s' to start app", cmd_ptr->opath);
ladish_notify_simple(LADISH_NOTIFY_URGENCY_HIGH, "Cannot start app because of internal error (unknown supervisor)", NULL);
return false;
}
app = ladish_app_supervisor_find_app_by_id(supervisor, cmd_ptr->id);
if (app == NULL)
{
log_error("App with ID %"PRIu64" not found", cmd_ptr->id);
ladish_notify_simple(LADISH_NOTIFY_URGENCY_HIGH, "Cannot start app because it is not found", NULL);
return false;
}
if (ladish_app_is_running(app))
{
log_error("App %s is already running", ladish_app_get_name(app));
@ -85,7 +56,7 @@ static bool run(void * context)
return false;
}
if (!ladish_app_supervisor_run(supervisor, app))
if (!ladish_app_supervisor_start_app(supervisor, app))
{
ladish_notify_simple(LADISH_NOTIFY_URGENCY_HIGH, "Cannot start app (execution failed)", NULL);
return false;
@ -95,6 +66,106 @@ static bool run(void * context)
return true;
}
static bool run_target_stop(struct ladish_command_start_app * cmd_ptr, ladish_app_supervisor_handle supervisor, ladish_app_handle app)
{
if (!ladish_app_is_running(app))
{
if (cmd_ptr->command.state == LADISH_COMMAND_STATE_PENDING)
{
log_info("App %s is already stopped (stop)", ladish_app_get_name(app));
}
cmd_ptr->command.state = LADISH_COMMAND_STATE_DONE;
return true;
}
if (cmd_ptr->command.state == LADISH_COMMAND_STATE_PENDING)
{
ladish_app_supervisor_stop_app(supervisor, app);
cmd_ptr->command.state = LADISH_COMMAND_STATE_WAITING;
return true;
}
log_info("Waiting '%s' process termination (stop)...", ladish_app_get_name(app));
return true;
}
static bool run_target_kill(struct ladish_command_start_app * cmd_ptr, ladish_app_supervisor_handle supervisor, ladish_app_handle app)
{
if (!ladish_app_is_running(app))
{
if (cmd_ptr->command.state == LADISH_COMMAND_STATE_PENDING)
{
log_info("App %s is already stopped (kill)", ladish_app_get_name(app));
}
cmd_ptr->command.state = LADISH_COMMAND_STATE_DONE;
return true;
}
if (cmd_ptr->command.state == LADISH_COMMAND_STATE_PENDING)
{
ladish_app_supervisor_kill_app(supervisor, app);
cmd_ptr->command.state = LADISH_COMMAND_STATE_WAITING;
return true;
}
log_info("Waiting '%s' process termination(kill)...", ladish_app_get_name(app));
return true;
}
#define cmd_ptr ((struct ladish_command_start_app *)context)
static bool run(void * context)
{
ladish_app_supervisor_handle supervisor;
ladish_app_handle app;
const char * target_state_description;
bool (* run_target)(struct ladish_command_start_app *, ladish_app_supervisor_handle, ladish_app_handle);
switch (cmd_ptr->target_state)
{
case LADISH_APP_STATE_STARTED:
target_state_description = "start";
run_target = run_target_start;
break;
case LADISH_APP_STATE_STOPPED:
target_state_description = "stopped";
run_target = run_target_stop;
break;
case LADISH_APP_STATE_KILL:
target_state_description = "kill";
run_target = run_target_kill;
break;
default:
ASSERT_NO_PASS;
return false;
}
if (cmd_ptr->command.state == LADISH_COMMAND_STATE_PENDING)
{
log_info("%s app command. opath='%s'", target_state_description, cmd_ptr->opath);
}
supervisor = ladish_studio_find_app_supervisor(cmd_ptr->opath);
if (supervisor == NULL)
{
log_error("cannot find supervisor '%s' to %s app", cmd_ptr->opath, target_state_description);
ladish_notify_simple(LADISH_NOTIFY_URGENCY_HIGH, "Cannot change app state because of internal error (unknown supervisor)", NULL);
return false;
}
app = ladish_app_supervisor_find_app_by_id(supervisor, cmd_ptr->id);
if (app == NULL)
{
log_error("App with ID %"PRIu64" not found (%s)", cmd_ptr->id, target_state_description);
ladish_notify_simple(LADISH_NOTIFY_URGENCY_HIGH, "Cannot change app state because it is not found", NULL);
return false;
}
return run_target(cmd_ptr, supervisor, app);
}
static void destructor(void * context)
{
log_info("start_app command destructor");

View File

@ -136,10 +136,10 @@ static bool run(void * context)
if (ladish_studio_is_started())
{
if (!ladish_app_supervisor_run(supervisor, app))
if (!ladish_app_supervisor_start_app(supervisor, app))
{
log_error("Execution of '%s' failed", cmd_ptr->commandline);
ladish_app_supervisor_remove(supervisor, app);
ladish_app_supervisor_remove_app(supervisor, app);
return false;
}
}