Пример #1
0
int start_waiter_thread (struct multipath *mpp, struct vectors *vecs)
{
    struct event_thread *wp;

    if (!mpp)
        return 0;

    wp = alloc_waiter();

    if (!wp)
        goto out;

    mpp->waiter = (void *)wp;
    strncpy(wp->mapname, mpp->alias, WWID_SIZE);
    wp->vecs = vecs;
    wp->mpp = mpp;

    if (pthread_create(&wp->thread, &waiter_attr, waitevent, wp)) {
        condlog(0, "%s: cannot create event checker", wp->mapname);
        goto out1;
    }
    condlog(2, "%s: event checker started", wp->mapname);

    return 0;
out1:
    free_waiter(wp);
    mpp->waiter = NULL;
out:
    condlog(0, "failed to start waiter thread");
    return 1;
}
Пример #2
0
void *waitevent (void *et)
{
	int r;
	struct event_thread *waiter;

	mlockall(MCL_CURRENT | MCL_FUTURE);

	waiter = (struct event_thread *)et;
	pthread_cleanup_push(signal_waiter, et);

	block_signal(SIGUSR1, NULL);
	block_signal(SIGHUP, NULL);
	while (1) {
		r = waiteventloop(waiter);

		if (r < 0)
			break;

		sleep(r);
	}

	pthread_cleanup_pop(1);
	free_waiter(waiter);
	return NULL;
}