ftp.nice.ch/pub/next/developer/languages/c/gcc.2.7.2.2.N.b.tar.gz#/lib/gcc-lib/m68k-next-nextstep3/2.7.2.2.f.2/include/bsd/sys/disksort.h

This is disksort.h in view mode; [Download] [Up]

/* 
 * Copyright (c) 1990 NeXT, Inc.
 *
 * HISTORY
 * 10-Jul-90  Gregg Kellogg (gk) at NeXT
 *	Created
 */ 

/*
 * Structures necessary for supporting generic disksorting.
 */
#ifndef	_SYS_DISKSORT_
#define	_SYS_DISKSORT_

#import <sys/types.h>
#import <sys/buf.h>
#import <kernserv/queue.h>
#import <kernserv/lock.h>

/*
 * Each device must define one of these disksort structures to control
 * the device that it's sorting.  Access to the sorted queue is achieved
 * exclisively through the routines disksort_enter, disksort_first, and
 * disksort_remove.
 */

typedef struct ds_bucket ds_bucket_t;

struct ds_bucket {
	struct buf	*head;
	struct buf	*tail;
	int		sort_key;		/* key bucket's sorted on*/
	int		pri;
	queue_chain_t	link;
};

typedef struct ds_queue ds_queue_t;

struct ds_queue {
	queue_chain_t		ds_link;	/* links active volume queues.*/
	void			*ds_data;	/* pointer to allocated data.*/
	u_int			indirect:1,	/* use the indirect version?*/
				active:2,	/* queue active*/
						/* (driver maintained)*/
				busy:1;		/* first entry in use*/
	queue_head_t		activeq;	/* active buckets*/
	int			navail;		/* number of alloc'able buckets*/
	int			last_loc;	/* head position*/
	int			last_pri;	/* last priority*/
	simple_lock_data_t	lock;
};

/*
 * Structure defining routines to use for disksorting (loadable support).
 */
typedef struct ds_call ds_call_t;

struct ds_call {
		/*
		 * Enter a request into the disk queue.
		 */
	void (*enter)(ds_queue_t *dsq, struct buf *bp);
		/*
		 * Enter a request at the head of the queue.
		 */
	void (*enter_head)(ds_queue_t *dsq, struct buf *bp);
		/*
		 * Enter a request at the tail of the queue.
		 */
	void (*enter_tail)(ds_queue_t *dsq, struct buf *bp);
		/*
		 * Return the address of the first buffer in the queue.
		 */
	struct buf *(*first)(ds_queue_t *dsq);
		/*
		 * Remove a buffer from the queue.  If the first buffer
		 * is removed the queue is marked not busy.
		 */
	struct buf *(*remove)(ds_queue_t *dsq, struct buf *bp);
		/*
		 * Allocate and initialize data needed for this queue.
		 */
	void (*alloc)(ds_queue_t *dsq);
		/*
		 * Free data from this queue.
		 */
	void (*free)(ds_queue_t *dsq);
		/*
		 * True if the service is loaded and ready to go.
		 * False when shutting down or not loaded.
		 */
	u_int available;	/* is service available?*/
};

#if	KERNEL
void disksort_enter(ds_queue_t *dsq, struct buf *bp);
void disksort_enter_head(ds_queue_t *dsq, struct buf *bp);
void disksort_enter_tail(ds_queue_t *dsq, struct buf *bp);
struct buf *disksort_first(ds_queue_t *dsq);
struct buf *disksort_remove(ds_queue_t *dsq, struct buf *bp);
void disksort_init(ds_queue_t *dsq);
void disksort_free(ds_queue_t *dsq);

/*
 * Inlines
 */
static inline void disksort_qbusy(ds_queue_t *dsq)
{
	dsq->busy = 1;
}
static inline void disksort_qidle(ds_queue_t *dsq)
{
	dsq->busy = 0;
}

extern ds_call_t ds_call;
#endif

#endif

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.