Beispiel #1
0
int
ipsc_attachis(struct ipstate *is)
{
	frentry_t *fr;
	ipscan_t *i;

	READ_ENTER(&ipsc_rwlock);
	fr = is->is_rule;
	if (fr) {
		i = fr->fr_isc;
		if ((i != NULL) && (i != (ipscan_t *)-1)) {
			is->is_isc = i;
			ATOMIC_INC32(i->ipsc_sref);
			if (i->ipsc_clen)
				is->is_flags |= IS_SC_CLIENT;
			else
				is->is_flags |= IS_SC_MATCHC;
			if (i->ipsc_slen)
				is->is_flags |= IS_SC_SERVER;
			else
				is->is_flags |= IS_SC_MATCHS;
		}
	}
	RWLOCK_EXIT(&ipsc_rwlock);
	return 0;
}
Beispiel #2
0
int
ipsc_attachfr(struct frentry *fr)
{
	ipscan_t *i;

	if (fr->fr_isctag[0]) {
		READ_ENTER(&ipsc_rwlock);
		i = ipsc_lookup(fr->fr_isctag);
		if (i != NULL) {
			ATOMIC_INC32(i->ipsc_fref);
		}
		RWLOCK_EXIT(&ipsc_rwlock);
		if (i == NULL)
			return ENOENT;
		fr->fr_isc = i;
	}
	return 0;
}
Beispiel #3
0
int
rwfqueue_push (rwfqueue_t *rwfqueue, void *data)
{
    if (rwfqueue == NULL)
        return -1;

    if (data == NULL)
        return -2;

    if (rwfqueue->size == rwfqueue->count) {
        if (rwfqueue->wmode == RWFQUEUE_MODE_NOBLOCK)
            return -3;
        else {
            pthread_mutex_lock(&rwfqueue->lock);

            while (!rwfqueue->stop && rwfqueue->size == rwfqueue->count)
                pthread_cond_wait(&rwfqueue->cond, &rwfqueue->lock);

            pthread_mutex_unlock(&rwfqueue->lock);
        }
    }

    rwfqueue->head->data = data;
    rwfqueue->head->inuse = 1;

    ATOMIC_INC32(&rwfqueue->count);

    if (rwfqueue->head == rwfqueue->last)
        rwfqueue->head = rwfqueue->data;
    else
        rwfqueue->head++;

    // send a signal to the reader if there wasn't anything in
    // the queue prior to this call to push(), and now there is.
    if (rwfqueue->count == 1)
        pthread_cond_signal(&rwfqueue->cond);

    return 0;
}