struct thread_status {
struct list list;
- pthread_t thread;
+ pthread_t thread;
struct dso_data *dso_data;/* DSO this thread accesses. */
static int event_wait(struct thread_status *thread)
{
int ret = 0;
- void *next=NULL;
+ void *next = NULL;
char *params, *target_type;
uint64_t start, length;
struct dm_task *dmt;
static int get_registered_device(struct message_data *message_data, int next)
{
int dev, dso, hit = 0;
- struct thread_status *thread = list_item(thread_registry.n,
- struct thread_status);
+ struct thread_status *thread;
lock_mutex();
+ thread = list_item(thread_registry.n, struct thread_status);
+
if (!message_data->dso_name &&
!message_data->device_path)
goto out;
list_iterate_items(thread, &thread_registry) {
dev = dso = 0;
- /* If we've got a DSO name. */
+ /* If DSO name equals. */
if (message_data->dso_name &&
!strcmp(message_data->dso_name,
thread->dso_data->dso_name))
dso = 1;
+ /* If dev path equals. */
if (message_data->device_path &&
!strcmp(message_data->device_path,
thread->device_path))
dev = 1;
- /* We've got both DSO name and device patch. */
+ /* We've got both DSO name and device patch or either. */
+ /* FIXME: wrong logic! */
if ((dso && dev) || dso || dev) {
hit = 1;
break;
out:
if (list_empty(&thread->list) ||
- list_end(&thread_registry, &thread->list)) {
+ &thread->list == &thread_registry) {
unlock_mutex();
return -ENOENT;
}
+ unlock_mutex();
+
return registered_device(message_data, thread);
}
}
/* Init thread signal handling. */
-static void init_thread_signals(void)
+#define HANGUP SIGHUP
+static void init_thread_signals(int hup)
{
sigset_t sigset;
sigfillset(&sigset);
- pthread_sigmask(SIG_BLOCK, &sigset, NULL);
+
+ if (hup)
+ sigdelset(&sigset, HANGUP);
+
+ pthread_sigmask(SIG_SETMASK, &sigset, NULL);
}
int main(void)
{
- int ret = 0;
struct fifos fifos;
- pthread_t log_thread = {0};
+ pthread_t log_thread = { 0 };
+
+ /* Make sure, parent accepts HANGUP signal. */
+ init_thread_signals(1);
switch (daemonize()) {
case 1: /* Child. */
break;
}
- init_thread_signals();
- kill(getppid(), SIGHUP);
+ init_thread_signals(0);
+ kill(getppid(), HANGUP);
/* Startup the syslog thread now so log_* macros work */
/*
if (!storepid(lf)) {
stack;
- return 0;
+ exit(EXIT_FAILURE);
}
if (mlockall(MCL_FUTURE) == -1) {
stack;
- return 0;
+ exit(EXIT_FAILURE);
}
/* Communication thread runs forever... */
case 0: /* Error (either on daemonize() or on comm_thread() return. */
unlock();
- ret = 1;
+ exit(EXIT_FAILURE);
break;
case 2: /* Parent. */
break;
}
- return 1;
+ exit(EXIT_SUCCESS);
}
/*