struct buffer_wait buffer_wait; /* position in the list of objects waiting for a buffer */
struct task *t; /* task associated to the applet */
struct freq_ctr call_rate; /* appctx call rate */
- struct list wait_entry; /* entry in a list of waiters for an event (e.g. ring events) */
+ struct mt_list wait_entry; /* entry in a list of waiters for an event (e.g. ring events) */
/* The pointer seen by application code is appctx->svcctx. In 2.7 the
* anonymous union and the "ctx" struct disappeared, and the struct
struct dns_ring {
struct buffer buf; // storage area
- struct list waiters; // list of waiters, for now, CLI "show event"
+ struct mt_list waiters; // list of waiters, for now, CLI "show event"
__decl_thread(HA_RWLOCK_T lock);
int readers_count;
};
/* this is the ring definition, config, waiters etc */
struct ring {
struct ring_storage *storage; // the mapped part
- struct list waiters; // list of waiters, for now, CLI "show event"
+ struct mt_list waiters; // list of waiters, for now, CLI "show event"
__decl_thread(HA_RWLOCK_T lock);
int readers_count;
uint flags; // RING_FL_*
goto fail_appctx;
}
- LIST_INIT(&appctx->wait_entry);
+ MT_LIST_INIT(&appctx->wait_entry);
appctx->obj_type = OBJ_TYPE_APPCTX;
appctx->applet = applet;
appctx->sess = NULL;
}
HA_RWLOCK_WRLOCK(DNS_LOCK, &ring->lock);
- LIST_DEL_INIT(&appctx->wait_entry);
+ MT_LIST_DELETE(&appctx->wait_entry);
HA_RWLOCK_WRUNLOCK(DNS_LOCK, &ring->lock);
HA_RWLOCK_RDLOCK(DNS_LOCK, &ring->lock);
if (ret) {
/* let's be woken up once new request to write arrived */
HA_RWLOCK_WRLOCK(DNS_LOCK, &ring->lock);
- BUG_ON(LIST_INLIST(&appctx->wait_entry));
- LIST_APPEND(&ring->waiters, &appctx->wait_entry);
+ BUG_ON(MT_LIST_INLIST(&appctx->wait_entry));
+ MT_LIST_APPEND(&ring->waiters, &appctx->wait_entry);
HA_RWLOCK_WRUNLOCK(DNS_LOCK, &ring->lock);
applet_have_no_more_data(appctx);
}
BUG_ON(!LIST_ISEMPTY(&ds->list));
BUG_ON(!LIST_ISEMPTY(&ds->waiter));
BUG_ON(!LIST_ISEMPTY(&ds->queries));
- BUG_ON(!LIST_ISEMPTY(&ds->ring.waiters));
+ BUG_ON(!MT_LIST_ISEMPTY(&ds->ring.waiters));
BUG_ON(!eb_is_empty(&ds->query_ids));
pool_free(dns_session_pool, ds);
}
* to retry a conn with a different appctx.
*/
HA_RWLOCK_WRLOCK(DNS_LOCK, &ds->ring.lock);
- LIST_DEL_INIT(&appctx->wait_entry);
+ MT_LIST_DELETE(&appctx->wait_entry);
HA_RWLOCK_WRUNLOCK(DNS_LOCK, &ds->ring.lock);
dss = ds->dss;
void dns_ring_init(struct dns_ring *ring, void *area, size_t size)
{
HA_RWLOCK_INIT(&ring->lock);
- LIST_INIT(&ring->waiters);
+ MT_LIST_INIT(&ring->waiters);
ring->readers_count = 0;
ring->buf = b_make(area, size, 0, 0);
/* write the initial RC byte */
size_t lenlen;
uint64_t dellen;
int dellenlen;
+ struct mt_list *elt1, elt2;
ssize_t sent = 0;
int i;
sent = lenlen + totlen + 1;
/* notify potential readers */
- list_for_each_entry(appctx, &ring->waiters, wait_entry)
+ mt_list_for_each_entry_safe(appctx, &ring->waiters, wait_entry, elt1, elt2)
appctx_wakeup(appctx);
done_buf:
ofs -= b_head_ofs(&ring->buf);
BUG_ON(ofs >= b_size(&ring->buf));
- LIST_DEL_INIT(&appctx->wait_entry);
+ MT_LIST_DELETE(&appctx->wait_entry);
HA_ATOMIC_DEC(b_peek(&ring->buf, ofs));
}
HA_ATOMIC_DEC(&ring->readers_count);
void ring_init(struct ring *ring, void *area, size_t size, int reset)
{
HA_RWLOCK_INIT(&ring->lock);
- LIST_INIT(&ring->waiters);
+ MT_LIST_INIT(&ring->waiters);
ring->readers_count = 0;
ring->flags = 0;
ring->storage = area;
size_t ring_size;
char *ring_area;
struct ist v1, v2;
- struct appctx *appctx;
size_t msglen = 0;
size_t lenlen;
size_t needed;
/* notify potential readers */
if (sent && HA_ATOMIC_LOAD(&ring->readers_count)) {
+ struct mt_list *elt1, elt2;
+ struct appctx *appctx;
+
HA_RWLOCK_RDLOCK(RING_LOCK, &ring->lock);
- list_for_each_entry(appctx, &ring->waiters, wait_entry)
+ mt_list_for_each_entry_safe(appctx, &ring->waiters, wait_entry, elt1, elt2)
appctx_wakeup(appctx);
HA_RWLOCK_RDUNLOCK(RING_LOCK, &ring->lock);
}
return;
HA_RWLOCK_WRLOCK(RING_LOCK, &ring->lock);
+ HA_ATOMIC_DEC(&ring->readers_count);
+
if (ofs != ~0) {
/* reader was still attached */
uint8_t *area = (uint8_t *)ring_area(ring);
uint8_t readers;
BUG_ON(ofs >= ring_size(ring));
- LIST_DEL_INIT(&appctx->wait_entry);
+ MT_LIST_DELETE(&appctx->wait_entry);
/* dec readers count */
do {
} while ((readers > RING_MAX_READERS ||
!_HA_ATOMIC_CAS(area + ofs, &readers, readers - 1)) && __ha_cpu_relax());
}
- HA_ATOMIC_DEC(&ring->readers_count);
HA_RWLOCK_WRUNLOCK(RING_LOCK, &ring->lock);
}
return 1;
HA_RWLOCK_WRLOCK(RING_LOCK, &ring->lock);
- LIST_DEL_INIT(&appctx->wait_entry);
+ MT_LIST_DELETE(&appctx->wait_entry);
HA_RWLOCK_WRUNLOCK(RING_LOCK, &ring->lock);
ret = ring_dispatch_messages(ring, appctx, &ctx->ofs, &last_ofs, ctx->flags, applet_append_line);
if (!sc_oc(sc)->output && !(sc->flags & SC_FL_SHUT_DONE)) {
/* let's be woken up once new data arrive */
HA_RWLOCK_WRLOCK(RING_LOCK, &ring->lock);
- LIST_APPEND(&ring->waiters, &appctx->wait_entry);
+ MT_LIST_APPEND(&ring->waiters, &appctx->wait_entry);
ofs = ring_tail(ring);
HA_RWLOCK_WRUNLOCK(RING_LOCK, &ring->lock);
if (ofs != last_ofs) {
}
HA_RWLOCK_WRLOCK(RING_LOCK, &ring->lock);
- LIST_DEL_INIT(&appctx->wait_entry);
+ MT_LIST_DELETE(&appctx->wait_entry);
HA_RWLOCK_WRUNLOCK(RING_LOCK, &ring->lock);
ret = ring_dispatch_messages(ring, appctx, &sft->ofs, &last_ofs, 0, applet_append_line);
if (ret) {
/* let's be woken up once new data arrive */
HA_RWLOCK_WRLOCK(RING_LOCK, &ring->lock);
- LIST_APPEND(&ring->waiters, &appctx->wait_entry);
+ MT_LIST_APPEND(&ring->waiters, &appctx->wait_entry);
ofs = ring_tail(ring);
HA_RWLOCK_WRUNLOCK(RING_LOCK, &ring->lock);
if (ofs != last_ofs) {
}
HA_RWLOCK_WRLOCK(RING_LOCK, &ring->lock);
- LIST_DEL_INIT(&appctx->wait_entry);
+ MT_LIST_DELETE(&appctx->wait_entry);
HA_RWLOCK_WRUNLOCK(RING_LOCK, &ring->lock);
ret = ring_dispatch_messages(ring, appctx, &sft->ofs, &last_ofs, 0, syslog_applet_append_event);
if (ret) {
/* let's be woken up once new data arrive */
HA_RWLOCK_WRLOCK(RING_LOCK, &ring->lock);
- LIST_APPEND(&ring->waiters, &appctx->wait_entry);
+ MT_LIST_APPEND(&ring->waiters, &appctx->wait_entry);
ofs = ring_tail(ring);
HA_RWLOCK_WRUNLOCK(RING_LOCK, &ring->lock);
if (ofs != last_ofs) {
return;
HA_RWLOCK_WRLOCK(RING_LOCK, &sink->ctx.ring->lock);
- LIST_DEL_INIT(&sft->appctx->wait_entry);
+ MT_LIST_DELETE(&sft->appctx->wait_entry);
HA_RWLOCK_WRUNLOCK(RING_LOCK, &sink->ctx.ring->lock);
sft->appctx = NULL;