static void queue_put(Queue *q, Conn *conn) { mon_lock(q->mon); q->head = list_prepend(q->head, conn); if (q->tail == NULL) q->tail = q->head; mon_signal(q->mon); mon_unlock(q->mon); }
static Conn *queue_get(Queue *q) { mon_lock(q->mon); while (q->tail == NULL) mon_wait(q->mon, -1); Conn *conn = q->tail->elem; q->tail = list_prev(q->tail); if (q->tail == NULL) q->head = NULL; mon_unlock(q->mon); return conn; }
nsresult GonkVideoDecoderManager::Input(MediaRawData* aSample) { MonitorAutoLock mon(mMonitor); nsRefPtr<MediaRawData> sample; if (!aSample) { // It means EOS with empty sample. sample = new MediaRawData(); } else { sample = aSample; } mQueueSample.AppendElement(sample); status_t rv; while (mQueueSample.Length()) { nsRefPtr<MediaRawData> data = mQueueSample.ElementAt(0); { MonitorAutoUnlock mon_unlock(mMonitor); rv = mDecoder->Input(reinterpret_cast<const uint8_t*>(data->mData), data->mSize, data->mTime, 0); } if (rv == OK) { mQueueSample.RemoveElementAt(0); } else if (rv == -EAGAIN || rv == -ETIMEDOUT) { // In most cases, EAGAIN or ETIMEOUT are safe because OMX can't fill // buffer on time. return NS_OK; } else { return NS_ERROR_UNEXPECTED; } } return NS_OK; }
static void queue_wait(Queue *q, int ms) { mon_lock(q->mon); mon_wait(q->mon, ms); mon_unlock(q->mon); }