Java程序辅导

C C++ Java Python Processing编程在线培训 程序编写 软件开发 视频讲解

客服在线QQ:2653320439 微信:ittutor Email:itutor@qq.com
wx: cjtutor
QQ: 2653320439
Linux-Kernel Archive: fsync() on unix domain sockets? fsync() on unix domain sockets? From: Dan Kegel (dank@kegel.com) Date: Tue Apr 08 2003 - 17:31:19 EST Next message: Andries.Brouwer@cwi.nl: "ioctls" Previous message: Martin Schlemmer: "Re: [PATCH-2.5] Fix w83781d sensor to use Milli-Volt for in_* in sysfs" Next in thread: Richard B. Johnson: "Re: fsync() on unix domain sockets?" Reply: Richard B. Johnson: "Re: fsync() on unix domain sockets?" Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] Let's say someone had written a win32 emulator that ran in userspace, and was using unix domain sockets to emulate win32 named pipes. (Yes, this is how Wine does it at the moment, but it's a poor fit, and they're thinking of switching to emulating them 100% in userspace so they can get the semantics right.) It turns out that in this situation, it would be handy for fsync() to work on unix domain sockets. This would require a bit of plumbing to let sockets expose an fsync() method, together with an fsync() method for unix domain sockets. After thinking about this a bit, I couldn't resist writing that method for stream sockets. Being a kernel newbie, I am unsure if I got the locking and reference counting right. Anyone care to peek at it and see if there are glaring problems? (If not, I guess I could go do the needed plumbing and see how it works in practice.) Thanks, Dan /* to be added to net/unix/af_unix.c */ static long unix_stream_fsync(unix_socket * sk) {      int err;      long timeo;      unix_socket *other;      DECLARE_WAITQUEUE(wait, current);      timeo = sock_sndtimeo(sk, 0);      err = -ENOTCONN;      other = unix_peer_get(sk);      if (!other)          goto out;      unix_state_rlock(sk);      add_wait_queue(sk->sleep, &wait);      unix_state_runlock(sk);      for (;;) {          int breakme;          unix_state_rlock(other);          breakme = !skb_queue_len(&other->receive_queue) ||              other->err ||              (other->shutdown & RCV_SHUTDOWN) ||              !timeo;          unix_state_runlock(other);          if (breakme)              break;          if (signal_pending(current))              goto out_sig;          set_current_state(TASK_INTERRUPTIBLE);          timeo = schedule_timeout(timeo);      }      err = 0; out_run:      __set_current_state(TASK_RUNNING);      unix_state_rlock(sk);      remove_wait_queue(sk->sleep, &wait);      unix_state_runlock(sk);      sock_put(other); out:      return err; out_sig:      err = sock_intr_errno(timeo);      goto out_run; } -- Dan Kegel http://www.kegel.com http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=78045 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ Next message: Andries.Brouwer@cwi.nl: "ioctls" Previous message: Martin Schlemmer: "Re: [PATCH-2.5] Fix w83781d sensor to use Milli-Volt for in_* in sysfs" Next in thread: Richard B. Johnson: "Re: fsync() on unix domain sockets?" Reply: Richard B. Johnson: "Re: fsync() on unix domain sockets?" Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] This archive was generated by hypermail 2b29 : Tue Apr 15 2003 - 22:00:16 EST