From c4ca2da6ca875c0142a4e7ffd95e0aa0c573590b Mon Sep 17 00:00:00 2001 From: "Frank Ch. Eigler" Date: Tue, 13 Oct 2009 17:33:29 -0400 Subject: runtime shutdown errors: simplify, improve error specificity * transport/control.c (*_cmd): Return -Ecodes rather than "-1" from file_operations callbacks. * staprun/ctl.c (init_ctl_channel): Return distinct error codes. * staprun/staprun.c (remove_module): Skip connection attempt to .ctl file; just do delete_module() with O_NONBLOCK. --- runtime/staprun/staprun.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) (limited to 'runtime/staprun/staprun.c') diff --git a/runtime/staprun/staprun.c b/runtime/staprun/staprun.c index 7b4aba1c..c5651d9a 100644 --- a/runtime/staprun/staprun.c +++ b/runtime/staprun/staprun.c @@ -181,27 +181,25 @@ static int remove_module(const char *name, int verb) int ret; dbug(2, "%s\n", name); + (void) verb; /* XXX: ignore */ + if (strcmp(name, "*") == 0) { remove_all_modules(); return 0; } - /* Call init_ctl_channel() which actually attempts an open() - * of the control channel. This is better than using access() because - * an open on an already open channel will fail, preventing us from attempting - * to remove an in-use module. - */ - if (init_ctl_channel(name, 0) < 0) { - if (verb) - err("Error accessing systemtap module %s: %s\n", name, strerror(errno)); - return 1; - } - close_ctl_channel(); + /* We could call init_ctl_channel / close_ctl_channel here, as a heuristic + to determine whether the module is being used by some other stapio process. + However, delete_module() does basically the same thing. */ dbug(2, "removing module %s\n", name); STAP_PROBE1(staprun, remove__module, name); - ret = delete_module (name, 0); + ret = delete_module (name, O_NONBLOCK); if (ret != 0) { + /* XXX: maybe we should just accept this, with a + diagnostic, but without an error. Might it be + possible for the same module to be started up just + as we're shutting down? */ err("Error removing module '%s': %s.\n", name, strerror(errno)); return 1; } -- cgit