static void on_name_vanished (GDBusConnection *connection, const char *name, gpointer user_data) { queue_finish (GDM_DISPLAY (user_data)); }
static void slave_died (GdmSlaveProxy *proxy, int signum, GdmDisplay *display) { g_debug ("GdmDisplay: Slave died: %d", signum); queue_finish (display); }
static void slave_exited (GdmSlaveProxy *proxy, int code, GdmDisplay *display) { g_debug ("GdmDisplay: Slave exited: %d", code); queue_finish (display); }
void queue_destroy(t_iemnet_queue* q) { t_iemnet_chunk*c=NULL; if(NULL==q) return; DEBUG("queue destroy %x", q); queue_finish(q); /* remove all the chunks from the queue */ while(NULL!=(c=queue_pop_noblock(q))) { iemnet__chunk_destroy(c); } q->head=NULL; q->tail=NULL; pthread_mutex_destroy(&q->mtx); pthread_cond_destroy(&q->cond); free(q); q=NULL; DEBUG("queue destroyed %x", q); }
void playlist_finish(struct playlist *playlist) { queue_finish(&playlist->queue); }
struct line * queue_get(int fid) { struct line *cur; char *s, *synch; if (log_mutex) fprintf(stderr, "Getting for data for fid %d\n", fid); if (log_mutex) fprintf(stderr, "Locking queue mutex (%d)\n", fid); pthread_mutex_lock(&queue_mutex); /* First, check for aborted sentences. */ if (log_mutex) fprintf(stderr, " Checking queue for aborted jobs (fid %d)\n", fid); for (cur = head; cur != NULL; cur = cur->next) { if (cur->status == STATUS_ABORTED) { cur->status = STATUS_RUNNING; if (log_mutex) fprintf(stderr, "Unlocking queue mutex (%d)\n", fid); pthread_mutex_unlock(&queue_mutex); return cur; } } if (log_mutex) fprintf(stderr, "Unlocking queue mutex (%d)\n", fid); pthread_mutex_unlock(&queue_mutex); /* Otherwise, read a new one. */ if (log_mutex) fprintf(stderr, "Locking input mutex (%d)\n", fid); if (log_mutex) fprintf(stderr, " Reading input for new data (fid %d)\n", fid); pthread_mutex_lock(&input_mutex); s = read_line(0,0); while (s) { if (log_mutex) fprintf(stderr, "Locking queue mutex (%d)\n", fid); pthread_mutex_lock(&queue_mutex); if (log_mutex) fprintf(stderr, "Unlocking input mutex (%d)\n", fid); pthread_mutex_unlock(&input_mutex); cur = malloc(sizeof (struct line)); cur->id = n_sent; cur->s = s; cur->next = NULL; *ptail = cur; ptail = &cur->next; n_sent++; if (strcmp(s,"===SYNCH===\n")==0){ fprintf(stderr, "Received ===SYNCH=== signal (fid %d)\n", fid); // Note: queue_finish calls free(cur->s). // Therefore we need to create a new string here. synch = malloc((strlen("===SYNCH===\n")+2) * sizeof (char)); synch = strcpy(synch, s); if (log_mutex) fprintf(stderr, "Unlocking queue mutex (%d)\n", fid); pthread_mutex_unlock(&queue_mutex); queue_finish(cur, synch, fid); /* handles its own lock */ if (log_mutex) fprintf(stderr, "Locking input mutex (%d)\n", fid); if (log_mutex) fprintf(stderr, " Reading input for new data (fid %d)\n", fid); pthread_mutex_lock(&input_mutex); s = read_line(0,0); } else { if (log_mutex) fprintf(stderr, " Received new data %d (fid %d)\n", cur->id, fid); cur->status = STATUS_RUNNING; if (log_mutex) fprintf(stderr, "Unlocking queue mutex (%d)\n", fid); pthread_mutex_unlock(&queue_mutex); return cur; } } if (log_mutex) fprintf(stderr, "Unlocking input mutex (%d)\n", fid); pthread_mutex_unlock(&input_mutex); /* Only way to reach this point: no more output */ if (log_mutex) fprintf(stderr, "Locking queue mutex (%d)\n", fid); pthread_mutex_lock(&queue_mutex); if (head == NULL) { fprintf(stderr, "Reached end of file. Exiting.\n"); done(0); } else ptail = NULL; /* This serves as a signal that there is no more input */ if (log_mutex) fprintf(stderr, "Unlocking queue mutex (%d)\n", fid); pthread_mutex_unlock(&queue_mutex); return NULL; }
void * new_client(void *arg) { struct clientinfo *client = (struct clientinfo *)arg; struct line *cur; int result; char *s; char errorbuf[100]; pthread_mutex_lock(&clients_mutex); n_clients++; pthread_mutex_unlock(&clients_mutex); fprintf(stderr, "Client connected (%d connected)\n", n_clients); for (;;) { cur = queue_get(client->s); if (cur) { /* fprintf(stderr, "Sending to client: %s", cur->s); */ if (!quiet) fprintf(stderr, "Sending data %d to client (fid %d)\n", cur->id, client->s); result = write(client->s, cur->s, strlen(cur->s)); if (result < strlen(cur->s)){ perror("write()"); sprintf(errorbuf, "Error code: %d\n", errno); fprintf(stderr, "%s", errorbuf); pthread_mutex_lock(&clients_mutex); n_clients--; pthread_mutex_unlock(&clients_mutex); fprintf(stderr, "Client died (%d connected)\n", n_clients); queue_abort(cur, client->s); close(client->s); free(client); pthread_exit(NULL); } } else { close(client->s); pthread_mutex_lock(&clients_mutex); n_clients--; pthread_mutex_unlock(&clients_mutex); fprintf(stderr, "Client dismissed (%d connected)\n", n_clients); pthread_exit(NULL); } s = read_line(client->s,expect_multiline_output); if (s) { /* fprintf(stderr, "Client (fid %d) returned: %s", client->s, s); */ if (!quiet) fprintf(stderr, "Client (fid %d) returned data %d\n", client->s, cur->id); // queue_print(); queue_finish(cur, s, client->s); } else { pthread_mutex_lock(&clients_mutex); n_clients--; pthread_mutex_unlock(&clients_mutex); fprintf(stderr, "Client died (%d connected)\n", n_clients); queue_abort(cur, client->s); close(client->s); free(client); pthread_exit(NULL); } } return 0; }