summaryrefslogtreecommitdiffstats
path: root/runtime/staprun/staprun_funcs.c
diff options
context:
space:
mode:
authorhunt <hunt>2007-10-12 19:42:32 +0000
committerhunt <hunt>2007-10-12 19:42:32 +0000
commit2972246a08bfc7c516455ecc4ef976e10c0ddb2c (patch)
tree030cb7ae2694103f6c9abb64e5419a0df11368eb /runtime/staprun/staprun_funcs.c
parent7651c16b0e3d7dba7265be5e83720e324bdf64b0 (diff)
downloadsystemtap-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.c46
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();
}
+