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; }
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; }
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; }