Re: New release 0.0.54

Roger Tucker <[email protected]> Fri, 10 Sep 2004 17:16:47 -0600
Newsgroups gmane.os.freevms.general
Message-ID <[email protected]>
You have to learn to walk before you can run...
So I decided to start slow and learn, by just looking at insque().
I don't think I understand what mycli() was trying to do.

So what is wrong with this:

#include <queue.h>						/* My public
header file */
#include <asm/system.h>						/* Needed
for __save_flags, etc. */

/* Hmm C is too strongly typed at times */
struct queue_t							/* Needed to
avoid type casts */
    {
    struct queue_t *fp;
    struct queue_t *bp;
    };

/*
** insque() - insert entry in queue.
**
**	The entry specified by entry is inserted into the queue following
the entry specified by predecessor.
**	The insertion is a non-interruptible operation.
**	This routine is similar to the VAX INSQUE instruction or the alpha
**	__PAL_INSQUEL, __PAL_INSQUEQ routines except that:
**	    No validation or probing of of arguments occurs.
**	    The routine can leave the queue in an inconsistent state if a
memory management exception occurs.
**	    This routine doesn't return the values:
**	    	0 if the entry was not the only entry in the queue
**		1 if the entry was the only entry in the queue
**	    VMS required all queues to be aligned on quadword boundaries.
**	Theses restrictions seem acceptable since this is a very low level
routine used in kernel mode.
**	Other routines should be written to remove the above restrictions if
needed.
**
*/

void insque(void *entryp, void *predp) {
  struct queue_t *entry = entryp;
  struct queue_t *pred = predp;
  unsigned long flags;
  __save_flags(flags);			/* Save the interrupt state */
  __cli();					/* Turn off interrupts */
  entry->fp = pred->fp;
  entry->bp = pred;
  pred->fp->bp = entry;
  pred->fp = entry;
  __restore_flags(flags);		/* Turn on interrupts if I turned
them off */
}

Roger