diff options
author | hunt <hunt> | 2007-10-12 19:42:32 +0000 |
---|---|---|
committer | hunt <hunt> | 2007-10-12 19:42:32 +0000 |
commit | 2972246a08bfc7c516455ecc4ef976e10c0ddb2c (patch) | |
tree | 030cb7ae2694103f6c9abb64e5419a0df11368eb /runtime/staprun/staprun_funcs.c | |
parent | 7651c16b0e3d7dba7265be5e83720e324bdf64b0 (diff) | |
download | systemtap-steved-2972246a08bfc7c516455ecc4ef976e10c0ddb2c.tar.gz systemtap-steved-2972246a08bfc7c516455ecc4ef976e10c0ddb2c.tar.xz systemtap-steved-2972246a08bfc7c516455ecc4ef976e10c0ddb2c.zip |
2007-10-12 Martin Hunt <hunt@redhat.com>
Changes to separate the symbols from the command channel.
* cap.c (init_cap): Add CAP_DAC_OVERRIDE.
* staprun.h: Change init_ctl_channel prototype.
* ctl.c (init_ctl_channel): Modify to open either
a command or symbol channel. Use ".cmd" and ".symbols"
as the new names.
* mainloop.c (init_stapio): Call init_ctl_channel(0);
* staprun.c (cleanup): Call stop_symbol_thread().
(main): Call start_symbol_thread().
* staprun_funcs.c (handle_symbols): Make a thread.
(start_symbol_thread): New.
(stop_symbol_thread): New.
Diffstat (limited to 'runtime/staprun/staprun_funcs.c')
-rw-r--r-- | runtime/staprun/staprun_funcs.c | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/runtime/staprun/staprun_funcs.c b/runtime/staprun/staprun_funcs.c index eec4ae63..86a72985 100644 --- a/runtime/staprun/staprun_funcs.c +++ b/runtime/staprun/staprun_funcs.c @@ -385,8 +385,10 @@ int check_permissions(void) return check_path(); } -/* wait for symbol requests and reply */ -void handle_symbols(void) +pthread_t symbol_thread_id = (pthread_t)0; + +/* Symbol handling thread */ +void *handle_symbols(void __attribute__((unused)) *arg) { ssize_t nb; void *data; @@ -395,12 +397,6 @@ void handle_symbols(void) dbug(2, "waiting for symbol requests\n"); - /* create control channel */ - if (init_ctl_channel() < 0) { - err("Failed to initialize control channel.\n"); - exit(1); - } - while (1) { /* handle messages from control channel */ nb = read(control_channel, recvbuf, sizeof(recvbuf)); if (nb <= 0) { @@ -417,7 +413,7 @@ void handle_symbols(void) { dbug(2, "STP_MODULES request received\n"); do_module(data); - goto done; + break; } case STP_SYMBOLS: { @@ -439,6 +435,36 @@ void handle_symbols(void) err("WARNING: ignored message of type %d\n", (type)); } } -done: + + return NULL; +} + +void start_symbol_thread(void) +{ + int status; + + /* create symbol control channel */ + status = do_cap(CAP_DAC_OVERRIDE, init_ctl_channel, 1); + drop_cap(CAP_DAC_OVERRIDE); + if (status < 0) { + err("Failed to initialize control channel.\n"); + exit(1); + } + status = pthread_create(&symbol_thread_id, NULL, handle_symbols, NULL); + if (status) { + perr("Failed to create symbol thread.\n"); + exit(1); + } +} + +void stop_symbol_thread(void) +{ + + if (symbol_thread_id) { + dbug(2, "Stopping symbol thread.\n"); + pthread_cancel(symbol_thread_id); + pthread_join(symbol_thread_id, NULL); + } close_ctl_channel(); } + |