Lines Matching refs:pipe

46 /* Set to 1 to enable the 'zero' pipe type, useful for debugging */
49 /* Set to 1 to enable the 'pingpong' pipe type, useful for debugging */
52 /* Set to 1 to enable the 'throttle' pipe type, useful for debugging */
85 APANIC("Too many goldfish pipe services (%d)", count);
132 static void* pipeConnector_new(Pipe* pipe);
137 Pipe* pipe;
138 ANEW0(pipe);
139 pipe->channel = channel;
140 pipe->device = dev;
141 pipe->opaque = pipeConnector_new(pipe);
142 return pipe;
176 pipe_list_findp_waked( Pipe** list, Pipe* pipe )
181 if (node == NULL || node == pipe) {
191 pipe_list_remove_waked( Pipe** list, Pipe* pipe )
193 Pipe** lookup = pipe_list_findp_waked(list, pipe);
210 * client is going to write the name of the pipe service it wants to
214 Pipe* pipe;
222 pipeConnector_new(Pipe* pipe)
227 pcon->pipe = pipe;
228 pipe->funcs = &pipeConnector_funcs;
247 pcon->pipe->channel,
277 * pipe:<name>
278 * pipe:<name>:<arguments>
285 if (memcmp(pcon->buffer, "pipe:", 5) != 0) {
287 D("%s: Unknown pipe connection: '%s'", __FUNCTION__, pcon->buffer);
298 Pipe* pipe = pcon->pipe;
305 void* peer = svc->funcs.init(pipe, svc->opaque, pipeArgs);
312 pipe->opaque = peer;
313 pipe->funcs = &svc->funcs;
354 /* A simple pipe service that mimics /dev/zero, you can write anything to
457 pingPongPipe_init0( PingPongPipe* pipe, void* hwpipe, void* svcOpaque )
459 pipe->hwpipe = hwpipe;
460 pipe->size = PINGPONG_SIZE;
461 pipe->buffer = malloc(pipe->size);
462 pipe->pos = 0;
463 pipe->count = 0;
491 PingPongPipe* pipe = opaque;
502 while (count > pipe->size - pipe->count) {
503 size_t newsize = pipe->size*2;
504 uint8_t* newbuff = realloc(pipe->buffer, newsize);
505 int wpos = pipe->pos + pipe->count;
509 if (wpos > pipe->size) {
510 wpos -= pipe->size;
511 memcpy(newbuff + pipe->size, newbuff, wpos);
513 pipe->buffer = newbuff;
514 pipe->size = newsize;
519 int avail = pipe->size - pipe->count;
529 int wpos = pipe->pos + pipe->count;
530 if (wpos >= pipe->size) {
531 wpos -= pipe->size;
533 if (wpos + avail <= pipe->size) {
534 memcpy(pipe->buffer + wpos, buff->data, avail);
536 int avail2 = pipe->size - wpos;
537 memcpy(pipe->buffer + wpos, buff->data, avail2);
538 memcpy(pipe->buffer, buff->data + avail2, avail - avail2);
540 pipe->count += avail;
545 if (pipe->count > 0 && (pipe->flags & PIPE_WAKE_READ)) {
546 goldfish_pipe_wake(pipe->hwpipe, PIPE_WAKE_READ);
555 PingPongPipe* pipe = opaque;
559 int avail = pipe->count;
569 int rpos = pipe->pos;
571 if (rpos + avail <= pipe->size) {
572 memcpy(buffers[0].data, pipe->buffer + rpos, avail);
574 int avail2 = pipe->size - rpos;
575 memcpy(buffers[0].data, pipe->buffer + rpos, avail2);
576 memcpy(buffers[0].data + avail2, pipe->buffer, avail - avail2);
578 pipe->count -= avail;
579 pipe->pos += avail;
580 if (pipe->pos >= pipe->size) {
581 pipe->pos -= pipe->size;
589 if (pipe->count < PINGPONG_SIZE && (pipe->flags & PIPE_WAKE_WRITE)) {
590 goldfish_pipe_wake(pipe->hwpipe, PIPE_WAKE_WRITE);
599 PingPongPipe* pipe = opaque;
602 if (pipe->count < pipe->size)
605 if (pipe->count > 0)
614 PingPongPipe* pipe = opaque;
615 pipe->flags |= (unsigned)flags;
657 ThrottlePipe* pipe;
659 ANEW0(pipe);
660 pingPongPipe_init0(&pipe->pingpong, hwpipe, svcOpaque);
661 pipe->timer = qemu_new_timer_ns(vm_clock, throttlePipe_timerFunc, pipe);
663 pipe->sendRate = 1e9 / (500*1024*8);
664 pipe->recvRate = pipe->sendRate;
665 return pipe;
671 ThrottlePipe* pipe = opaque;
673 qemu_del_timer(pipe->timer);
674 qemu_free_timer(pipe->timer);
675 pingPongPipe_close(&pipe->pingpong);
679 throttlePipe_rearm( ThrottlePipe* pipe )
683 DD("%s: sendExpiration=%lld recvExpiration=%lld\n", __FUNCTION__, pipe->sendExpiration, pipe->recvExpiration);
685 if (pipe->sendExpiration) {
686 if (minExpiration == 0 || pipe->sendExpiration < minExpiration)
687 minExpiration = pipe->sendExpiration;
690 if (pipe->recvExpiration) {
691 if (minExpiration == 0 || pipe->recvExpiration < minExpiration)
692 minExpiration = pipe->recvExpiration;
697 qemu_mod_timer(pipe->timer, minExpiration);
704 ThrottlePipe* pipe = opaque;
708 __FUNCTION__, now, pipe->sendExpiration, pipe->recvExpiration);
713 if (pipe->sendExpiration && now > pipe->sendExpiration) {
715 pipe->sendExpiration = 0;
717 if (pipe->recvExpiration && now > pipe->recvExpiration) {
719 pipe->recvExpiration = 0;
721 flags &= pipe->pingpong.flags;
724 goldfish_pipe_wake(pipe->pingpong.hwpipe, flags);
727 throttlePipe_rearm(pipe);
733 ThrottlePipe* pipe = opaque;
736 if (pipe->sendExpiration > 0) {
740 ret = pingPongPipe_sendBuffers(&pipe->pingpong, buffers, numBuffers);
743 pipe->sendExpiration = qemu_get_clock_ns(vm_clock) + ret*pipe->sendRate;
744 throttlePipe_rearm(pipe);
752 ThrottlePipe* pipe = opaque;
755 if (pipe->recvExpiration > 0) {
759 ret = pingPongPipe_recvBuffers(&pipe->pingpong, buffers, numBuffers);
761 pipe->recvExpiration = qemu_get_clock_ns(vm_clock) + ret*pipe->recvRate;
762 throttlePipe_rearm(pipe);
770 ThrottlePipe* pipe = opaque;
771 unsigned ret = pingPongPipe_poll(&pipe->pingpong);
773 if (pipe->sendExpiration > 0)
776 if (pipe->recvExpiration > 0)
785 ThrottlePipe* pipe = opaque;
786 pingPongPipe_wakeOn(&pipe->pingpong, flags);
829 Pipe* pipe = *lookup;
832 /* Check that we're referring a known pipe channel */
833 if (command != PIPE_CMD_OPEN && pipe == NULL) {
838 /* If the pipe is closed by the host, return an error */
839 if (pipe != NULL && pipe->closed && command != PIPE_CMD_CLOSE) {
847 if (pipe != NULL) {
851 pipe = pipe_new(dev->channel, dev);
852 pipe->next = dev->pipes;
853 dev->pipes = pipe;
860 *lookup = pipe->next;
861 pipe->next = NULL;
862 pipe_list_remove_waked(&dev->signaled_pipes, pipe);
864 if (pipe->funcs->close) {
865 pipe->funcs->close(pipe->opaque);
868 AFREE(pipe);
872 dev->status = pipe->funcs->poll(pipe->opaque);
890 dev->status = pipe->funcs->recvBuffers(pipe->opaque, &buffer, 1);
910 dev->status = pipe->funcs->sendBuffers(pipe->opaque, &buffer, 1);
918 if ((pipe->wanted & PIPE_WAKE_READ) == 0) {
919 pipe->wanted |= PIPE_WAKE_READ;
920 pipe->funcs->wakeOn(pipe->opaque, pipe->wanted);
927 if ((pipe->wanted & PIPE_WAKE_WRITE) == 0) {
928 pipe->wanted |= PIPE_WAKE_WRITE;
929 pipe->funcs->wakeOn(pipe->opaque, pipe->wanted);
983 Pipe* pipe = dev->signaled_pipes;
985 pipe->channel, pipe->wanted);
986 dev->wakes = pipe->wanted;
987 pipe->wanted = 0;
988 dev->signaled_pipes = pipe->next_waked;
989 pipe->next_waked = NULL;
994 return pipe->channel;
1051 Pipe* pipe = hwpipe;
1053 PipeDevice* dev = pipe->device;
1055 DD("%s: channel=0x%x flags=%d", __FUNCTION__, pipe->channel, flags);
1058 lookup = pipe_list_findp_waked(&dev->signaled_pipes, pipe);
1060 pipe->next_waked = dev->signaled_pipes;
1061 dev->signaled_pipes = pipe;
1063 pipe->wanted |= (unsigned)flags;
1073 Pipe* pipe = hwpipe;
1075 D("%s: channel=0x%x (closed=%d)", __FUNCTION__, pipe->channel, pipe->closed);
1077 if (!pipe->closed) {
1078 pipe->closed = 1;