bytes = btr_next_buffer(btrn, &data);
if (ret < 0 || bytes < wn->min_iqs) { /* eof */
assert(btr_no_parent(btrn));
- ret = -E_ALSA_EOF;
+ ret = -E_WRITE_COMMON_EOF;
if (!pad)
goto err;
/* wait until pending frames are played */
if (s->format < 0)
return;
- if (s->receiver_node && s->receiver_node->task.error != -E_TASK_UNREGISTERED)
+ if (s->receiver_node && s->receiver_node->task.error >= 0)
return;
for (i = 0; i < a->num_filters; i++)
- if (s->fns && s->fns[i].task.error != -E_TASK_UNREGISTERED)
+ if (s->fns && s->fns[i].task.error >= 0)
return;
if (a->num_writers > 0) {
for (i = 0; i < a->num_writers; i++)
- if (s->wns && s->wns[i].task.error != -E_TASK_UNREGISTERED)
+ if (s->wns && s->wns[i].task.error >= 0)
return;
} else {
- if (s->wns && s->wns[0].task.error != -E_TASK_UNREGISTERED)
+ if (s->wns && s->wns[0].task.error >= 0)
return;
}
PARA_INFO_LOG("closing slot %d\n", slot_num);
kill_btrn(st->ct->btrn, &st->ct->task, -E_AUDIOD_OFF);
goto out;
}
- if (st->ct->task.error != -E_TASK_UNREGISTERED)
+ if (st->ct->task.error >= 0)
goto out;
close_stat_pipe();
st->clock_diff_count = conf.clock_diff_count_arg;
size_t sz;
int ret;
if (st->ct->task.error < 0) {
- if (st->ct->task.error != -E_TASK_UNREGISTERED)
+ if (st->ct->task.error >= 0)
goto out;
close_stat_pipe();
goto out;
H: I've changed my mind and opened up the doors.
H: -- Beatles: Help
---
-N: kill
-D: kill an active audiod task
-U: kill task_id [task_id ...]
-H: Simulate an error condition for the given task(s)
----
N: off
D: deactivate para_audiod
U: off
return ret;
}
-int com_kill(int fd, int argc, char **argv)
-{
- int i, ret = 1;
- if (argc < 2)
- return -E_AUDIOD_SYNTAX;
- for (i = 1; i < argc; i++) {
- ret = kill_task(argv[i]);
- if (ret < 0)
- break;
- }
- if (ret > 0)
- close(fd);
- return ret;
-}
-
int com_stat(int fd, int argc, char **argv)
{
int i, ret, parser_friendly = 0;
PARA_ERROR(BAD_SAMPLE_FORMAT, "sample format not supported"), \
PARA_ERROR(BAD_CHANNEL_COUNT, "channel count not supported"), \
PARA_ERROR(BAD_SAMPLERATE, "sample rate not supported"), \
- PARA_ERROR(OSS_EOF, "oss: end of file"), \
#define COMPRESS_FILTER_ERRORS \
#define SCHED_ERRORS \
- PARA_ERROR(TASK_KILLED, "task killed"), \
- PARA_ERROR(TASK_UNREGISTERED, "task has been unscheduled"), \
- PARA_ERROR(NO_SUCH_TASK, "task not found"), \
PARA_ERROR(NOT_INITIALIZED, "scheduler not yet initialized"), \
+ PARA_ERROR(SCHED_SHUTDOWN, "scheduler was shut down"), \
#define NET_ERRORS \
PARA_ERROR(SET_RATE, "snd_pcm_hw_params_set_rate_near failed"), \
PARA_ERROR(START_THRESHOLD, "snd_pcm_sw_params_set_start_threshold() failed"), \
PARA_ERROR(STOP_THRESHOLD, "snd_pcm_sw_params_set_stop_threshold() failed"), \
- PARA_ERROR(ALSA_EOF, "alsa: end of file"), \
-
#define WRITE_COMMON_ERRORS \
PARA_ERROR(WRITE_COMMON_SYNTAX, "syntax error in write option"), \
+ PARA_ERROR(WRITE_COMMON_EOF, "end of file"), \
#define AACDEC_FILTER_ERRORS \
struct grab_client *gc, *tmp;
list_for_each_entry_safe(gc, tmp, &inactive_grab_client_list, node) {
- if (gc->task.error == -E_TASK_UNREGISTERED) {
+ if (gc->task.error < 0) {
list_del(&gc->node);
free(gc);
continue;
bytes = btr_next_buffer(btrn, &data);
frames = bytes / powd->bytes_per_frame;
if (!frames) { /* eof and less than a single frame available */
- ret = -E_OSS_EOF;
+ ret = -E_WRITE_COMMON_EOF;
goto out;
}
ret = 0;
{
if (!initialized)
return;
+ assert(t->error < 0);
PARA_INFO_LOG("unregistering %s (%s)\n", t->status,
- t->error <0? para_strerror(-t->error) : "shutdown");
+ para_strerror(-t->error));
if (t->pre_select)
list_del(&t->pre_select_node);
if (t->post_select)
list_del(&t->post_select_node);
- t->error = -E_TASK_UNREGISTERED;
}
-
static void sched_preselect(struct sched *s)
{
struct task *t, *tmp;
list_for_each_entry_safe(t, tmp, &pre_select_list, pre_select_node) {
- if (t->error >= 0 && t->pre_select)
+ if (t->pre_select)
t->pre_select(s, t);
// PARA_INFO_LOG("%s \n", t->status);
if (t->error >= 0)
if (!initialized)
return;
- list_for_each_entry_safe(t, tmp, &pre_select_list, pre_select_node)
+ list_for_each_entry_safe(t, tmp, &pre_select_list, pre_select_node) {
+ t->error = -E_SCHED_SHUTDOWN;
unregister_task(t);
- list_for_each_entry_safe(t, tmp, &post_select_list, post_select_node)
+ }
+ list_for_each_entry_safe(t, tmp, &post_select_list, post_select_node) {
+ t->error = -E_SCHED_SHUTDOWN;
unregister_task(t);
+ }
initialized = 0;
}
*
* \return The task list.
*
- * Each entry of the list contains an identifier which is simply a hex number
- * that may be used in \a kill_task() to terminate the task.
+ * Each entry of the list contains an identifier which is simply a hex number.
* The result is dynamically allocated and must be freed by the caller.
*/
char *get_task_list(void)
return msg;
}
-/**
- * Simulate an error for the given task.
- *
- * \param id The task identifier.
- *
- * Find the task identified by \a id, set the tasks' error value to
- * \p -E_TASK_KILLED and unregister the task.
- *
- * \return Positive on success, negative on errors (e.g. if \a id does not
- * correspond to a registered task).
- */
-int kill_task(char *id)
-{
- struct task *t, *tmp;
- char buf[20];
-
- if (!initialized)
- return -E_NOT_INITIALIZED;
- list_for_each_entry_safe(t, tmp, &pre_select_list, pre_select_node) {
- sprintf(buf, "%p", t);
- if (strcmp(id, buf))
- continue;
- t->error = -E_TASK_KILLED;
- return 1;
- }
- list_for_each_entry_safe(t, tmp, &post_select_list, post_select_node) {
- sprintf(buf, "%p", t);
- if (strcmp(id, buf))
- continue;
- t->error = -E_TASK_KILLED;
- return 1;
- }
- return -E_NO_SUCH_TASK;
-}
-
/**
* Set the select timeout to the minimal possible value.
*
void register_task(struct task *t);
int schedule(struct sched *s);
char *get_task_list(void);
-int kill_task(char *id);
void sched_shutdown(void);
void sched_min_delay(struct sched *s);
void sched_request_timeout(struct timeval *to, struct sched *s);
s->default_timeout.tv_sec = 10;
s->default_timeout.tv_usec = 50000;
ret = schedule(s);
+ if (ret >= 0) {
+ int j;
+ for (j = 0; j < i; j++) {
+ struct task *t = &wns[j].task;
+ assert(t->error < 0);
+ if (t->error != -E_WRITE_COMMON_EOF
+ && t->error != -E_BTR_EOF) {
+ PARA_ERROR_LOG("%s: %s\n", t->status,
+ para_strerror(-t->error));
+ if (ret >= 0)
+ ret = t->error;
+ }
+ }
+ }
out:
for (i--; i >= 0; i--) {
struct writer_node *wn = wns + i;