コード例 #1
0
ファイル: mp_queue.c プロジェクト: kidaa/Synthesis
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);
}
コード例 #2
0
ファイル: mp_queue.c プロジェクト: kidaa/Synthesis
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;
}
コード例 #3
0
ファイル: mp_queue.c プロジェクト: kidaa/Synthesis
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);
}
コード例 #4
0
ファイル: server-sock.c プロジェクト: dsommers/conman
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);
}