void mpQueuePush(mpQueue *in_q, void *in_dat) { x_pthread_mutex_lock(&in_q->m_mutex); // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); while ((in_q->m_writerPos+1)%in_q->m_queueSize == in_q->m_readerPos) { in_q->m_writers++; // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); // printf("mpQueuePush: Blocked %i!\n", in_q->m_writers); x_pthread_cond_wait(&in_q->m_writeCond, &in_q->m_mutex); // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); } in_q->r_queueData[in_q->m_writerPos] = in_dat; in_q->m_writerPos = (in_q->m_writerPos+1)%in_q->m_queueSize; if (in_q->m_readers > 0) { // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); in_q->m_readers--; x_pthread_cond_signal(&in_q->m_readCond); } // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); x_pthread_mutex_unlock(&in_q->m_mutex); }
void *mpQueuePop(mpQueue *in_q) { x_pthread_mutex_lock(&in_q->m_mutex); // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); while (in_q->m_readerPos == in_q->m_writerPos) { in_q->m_readers++; // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); // printf("mpQueuePop: Blocked %i!\n", in_q->m_readers); x_pthread_cond_wait(&in_q->m_readCond, &in_q->m_mutex); // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); } void *toRet = in_q->r_queueData[in_q->m_readerPos]; in_q->m_readerPos = (in_q->m_readerPos+1)%in_q->m_queueSize; if (in_q->m_writers > 0) { in_q->m_writers--; x_pthread_cond_signal(&in_q->m_writeCond); } // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); x_pthread_mutex_unlock(&in_q->m_mutex); return toRet; }
void mpQueueClear(mpQueue *in_q) { x_pthread_mutex_lock(&in_q->m_mutex); // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); //Clear the list in_q->m_readerPos = 0; in_q->m_writerPos = 0; //Notify all the pending writers while (in_q->m_writers > 0) { // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); in_q->m_writers--; x_pthread_cond_signal(&in_q->m_writeCond); } // assert(in_q->m_writers >= 0 && in_q->m_writers < 16); // assert(in_q->m_readers >= 0 && in_q->m_readers < 16); x_pthread_mutex_unlock(&in_q->m_mutex); }
static int check_busy_consoles(req_t *req) { /* Checks to see if a "writable" request affects any consoles * that are currently busy (unless the force or join option is enabled). * Returns 0 if the request is valid, or -1 on error. */ List busy; ListIterator i; obj_t *console; obj_t *writer; int gotBcast; char *tty; time_t t; char *delta; char buf[MAX_LINE]; assert(!list_is_empty(req->consoles)); if ((req->command == CONMAN_CMD_QUERY) || (req->command == CONMAN_CMD_MONITOR)) return(0); if (req->enableForce || req->enableJoin) return(0); busy = list_create(NULL); i = list_iterator_create(req->consoles); while ((console = list_next(i))) { assert(is_console_obj(console)); if (!list_is_empty(console->writers)) list_append(busy, console); } list_iterator_destroy(i); if (list_is_empty(busy)) { list_destroy(busy); return(0); } if (list_count(busy) == 1) { snprintf(buf, sizeof(buf), "Found console already in use"); } else { snprintf(buf, sizeof(buf), "Found %d consoles already in use", list_count(busy)); } send_rsp(req, CONMAN_ERR_BUSY_CONSOLES, buf); /* Note: the "busy" list contains object references, * so they DO NOT get destroyed here when removed from the list. */ while ((console = list_pop(busy))) { i = list_iterator_create(console->writers); while ((writer = list_next(i))) { assert(is_client_obj(writer)); x_pthread_mutex_lock(&writer->bufLock); t = writer->aux.client.timeLastRead; gotBcast = list_is_empty(writer->writers); tty = writer->aux.client.req->tty; x_pthread_mutex_unlock(&writer->bufLock); delta = create_time_delta_string(t, -1); snprintf(buf, sizeof(buf), "Console [%s] open %s by <%s@%s>%s%s (idle %s).\n", console->name, (gotBcast ? "B/C" : "R/W"), writer->aux.client.req->user, writer->aux.client.req->host, (tty ? " on " : ""), (tty ? tty : ""), (delta ? delta : "???")); buf[sizeof(buf) - 2] = '\n'; buf[sizeof(buf) - 1] = '\0'; if (delta) free(delta); if (write_n(req->sd, buf, strlen(buf)) < 0) { log_msg(LOG_NOTICE, "Unable to write to <%s:%d>: %s", req->fqdn, req->port, strerror(errno)); break; } } list_iterator_destroy(i); } list_destroy(busy); return(-1); }