Beispiel #1
0
int64 io_canwrite() {
  io_entry* e;
  if (first_writeable==-1)
#ifdef HAVE_SIGIO
  {
    if (alt_firstwrite>=0 && (e=array_get(&io_fds,sizeof(io_entry),alt_firstwrite)) && e->canwrite) {
      debug_printf(("io_canwrite: normal write queue is empty, swapping in alt write queue (starting with %ld)\n",alt_firstwrite));
      first_writeable=alt_firstwrite;
      alt_firstwrite=-1;
    } else
      return -1;
  }
#else
    return -1;
#endif
  for (;;) {
    int64 r;
    e=array_get(&io_fds,sizeof(io_entry),first_writeable);
    if (!e) break;
    r=first_writeable;
    first_writeable=e->next_write;
    e->next_write=-1;
    debug_printf(("io_canwrite: dequeue %lld from normal write queue (next is %ld)\n",r,first_writeable));
    if (e->wantwrite &&
#ifdef __MINGW32__
                        (e->canwrite || e->sendfilequeued==1)
#else
                        e->canwrite
#endif
      				   ) {
#ifdef HAVE_SIGIO
      e->next_write=alt_firstwrite;
      alt_firstwrite=r;
      debug_printf(("io_canwrite: enqueue %ld in alt write queue (next is %ld)\n",alt_firstwrite,e->next_write));
      if (io_waitmode!=_SIGIO)
#endif
	e->canwrite=0;
      if (!e->kernelwantwrite)
	io_wantwrite_really(r,e);
      return r;
    }
  }
  return -1;
}
Beispiel #2
0
void
io_wantwrite(fd_t d) {
  io_entry* e = iarray_get(io_getfds(), d);
  if(!e)
    return;
  if(e->wantwrite && e->kernelwantwrite)
    return;
  if(e->canwrite) {
    e->next_write = first_writeable;
    first_writeable = d;
    e->wantwrite = 1;
    return;
  }
  /* the harder case: do as before */
  if(!e->kernelwantwrite)
    io_wantwrite_really(d, e);
  else
    e->wantwrite = 1;
}