⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queuing.c

📁 newos is new operation system
💻 C
字号:
/* ** Copyright 2002, Thomas Kurschel. All rights reserved.** Distributed under the terms of the NewOS License.*/#include "xpt_internal.h"#include "queuing.h"void xpt_add_req_queue_first( CCB_SCSIIO *request, xpt_device_info *device ){	if( device->queued_reqs ) {		CCB_SCSIIO *first, *last;				first = device->queued_reqs;		last = first->xpt_prev;				request->xpt_next = first;		request->xpt_prev = last;		first->xpt_prev = request;		last->xpt_next = request;	} else {		request->xpt_next = request->xpt_prev = request;	}	device->queued_reqs = request;	++device->lock_count;	request->cam_ch.xpt_bus->lock_count += device->in_wait_queue;}static void xpt_add_req_queue_last( CCB_SCSIIO *request, xpt_device_info *device ){	if( device->queued_reqs ) {		CCB_SCSIIO *first, *last;				first = device->queued_reqs;		last = first->xpt_prev;				request->xpt_next = first;		request->xpt_prev = last;		first->xpt_prev = request;		last->xpt_next = request;	} else {		request->xpt_next = request->xpt_prev = request;		device->queued_reqs = request;	}	++device->lock_count;		request->cam_ch.xpt_bus->lock_count += device->in_wait_queue;}void xpt_remove_req_queue( CCB_SCSIIO *request, xpt_device_info *device ){	request->xpt_next->xpt_prev = request->xpt_prev;	request->xpt_prev->xpt_next = request->xpt_next;	--device->lock_count;		request->cam_ch.xpt_bus->lock_count -= device->in_wait_queue;		if( request == device->queued_reqs ) {		if( request->xpt_next != request )			device->queued_reqs = request->xpt_next;		else			device->queued_reqs = NULL;	}}void xpt_add_device_queue_first( xpt_device_info *device, xpt_bus_info *bus ){	if( device->in_wait_queue )		return;			device->in_wait_queue = true;	bus->lock_count += device->lock_count - device->sim_overflow - device->blocked_by_sim;		if( bus->waiting_devices ) {		xpt_device_info *first, *last;				first = bus->waiting_devices;		last = first->prev_waiting;				device->next_waiting = first;		device->prev_waiting = last;		first->prev_waiting = device;		last->next_waiting = device;	} else {		device->next_waiting = device->prev_waiting = device;	}		bus->waiting_devices = device;}void xpt_add_device_queue_last( xpt_device_info *device, xpt_bus_info *bus ){	if( device->in_wait_queue )		return;	device->in_wait_queue = true;	bus->lock_count += device->lock_count - device->sim_overflow - device->blocked_by_sim;		if( bus->waiting_devices ) {		xpt_device_info *first, *last;				first = bus->waiting_devices;		last = first->prev_waiting;				device->next_waiting = first;		device->prev_waiting = last;		first->prev_waiting = device;		last->next_waiting = device;	} else {		device->next_waiting = device->prev_waiting = device;		bus->waiting_devices = device;	}}void xpt_remove_device_queue( xpt_device_info *device, xpt_bus_info *bus ){	if( !device->in_wait_queue )		return;	device->in_wait_queue = false;	bus->lock_count -= device->lock_count - device->sim_overflow - device->blocked_by_sim;		device->next_waiting->prev_waiting = device->prev_waiting;	device->prev_waiting->next_waiting = device->next_waiting;		if( device == bus->waiting_devices ) {		if( device->next_waiting != device )			bus->waiting_devices = device->next_waiting;		else			bus->waiting_devices = NULL;	}}static void xpt_insert_new_request( xpt_device_info *device, 	CCB_SCSIIO *new_request ){	CCB_SCSIIO *first, *last, *before;		first = device->queued_reqs;		if( first == NULL ) {		xpt_add_req_queue_first( new_request, device );		return;	}	// don't let syncs bypass others	if( new_request->xpt_ordered ) {		xpt_add_req_queue_last( new_request, device );		return;	}	// we keep all requests ascendingly, bitonically sorted	// we must let a normal request overtake a sync request	last = first->xpt_prev;		if( new_request->cam_sort > device->last_sort &&		new_request->cam_sort > first->cam_sort ) 	{		// we should be the first request, make sure we don't bypass syncs		for( before = last; !before->xpt_ordered; ) {			before = before->xpt_prev;			if( before == last )				break;		}				if( !before->xpt_ordered )			xpt_add_req_queue_first( new_request, device );			return;	}	for( before = last; !before->xpt_ordered;  ) {		if( before->cam_sort < new_request->cam_sort )			break;					before = before->xpt_prev;		if( before == last )			break;	}	new_request->xpt_prev = before;	new_request->xpt_next = before->xpt_next;	before->xpt_next->xpt_prev = new_request;	before->xpt_next = new_request;		if( before == first )		device->queued_reqs = new_request;	++device->lock_count;	new_request->cam_ch.xpt_bus->lock_count += device->in_wait_queue;}void xpt_add_queued_request( CCB_SCSIIO *request ){	xpt_device_info *device = request->cam_ch.xpt_device;	xpt_bus_info *bus = request->cam_ch.xpt_bus;	request->cam_ch.xpt_state = XPT_STATE_QUEUED;	xpt_insert_new_request( device, request );	xpt_add_device_queue_last( device, bus );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -