[Prev][Next][Index][Thread]

# Re: suspend() and read()

- Date: Fri, 10 May 1996 09:28:42 PDT
- From:
- In-Reply-to: "Matthew Sanderson's message of \"Thu, 09 May 1996 14:25:21 PDT\" <v01530500adb810620045@DialupEudora> Don

    	"
    To: m.sanderson@student.anu.edu.au (Matthew Sanderson)
    cc: moo-cows.PARC@Xerox.com
    Message-ID: <96May10.092843pdt.19565@silk.parc.xerox.com>

    Matthew Sanderson writes:
    > >From 'help read()':
    >
    > `Read()' may only be called by a wizard, and,
    > unless <player> is given explicitly, only in a command task that has never
    > been suspended by a call to `suspend()'.  Otherwise, `E_PERM' is
    > returned.
    > ...
    > What'm I missing here? :)

    You're missing that the `help' text is out of date; here's the relevant section
    from the current programmer's manual:
    -------------------------------------------------------------------------------
    Function: str read ([obj conn [, non-blocking]])

          Reads and returns a line of input from the connection conn (or, if not
          provided, from the player that typed the command that initiated the
          current task). If non-blocking is false or not provided, this function
          suspends the current task, resuming it when there is input available to
          be read. If non-blocking is provided and true, this function never
          suspends the calling task; if there is no input currently available for
          input, read() simply returns 0 immediately.

          If player is provided, then the programmer must either be a wizard or the
          owner of player; if player is not provided, then read() may only be
          called by a wizard and only in the task that was last spawned by a
          command from the connection in question. Otherwise, E_PERM is raised. If
          the given player is not currently connected and has no pending lines of
          input, or if the connection is closed while a task is waiting for input
          but before any lines of input are received, then read() raises E_INVARG.

          The restriction on the use of read() without any arguments preserves the
          following simple invariant: if input is being read from a player, it is
          for the task started by the last command that player typed. This
          invariant adds responsibility to the programmer, however. If your program
          calls another verb before doing a read(), then either that verb must not
          suspend or else you must arrange that no commands will be read from the
          connection in the meantime. The most straightforward way to do this is to
          call

              set_connection_option(player, "hold-input", 1)

          before any task suspension could happen, then make all of your calls to
          read() and other code that might suspend, and finally call

              set_connection_option(player, "hold-input", 0)

          to allow commands once again to be read and interpreted normally.
    -------------------------------------------------------------------------------

References:

- suspend() and read()

- From: m.sanderson@student.anu.edu.au (Matthew Sanderson)

- Prev: Re: suspend() and read()
- Next: Ugg
- Index: MOO-cows
- Thread: MOO-cows

Home | Subject Index | Thread Index