예제 #1
0
파일: fs.c 프로젝트: shantanusharma/node
static ssize_t uv__fs_write(uv_fs_t* req) {
#if defined(__linux__)
  static int no_pwritev;
#endif
  ssize_t r;

  /* Serialize writes on OS X, concurrent write() and pwrite() calls result in
   * data loss. We can't use a per-file descriptor lock, the descriptor may be
   * a dup().
   */
#if defined(__APPLE__)
  static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

  if (pthread_mutex_lock(&lock))
    abort();
#endif

  if (req->off < 0) {
    if (req->nbufs == 1)
      r = write(req->file, req->bufs[0].base, req->bufs[0].len);
    else
      r = writev(req->file, (struct iovec*) req->bufs, req->nbufs);
  } else {
    if (req->nbufs == 1) {
      r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
      goto done;
    }
#if HAVE_PREADV
    r = pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
#else
# if defined(__linux__)
    if (no_pwritev) retry:
# endif
    {
      r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
    }
# if defined(__linux__)
    else {
      r = uv__pwritev(req->file,
                      (struct iovec*) req->bufs,
                      req->nbufs,
                      req->off);
      if (r == -1 && errno == ENOSYS) {
        no_pwritev = 1;
        goto retry;
      }
    }
# endif
#endif
  }

done:
#if defined(__APPLE__)
  if (pthread_mutex_unlock(&lock))
    abort();
#endif

  return r;
}
예제 #2
0
파일: fs.c 프로젝트: 90lantran/node
static ssize_t uv__fs_write(uv_fs_t* req) {
    ssize_t r;

    /* Serialize writes on OS X, concurrent write() and pwrite() calls result in
     * data loss. We can't use a per-file descriptor lock, the descriptor may be
     * a dup().
     */
#if defined(__APPLE__)
    static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    pthread_mutex_lock(&lock);
#endif

    if (req->off < 0) {
        if (req->nbufs == 1)
            r = write(req->file, req->bufs[0].base, req->bufs[0].len);
        else
            r = writev(req->file, (struct iovec*) req->bufs, req->nbufs);
    } else {
        if (req->nbufs == 1) {
            r = pwrite(req->file, req->bufs[0].base, req->bufs[0].len, req->off);
            goto done;
        }
#if HAVE_PREADV
        r = pwritev(req->file, (struct iovec*) req->bufs, req->nbufs, req->off);
#else
# if defined(__linux__)
        static int no_pwritev;
        if (no_pwritev)
# endif
        {
            off_t written;
            size_t index;

# if defined(__linux__)
retry:
# endif
            written = 0;
            index = 0;
            r = 0;
            do {
                if (req->bufs[index].len > 0) {
                    r = pwrite(req->file,
                               req->bufs[index].base,
                               req->bufs[index].len,
                               req->off + written);
                    if (r > 0)
                        written += r;
                }
                index++;
            } while (index < req->nbufs && r >= 0);
            if (written > 0)
                r = written;
        }
# if defined(__linux__)
        else {
            r = uv__pwritev(req->file,
                            (struct iovec*) req->bufs,
                            req->nbufs,
                            req->off);
            if (r == -1 && errno == ENOSYS) {
                no_pwritev = 1;
                goto retry;
            }
        }
# endif
#endif
    }

done:
#if defined(__APPLE__)
    pthread_mutex_unlock(&lock);
#endif

    if (req->bufs != req->bufsml)
        free(req->bufs);

    return r;
}