summaryrefslogtreecommitdiff
path: root/src/irmd/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/irmd/main.c')
-rw-r--r--src/irmd/main.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c
index 61ce6a49..0c157fd4 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -275,6 +275,11 @@ static pid_t create_ipcp(char * name,
struct ipcp_entry * tmp = NULL;
struct list_head * p = NULL;
struct ipcp_entry * entry = NULL;
+ int ret = 0;
+ pthread_condattr_t cattr;
+ struct timespec dl;
+ struct timespec to = {SOCKET_TIMEOUT / 1000,
+ (SOCKET_TIMEOUT % 1000) * MILLION};
api = malloc(sizeof(*api));
if (api == NULL)
@@ -311,13 +316,20 @@ static pid_t create_ipcp(char * name,
pthread_rwlock_unlock(&irmd.reg_lock);
return -1;
}
+ pthread_condattr_init(&cattr);
+#ifndef __APPLE__
+ pthread_condattr_setclock(&cattr, PTHREAD_COND_CLOCK);
+#endif
+
+ pthread_cond_init(&tmp->init_cond, &cattr);
+
+ pthread_condattr_destroy(&cattr);
- pthread_cond_init(&tmp->init_cond, NULL);
pthread_mutex_init(&tmp->init_lock, NULL);
- tmp->dif_name = NULL;
- tmp->type = ipcp_type;
- tmp->init = false;
+ tmp->dif_name = NULL;
+ tmp->type = ipcp_type;
+ tmp->init = false;
tmp->dir_hash_algo = -1;
list_for_each(p, &irmd.ipcps) {
@@ -334,11 +346,21 @@ static pid_t create_ipcp(char * name,
pthread_mutex_lock(&tmp->init_lock);
- while (tmp->init == false)
- pthread_cond_wait(&tmp->init_cond, &tmp->init_lock);
+ clock_gettime(PTHREAD_COND_CLOCK, &dl);
+ ts_add(&dl, &to, &dl);
+ while (tmp->init == false && ret != -ETIMEDOUT)
+ ret = -pthread_cond_timedwait(&tmp->init_cond,
+ &tmp->init_lock,
+ &dl);
pthread_mutex_unlock(&tmp->init_lock);
+ if (ret == -ETIMEDOUT) {
+ log_err("Process %d failed to respond.", api->pid);
+ kill(api->pid, SIGKILL);
+ return -1;
+ }
+
log_info("Created IPCP %d.", api->pid);
return api->pid;