[NUT-devel] [nut]: r142 - in trunk/libnut: demuxer.c muxer.c nut.h priv.h reorder.c
ods15
subversion at mplayerhq.hu
Sat Sep 23 20:34:55 CEST 2006
Author: ods15
Date: Sat Sep 23 20:34:54 2006
New Revision: 142
Modified:
trunk/libnut/demuxer.c
trunk/libnut/muxer.c
trunk/libnut/nut.h
trunk/libnut/priv.h
trunk/libnut/reorder.c
Log:
big change to user malloc
Modified: trunk/libnut/demuxer.c
==============================================================================
--- trunk/libnut/demuxer.c (original)
+++ trunk/libnut/demuxer.c Sat Sep 23 20:34:54 2006
@@ -30,7 +30,7 @@
amount += 10; // ### + PREALLOC_SIZE ?
if (bc->write_len - pos < amount) {
bc->write_len = amount + pos + PREALLOC_SIZE;
- bc->buf = realloc(bc->buf, bc->write_len);
+ bc->buf = bc->alloc->realloc(bc->buf, bc->write_len);
bc->buf_ptr = bc->buf + pos;
}
bc->read_len += bc->isc.read(bc->isc.priv, amount - (bc->read_len - pos), bc->buf + bc->read_len);
@@ -87,11 +87,13 @@
bc->file_pos = 0;
bc->filesize = 0;
bc->buf_ptr = bc->buf = NULL;
+ bc->alloc = NULL;
return bc;
}
-static input_buffer_t * new_input_buffer(nut_input_stream_t isc) {
- input_buffer_t * bc = new_mem_buffer(malloc(sizeof(input_buffer_t)));
+static input_buffer_t * new_input_buffer(nut_alloc_t * alloc, nut_input_stream_t isc) {
+ input_buffer_t * bc = new_mem_buffer(alloc->malloc(sizeof(input_buffer_t)));
+ bc->alloc = alloc;
bc->is_mem = 0;
bc->isc = isc;
bc->file_pos = isc.file_pos;
@@ -104,10 +106,10 @@
}
static void free_buffer(input_buffer_t * bc) {
- assert(!bc->is_mem);
if (!bc) return;
- free(bc->buf);
- free(bc);
+ assert(!bc->is_mem);
+ bc->alloc->free(bc->buf);
+ bc->alloc->free(bc);
}
static int get_bytes(input_buffer_t * bc, int count, uint64_t * val) {
@@ -194,12 +196,12 @@
return len;
}
-static int get_vb(input_buffer_t * in, int * len, uint8_t ** buf) {
+static int get_vb(nut_alloc_t * alloc, input_buffer_t * in, int * len, uint8_t ** buf) {
uint64_t tmp;
int err;
if ((err = get_v(in, &tmp))) return err;
*len = tmp;
- *buf = realloc(*buf, tmp);
+ *buf = alloc->realloc(*buf, tmp);
if (get_data(in, tmp, *buf) != tmp) return buf_eof(in);
return 0;
}
@@ -242,7 +244,7 @@
if (nut->max_distance > 65536) nut->max_distance = 65536;
GET_V(tmp, nut->timebase_count);
- nut->tb = realloc(nut->tb, nut->timebase_count * sizeof(nut_timebase_t));
+ nut->tb = nut->alloc->realloc(nut->tb, nut->timebase_count * sizeof(nut_timebase_t));
for (i = 0; i < nut->timebase_count; i++) {
GET_V(tmp, nut->tb[i].nom);
GET_V(tmp, nut->tb[i].den);
@@ -293,7 +295,7 @@
ERROR(i != id, -ERR_BAD_STREAM_ORDER);
GET_V(tmp, sc->sh.type);
- CHECK(get_vb(tmp, &sc->sh.fourcc_len, &sc->sh.fourcc));
+ CHECK(get_vb(nut->alloc, tmp, &sc->sh.fourcc_len, &sc->sh.fourcc));
GET_V(tmp, sc->timebase_id);
sc->sh.time_base = nut->tb[sc->timebase_id];
GET_V(tmp, sc->msb_pts_shift);
@@ -301,7 +303,7 @@
GET_V(tmp, sc->sh.decode_delay);
GET_V(tmp, i); // stream_flags
sc->sh.fixed_fps = i & 1;
- CHECK(get_vb(tmp, &sc->sh.codec_specific_len, &sc->sh.codec_specific));
+ CHECK(get_vb(nut->alloc, tmp, &sc->sh.codec_specific_len, &sc->sh.codec_specific));
switch (sc->sh.type) {
case NUT_VIDEO_CLASS:
@@ -345,9 +347,9 @@
i++;
if (sl->len + 1 > sl->alloc_len) {
sl->alloc_len += PREALLOC_SIZE/4;
- sl->s = realloc(sl->s, sl->alloc_len * sizeof(syncpoint_t));
- sl->pts = realloc(sl->pts, sl->alloc_len * nut->stream_count * sizeof(uint64_t));
- sl->eor = realloc(sl->eor, sl->alloc_len * nut->stream_count * sizeof(uint64_t));
+ sl->s = nut->alloc->realloc(sl->s, sl->alloc_len * sizeof(syncpoint_t));
+ sl->pts = nut->alloc->realloc(sl->pts, sl->alloc_len * nut->stream_count * sizeof(uint64_t));
+ sl->eor = nut->alloc->realloc(sl->eor, sl->alloc_len * nut->stream_count * sizeof(uint64_t));
}
memmove(sl->s + i + 1, sl->s + i, (sl->len - i) * sizeof(syncpoint_t));
memmove(sl->pts + (i + 1) * nut->stream_count, sl->pts + i * nut->stream_count, (sl->len - i) * nut->stream_count * sizeof(uint64_t));
@@ -436,9 +438,9 @@
GET_V(tmp, x);
sl->alloc_len = sl->len = x;
- sl->s = realloc(sl->s, sl->alloc_len * sizeof(syncpoint_t));
- sl->pts = realloc(sl->pts, sl->alloc_len * sizeof(uint64_t) * nut->stream_count);
- sl->eor = realloc(sl->eor, sl->alloc_len * sizeof(uint64_t) * nut->stream_count);
+ sl->s = nut->alloc->realloc(sl->s, sl->alloc_len * sizeof(syncpoint_t));
+ sl->pts = nut->alloc->realloc(sl->pts, sl->alloc_len * sizeof(uint64_t) * nut->stream_count);
+ sl->eor = nut->alloc->realloc(sl->eor, sl->alloc_len * sizeof(uint64_t) * nut->stream_count);
for (i = 0; i < sl->len; i++) {
GET_V(tmp, sl->s[i].pos);
@@ -718,7 +720,7 @@
CHECK(get_main_header(nut));
if (!nut->sc) {
- nut->sc = malloc(sizeof(stream_context_t) * nut->stream_count);
+ nut->sc = nut->alloc->malloc(sizeof(stream_context_t) * nut->stream_count);
for (i = 0; i < nut->stream_count; i++) {
nut->sc[i].last_pts = 0;
nut->sc[i].last_dts = 0;
@@ -742,7 +744,7 @@
}
CHECK(get_stream_header(nut, i));
if (!nut->sc[i].pts_cache) {
- nut->sc[i].pts_cache = malloc(nut->sc[i].sh.decode_delay * sizeof(int64_t));
+ nut->sc[i].pts_cache = nut->alloc->malloc(nut->sc[i].sh.decode_delay * sizeof(int64_t));
for (j = 0; j < nut->sc[i].sh.decode_delay; j++)
nut->sc[i].pts_cache[j] = -1;
}
@@ -784,17 +786,17 @@
if (nut->before_seek) seek_buf(nut->i, nut->before_seek, SEEK_SET);
nut->before_seek = 0;
}
- *s = malloc(sizeof(nut_stream_header_t) * (nut->stream_count + 1));
+ *s = nut->alloc->malloc(sizeof(nut_stream_header_t) * (nut->stream_count + 1));
for (i = 0; i < nut->stream_count; i++) (*s)[i] = nut->sc[i].sh;
(*s)[i].type = -1;
err_out:
if (err && err != 2 && !nut->seek_status) {
if (nut->sc) for (i = 0; i < nut->stream_count; i++) {
- free(nut->sc[i].sh.fourcc);
- free(nut->sc[i].sh.codec_specific);
- free(nut->sc[i].pts_cache);
+ nut->alloc->free(nut->sc[i].sh.fourcc);
+ nut->alloc->free(nut->sc[i].sh.codec_specific);
+ nut->alloc->free(nut->sc[i].pts_cache);
}
- free(nut->sc);
+ nut->alloc->free(nut->sc);
nut->sc = NULL;
nut->stream_count = 0;
}
@@ -1225,19 +1227,20 @@
if (err != 2) { // unless EAGAIN
flush_buf(nut->i);
nut->before_seek = 0;
- free(nut->seek_state);
+ nut->alloc->free(nut->seek_state);
nut->seek_state = NULL;
} else {
- if (!nut->seek_state) nut->seek_state = malloc(sizeof state);
+ if (!nut->seek_state) nut->seek_state = nut->alloc->malloc(sizeof state);
memcpy(nut->seek_state, state, sizeof state);
}
return err;
}
nut_context_t * nut_demuxer_init(nut_demuxer_opts_t * dopts) {
- nut_context_t * nut = malloc(sizeof(nut_context_t));
+ nut_context_t * nut;
- nut->i = new_input_buffer(dopts->input);
+ if (dopts->alloc.malloc) nut = dopts->alloc.malloc(sizeof(nut_context_t));
+ else nut = malloc(sizeof(nut_context_t));
nut->syncpoints.len = 0;
nut->syncpoints.alloc_len = 0;
@@ -1254,6 +1257,17 @@
nut->before_seek = 0;
nut->last_syncpoint = 0;
nut->seek_state = NULL;
+
+ nut->alloc = &nut->dopts.alloc;
+
+ if (!nut->alloc->malloc) {
+ nut->alloc->malloc = malloc;
+ nut->alloc->realloc = realloc;
+ nut->alloc->free = free;
+ }
+
+ nut->i = new_input_buffer(nut->alloc, dopts->input);
+
return nut;
}
@@ -1261,19 +1275,19 @@
int i;
if (!nut) return;
for (i = 0; i < nut->stream_count; i++) {
- free(nut->sc[i].sh.fourcc);
- free(nut->sc[i].sh.codec_specific);
- free(nut->sc[i].pts_cache);
+ nut->alloc->free(nut->sc[i].sh.fourcc);
+ nut->alloc->free(nut->sc[i].sh.codec_specific);
+ nut->alloc->free(nut->sc[i].pts_cache);
}
- free(nut->syncpoints.s);
- free(nut->syncpoints.pts);
- free(nut->syncpoints.eor);
- free(nut->sc);
- free(nut->tb);
- free(nut->seek_state);
+ nut->alloc->free(nut->syncpoints.s);
+ nut->alloc->free(nut->syncpoints.pts);
+ nut->alloc->free(nut->syncpoints.eor);
+ nut->alloc->free(nut->sc);
+ nut->alloc->free(nut->tb);
+ nut->alloc->free(nut->seek_state);
free_buffer(nut->i);
- free(nut);
+ nut->alloc->free(nut);
}
const char * nut_error(int error) {
Modified: trunk/libnut/muxer.c
==============================================================================
--- trunk/libnut/muxer.c (original)
+++ trunk/libnut/muxer.c Sat Sep 23 20:34:54 2006
@@ -23,29 +23,30 @@
if (bc->is_mem) {
int tmp = bc->buf_ptr - bc->buf;
bc->write_len = tmp + amount + PREALLOC_SIZE;
- bc->buf = realloc(bc->buf, bc->write_len);
+ bc->buf = bc->alloc->realloc(bc->buf, bc->write_len);
bc->buf_ptr = bc->buf + tmp;
} else {
flush_buf(bc);
if (bc->write_len < amount) {
- free(bc->buf);
+ bc->alloc->free(bc->buf);
bc->write_len = amount + PREALLOC_SIZE;
- bc->buf_ptr = bc->buf = malloc(bc->write_len);
+ bc->buf_ptr = bc->buf = bc->alloc->malloc(bc->write_len);
}
}
}
-static output_buffer_t * new_mem_buffer() {
- output_buffer_t * bc = malloc(sizeof(output_buffer_t));
+static output_buffer_t * new_mem_buffer(nut_alloc_t * alloc) {
+ output_buffer_t * bc = alloc->malloc(sizeof(output_buffer_t));
+ bc->alloc = alloc;
bc->write_len = PREALLOC_SIZE;
bc->is_mem = 1;
bc->file_pos = 0;
- bc->buf_ptr = bc->buf = malloc(bc->write_len);
+ bc->buf_ptr = bc->buf = alloc->malloc(bc->write_len);
return bc;
}
-static output_buffer_t * new_output_buffer(nut_output_stream_t osc) {
- output_buffer_t * bc = new_mem_buffer();
+static output_buffer_t * new_output_buffer(nut_alloc_t * alloc, nut_output_stream_t osc) {
+ output_buffer_t * bc = new_mem_buffer(alloc);
bc->is_mem = 0;
bc->osc = osc;
if (!bc->osc.write) bc->osc.write = stream_write;
@@ -55,8 +56,8 @@
static void free_buffer(output_buffer_t * bc) {
if (!bc) return;
if (!bc->is_mem) flush_buf(bc);
- free(bc->buf);
- free(bc);
+ bc->alloc->free(bc->buf);
+ bc->alloc->free(bc);
}
static output_buffer_t * clear_buffer(output_buffer_t * bc) {
@@ -282,9 +283,9 @@
if (s->alloc_len <= s->len) {
s->alloc_len += PREALLOC_SIZE;
- s->s = realloc(s->s, s->alloc_len * sizeof(syncpoint_t));
- s->pts = realloc(s->pts, s->alloc_len * nut->stream_count * sizeof(uint64_t));
- s->eor = realloc(s->eor, s->alloc_len * nut->stream_count * sizeof(uint64_t));
+ s->s = nut->alloc->realloc(s->s, s->alloc_len * sizeof(syncpoint_t));
+ s->pts = nut->alloc->realloc(s->pts, s->alloc_len * nut->stream_count * sizeof(uint64_t));
+ s->eor = nut->alloc->realloc(s->eor, s->alloc_len * nut->stream_count * sizeof(uint64_t));
}
for (i = 0; i < nut->stream_count; i++) {
@@ -487,16 +488,28 @@
}
nut_context_t * nut_muxer_init(const nut_muxer_opts_t * mopts, const nut_stream_header_t s[], const nut_info_packet_t info[]) {
- nut_context_t * nut = malloc(sizeof(nut_context_t));
+ nut_context_t * nut;
int i;
// TODO check that all input is valid
- nut->o = new_output_buffer(mopts->output);
- nut->tmp_buffer = new_mem_buffer(); // general purpose buffer
- nut->tmp_buffer2 = new_mem_buffer(); // for packet_headers
- nut->max_distance = mopts->max_distance;
+ if (mopts->alloc.malloc) nut = mopts->alloc.malloc(sizeof(nut_context_t));
+ else nut = malloc(sizeof(nut_context_t));
+
nut->mopts = *mopts;
+ nut->alloc = &nut->mopts.alloc;
+
+ if (!nut->alloc->malloc) {
+ nut->alloc->malloc = malloc;
+ nut->alloc->realloc = realloc;
+ nut->alloc->free = free;
+ }
+
+ nut->o = new_output_buffer(nut->alloc, mopts->output);
+ nut->tmp_buffer = new_mem_buffer(nut->alloc); // general purpose buffer
+ nut->tmp_buffer2 = new_mem_buffer(nut->alloc); // for packet_headers
+ nut->max_distance = mopts->max_distance;
+
if (nut->max_distance > 65536) nut->max_distance = 65536;
{
@@ -542,8 +555,8 @@
for (nut->stream_count = 0; s[nut->stream_count].type >= 0; nut->stream_count++);
- nut->sc = malloc(sizeof(stream_context_t) * nut->stream_count);
- nut->tb = malloc(sizeof(nut_timebase_t) * nut->stream_count);
+ nut->sc = nut->alloc->malloc(sizeof(stream_context_t) * nut->stream_count);
+ nut->tb = nut->alloc->malloc(sizeof(nut_timebase_t) * nut->stream_count);
nut->timebase_count = 0;
for (i = 0; i < nut->stream_count; i++) {
@@ -557,20 +570,20 @@
nut->sc[i].sh = s[i];
nut->sc[i].sh.max_pts = 0;
- nut->sc[i].sh.fourcc = malloc(s[i].fourcc_len);
+ nut->sc[i].sh.fourcc = nut->alloc->malloc(s[i].fourcc_len);
memcpy(nut->sc[i].sh.fourcc, s[i].fourcc, s[i].fourcc_len);
- nut->sc[i].sh.codec_specific = malloc(s[i].codec_specific_len);
+ nut->sc[i].sh.codec_specific = nut->alloc->malloc(s[i].codec_specific_len);
memcpy(nut->sc[i].sh.codec_specific, s[i].codec_specific, s[i].codec_specific_len);
- nut->sc[i].pts_cache = malloc(nut->sc[i].sh.decode_delay * sizeof(int64_t));
+ nut->sc[i].pts_cache = nut->alloc->malloc(nut->sc[i].sh.decode_delay * sizeof(int64_t));
for (j = 0; j < nut->timebase_count; j++) if (compare_ts(nut, 1, s[i].time_base, 1, nut->tb[j]) == 0) break;
if (j == nut->timebase_count) nut->tb[nut->timebase_count++] = s[i].time_base;
nut->sc[i].timebase_id = j;
// reorder.c
- nut->sc[i].reorder_pts_cache = malloc(nut->sc[i].sh.decode_delay * sizeof(int64_t));
+ nut->sc[i].reorder_pts_cache = nut->alloc->malloc(nut->sc[i].sh.decode_delay * sizeof(int64_t));
for (j = 0; j < nut->sc[i].sh.decode_delay; j++) nut->sc[i].reorder_pts_cache[j] = nut->sc[i].pts_cache[j] = -1;
nut->sc[i].next_pts = 0;
nut->sc[i].packets = NULL;
@@ -585,16 +598,16 @@
if (info) {
for (nut->info_count = 0; info[nut->info_count].count >= 0; nut->info_count++);
- nut->info = malloc(sizeof(nut_info_packet_t) * nut->info_count);
+ nut->info = nut->alloc->malloc(sizeof(nut_info_packet_t) * nut->info_count);
for (i = 0; i < nut->info_count; i++) {
int j;
nut->info[i] = info[i];
- nut->info[i].fields = malloc(sizeof(nut_info_field_t) * info[i].count);
+ nut->info[i].fields = nut->alloc->malloc(sizeof(nut_info_field_t) * info[i].count);
for (j = 0; j < info[i].count; j++) {
nut->info[i].fields[j] = info[i].fields[j];
if (info[i].fields[j].data) {
- nut->info[i].fields[j].data = malloc(info[i].fields[j].val);
+ nut->info[i].fields[j].data = nut->alloc->malloc(info[i].fields[j].val);
memcpy(nut->info[i].fields[j].data, info[i].fields[j].data, info[i].fields[j].val);
}
}
@@ -631,31 +644,31 @@
fprintf(stderr, "packet size: %.2lf ", (double)nut->sc[i].tot_size / nut->sc[i].total_frames);
fprintf(stderr, "packet overhead: %.2lf\n", (double)nut->sc[i].overhead / nut->sc[i].total_frames);
- free(nut->sc[i].sh.fourcc);
- free(nut->sc[i].sh.codec_specific);
- free(nut->sc[i].pts_cache);
- free(nut->sc[i].reorder_pts_cache);
+ nut->alloc->free(nut->sc[i].sh.fourcc);
+ nut->alloc->free(nut->sc[i].sh.codec_specific);
+ nut->alloc->free(nut->sc[i].pts_cache);
+ nut->alloc->free(nut->sc[i].reorder_pts_cache);
}
- free(nut->sc);
- free(nut->tb);
+ nut->alloc->free(nut->sc);
+ nut->alloc->free(nut->tb);
for (i = 0; i < nut->info_count; i++) {
int j;
- for (j = 0; j < nut->info[i].count; j++) free(nut->info[i].fields[j].data);
- free(nut->info[i].fields);
+ for (j = 0; j < nut->info[i].count; j++) nut->alloc->free(nut->info[i].fields[j].data);
+ nut->alloc->free(nut->info[i].fields);
}
- free(nut->info);
+ nut->alloc->free(nut->info);
fprintf(stderr, "Syncpoints: %d size: %d\n", nut->syncpoints.len, nut->sync_overhead);
- free(nut->syncpoints.s);
- free(nut->syncpoints.pts);
- free(nut->syncpoints.eor);
+ nut->alloc->free(nut->syncpoints.s);
+ nut->alloc->free(nut->syncpoints.pts);
+ nut->alloc->free(nut->syncpoints.eor);
free_buffer(nut->tmp_buffer);
free_buffer(nut->tmp_buffer2);
fprintf(stderr, "TOTAL: %d bytes data, %d bytes overhead, %.2lf%% overhead\n", total,
(int)bctello(nut->o) - total, (double)(bctello(nut->o) - total) / total*100);
free_buffer(nut->o); // flushes file
- free(nut);
+ nut->alloc->free(nut);
}
Modified: trunk/libnut/nut.h
==============================================================================
--- trunk/libnut/nut.h (original)
+++ trunk/libnut/nut.h Sat Sep 23 20:34:54 2006
@@ -66,7 +66,14 @@
} frame_table_input_t;
typedef struct {
+ void * (*malloc)(size_t size);
+ void * (*realloc)(void *ptr, size_t size);
+ void (*free)(void *ptr);
+} nut_alloc_t;
+
+typedef struct {
nut_output_stream_t output;
+ nut_alloc_t alloc;
int write_index;
int max_distance;
frame_table_input_t * fti;
@@ -74,6 +81,7 @@
typedef struct {
nut_input_stream_t input;
+ nut_alloc_t alloc;
int read_index;
//int cache_syncpoints;
} nut_demuxer_opts_t;
Modified: trunk/libnut/priv.h
==============================================================================
--- trunk/libnut/priv.h (original)
+++ trunk/libnut/priv.h Sat Sep 23 20:34:54 2006
@@ -62,6 +62,7 @@
int read_len; // data in memory
off_t file_pos;
off_t filesize;
+ nut_alloc_t * alloc;
} input_buffer_t;
typedef struct {
@@ -71,6 +72,7 @@
uint8_t * buf_ptr;
int write_len; // memory allocated
off_t file_pos;
+ nut_alloc_t * alloc;
} output_buffer_t;
typedef struct {
@@ -136,6 +138,7 @@
struct nut_context_s {
nut_muxer_opts_t mopts;
nut_demuxer_opts_t dopts;
+ nut_alloc_t * alloc;
input_buffer_t * i;
output_buffer_t * o;
output_buffer_t * tmp_buffer;
Modified: trunk/libnut/reorder.c
==============================================================================
--- trunk/libnut/reorder.c (original)
+++ trunk/libnut/reorder.c Sat Sep 23 20:34:54 2006
@@ -12,13 +12,13 @@
assert(amount <= s->num_packets);
for (i = 0; i < amount; i++) {
nut_write_frame(nut, &s->packets[i].p, s->packets[i].buf);
- free(s->packets[i].buf); // FIXME
+ nut->alloc->free(s->packets[i].buf); // FIXME
}
if (s->next_pts != -2) s->next_pts = s->packets[i - 1].p.next_pts;
s->num_packets -= amount;
memmove(s->packets, s->packets + amount, s->num_packets * sizeof(reorder_packet_t));
- s->packets = realloc(s->packets, s->num_packets * sizeof(reorder_packet_t));
+ s->packets = nut->alloc->realloc(s->packets, s->num_packets * sizeof(reorder_packet_t));
}
static void flushcheck_frames(nut_context_t * nut) {
@@ -67,7 +67,7 @@
flushcheck_frames(nut);
for (i = 0; i < nut->stream_count; i++) {
assert(!nut->sc[i].num_packets);
- free(nut->sc[i].packets);
+ nut->alloc->free(nut->sc[i].packets);
nut->sc[i].packets = NULL;
}
nut_muxer_uninit(nut);
@@ -81,11 +81,11 @@
}
s->num_packets++;
- s->packets = realloc(s->packets, s->num_packets * sizeof(reorder_packet_t));
+ s->packets = nut->alloc->realloc(s->packets, s->num_packets * sizeof(reorder_packet_t));
s->packets[s->num_packets - 1].p = *p;
s->packets[s->num_packets - 1].dts = get_dts(s->sh.decode_delay, s->reorder_pts_cache, p->pts);
- s->packets[s->num_packets - 1].buf = malloc(p->len); // FIXME
+ s->packets[s->num_packets - 1].buf = nut->alloc->malloc(p->len); // FIXME
memcpy(s->packets[s->num_packets - 1].buf, buf, p->len);
flushcheck_frames(nut);
More information about the NUT-devel
mailing list