kernel中 resource结构的操作
来源:互联网 发布:生物进化的历程知乎 编辑:程序博客网 时间:2024/05/22 09:48
/*
* =====================================================================================
*
* Filename: resource.c
*
* Description:
*
* Version: 1.0
* Created: 09/13/2011 10:25:23 AM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Company:
*
* =====================================================================================
*/
#include <stdio.h>
typedef unsigned long resource_size_t;
struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
struct resource *parent, *sibling, *child;
};
struct resource root;
struct resource res[10];
void init()
{
int i;
root.start = 0;
root.end = 1000;
res[0].start = 10;
res[0].end = 50;
res[1].start = 90;
res[1].end = 150;
res[2].start = 210;
res[2].end = 250;
res[3].start = 310;
res[3].end = 450;
/*link it*/
root.child = &res[0];
for(i = 0; i< 3; i++)
{
res[i].sibling = &res[i+1];
}
res[3].sibling = NULL;
}
void dump(struct resource *root)
{
struct resource **p = &root->child;
struct resource *tmp = NULL;
while (*p)
{
tmp = *p;
printf("%lu-%lu\n", tmp->start, tmp->end);
p = &tmp->sibling;
}
}
/*
* relocate the old resource, to the new position. Return error and do nothing
* if the new location conflicts with any other resource.
*/
static int __re_request_resource1(struct resource *root,
struct resource *new, struct resource *old)
{
resource_size_t start = new->start;
resource_size_t end = new->end;
struct resource *tmp, **p, **p_old = NULL;
printf("Debug info: new is %lu-%lu, old is %lu-%lu\n",
start,end, old->start, old->end);
if (end < start || start < root->start || end > root->end)
return -1;
p = &root->child;
for (;;) {
if ( *p == old )
p_old = p;
tmp = *p;
if (!tmp || tmp->start > end) {
if (tmp == old) {
old->start = start;
old->end = end;
return 0;
}
if (!p_old) {
p_old = p;
while ( *p_old && old != (*p_old)->sibling )
p_old = &(*p_old)->sibling;
//BUG_ON(!*p_old);
if(!*p_old)
{
printf("Error!\n");
}
}
/* relocate old */
*p_old = old->sibling;
old->start = start;
old->end = end;
old->sibling = tmp;
*p = old;
return 0;
}
p = &tmp->sibling;
if (tmp->end >= start)
return -1;
}
}
static int __re_request_resource2(struct resource *root,
struct resource *new, struct resource *old)
{
resource_size_t start = new->start;
resource_size_t end = new->end;
struct resource *iter, **p_iter = NULL;
struct resource **p_new = NULL;
struct resource **p_old = NULL;
printf("Debug info: new is %lu-%lu, old is %lu-%lu\n",
start,end, old->start, old->end);
if (end < start || start < root->start || end > root->end)
return -1;
p_iter = &root->child;
iter = *p_iter;
if ( (start >= old->start && start <= old->end) ||
(end >= old->start && end <= old->end)) {
old->start = start;
old->end = end;
return 0;
}
while ( iter ) {
if (iter == old) {
p_old = p_iter;
}
if (iter->start > end && !p_new) {
p_new = p_iter;
}
else if(iter->sibling == NULL) {
p_new = &iter->sibling;
}
if (p_old && p_new)
break;
p_iter = &iter->sibling;
iter = *p_iter;
}
if ( (p_old == p_new) ) {
old->start = start;
old->end = end;
return 0;
}
if ((&(*p_old)->sibling == p_new) ) {
old->start = start;
old->end = end;
return 0;
}
old->start = start;
old->end = end;
*p_old = old->sibling;
old->sibling = *p_new;
*p_new = old;
return 0;
}
static int remove_old(struct resource *root, struct resource *old)
{
struct resource *iter, **p_iter = NULL;
struct resource **p_old = NULL;
p_iter = &root->child;
iter = *p_iter;
while ( iter ) {
if (iter == old) {
p_old = p_iter;
break;
}
p_iter = &iter->sibling;
iter = *p_iter;
}
*p_old = old->sibling;
}
#define __re_request_resource __re_request_resource2
int main()
{
int index;
init();
dump(&root);
/*test cases for resoures*/
struct resource new;
scanf("%d", &index);
/* 10-50, 90-150, 210-250, 310-450 */
switch (index)
{
case 1: // expand the range, left side
new.start = 5;
new.end = 50;
__re_request_resource(&root, &new, &res[0]);
break;
case 2: // expand the range, right side
new.start = 10;
new.end = 60;
__re_request_resource(&root, &new, &res[0]);
break;
case 3: // expand the range, both side
new.start = 7;
new.end = 80;
__re_request_resource(&root, &new, &res[0]);
break;
case 4: // allocate a new range, ahead of old
new.start = 60;
new.end = 80;
__re_request_resource(&root, &new, &res[1]);
break;
case 5: // allocate a new range, after old
new.start = 160;
new.end = 200;
__re_request_resource(&root, &new, &res[1]);
break;
case 6: // allocate a new range, at the beginning
new.start = 2;
new.end = 8;
__re_request_resource(&root, &new, &res[2]);
break;
case 7: // allocate a new range, at last
new.start = 500;
new.end = 600;
__re_request_resource(&root, &new, &res[2]);
break;
case 8: // allocate a new range, at last with old is the last too
new.start = 500;
new.end = 600;
__re_request_resource(&root, &new, &res[3]);
break;
default:
for (index = 0; index < 3; index++)
printf("%x\n", (unsigned int)&res[index]);
printf("------------\n");
remove_old(&root, &res[2]);
break;
}
dump(&root);
return 0;
}
* =====================================================================================
*
* Filename: resource.c
*
* Description:
*
* Version: 1.0
* Created: 09/13/2011 10:25:23 AM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Company:
*
* =====================================================================================
*/
#include <stdio.h>
typedef unsigned long resource_size_t;
struct resource {
resource_size_t start;
resource_size_t end;
const char *name;
unsigned long flags;
struct resource *parent, *sibling, *child;
};
struct resource root;
struct resource res[10];
void init()
{
int i;
root.start = 0;
root.end = 1000;
res[0].start = 10;
res[0].end = 50;
res[1].start = 90;
res[1].end = 150;
res[2].start = 210;
res[2].end = 250;
res[3].start = 310;
res[3].end = 450;
/*link it*/
root.child = &res[0];
for(i = 0; i< 3; i++)
{
res[i].sibling = &res[i+1];
}
res[3].sibling = NULL;
}
void dump(struct resource *root)
{
struct resource **p = &root->child;
struct resource *tmp = NULL;
while (*p)
{
tmp = *p;
printf("%lu-%lu\n", tmp->start, tmp->end);
p = &tmp->sibling;
}
}
/*
* relocate the old resource, to the new position. Return error and do nothing
* if the new location conflicts with any other resource.
*/
static int __re_request_resource1(struct resource *root,
struct resource *new, struct resource *old)
{
resource_size_t start = new->start;
resource_size_t end = new->end;
struct resource *tmp, **p, **p_old = NULL;
printf("Debug info: new is %lu-%lu, old is %lu-%lu\n",
start,end, old->start, old->end);
if (end < start || start < root->start || end > root->end)
return -1;
p = &root->child;
for (;;) {
if ( *p == old )
p_old = p;
tmp = *p;
if (!tmp || tmp->start > end) {
if (tmp == old) {
old->start = start;
old->end = end;
return 0;
}
if (!p_old) {
p_old = p;
while ( *p_old && old != (*p_old)->sibling )
p_old = &(*p_old)->sibling;
//BUG_ON(!*p_old);
if(!*p_old)
{
printf("Error!\n");
}
}
/* relocate old */
*p_old = old->sibling;
old->start = start;
old->end = end;
old->sibling = tmp;
*p = old;
return 0;
}
p = &tmp->sibling;
if (tmp->end >= start)
return -1;
}
}
static int __re_request_resource2(struct resource *root,
struct resource *new, struct resource *old)
{
resource_size_t start = new->start;
resource_size_t end = new->end;
struct resource *iter, **p_iter = NULL;
struct resource **p_new = NULL;
struct resource **p_old = NULL;
printf("Debug info: new is %lu-%lu, old is %lu-%lu\n",
start,end, old->start, old->end);
if (end < start || start < root->start || end > root->end)
return -1;
p_iter = &root->child;
iter = *p_iter;
if ( (start >= old->start && start <= old->end) ||
(end >= old->start && end <= old->end)) {
old->start = start;
old->end = end;
return 0;
}
while ( iter ) {
if (iter == old) {
p_old = p_iter;
}
if (iter->start > end && !p_new) {
p_new = p_iter;
}
else if(iter->sibling == NULL) {
p_new = &iter->sibling;
}
if (p_old && p_new)
break;
p_iter = &iter->sibling;
iter = *p_iter;
}
if ( (p_old == p_new) ) {
old->start = start;
old->end = end;
return 0;
}
if ((&(*p_old)->sibling == p_new) ) {
old->start = start;
old->end = end;
return 0;
}
old->start = start;
old->end = end;
*p_old = old->sibling;
old->sibling = *p_new;
*p_new = old;
return 0;
}
static int remove_old(struct resource *root, struct resource *old)
{
struct resource *iter, **p_iter = NULL;
struct resource **p_old = NULL;
p_iter = &root->child;
iter = *p_iter;
while ( iter ) {
if (iter == old) {
p_old = p_iter;
break;
}
p_iter = &iter->sibling;
iter = *p_iter;
}
*p_old = old->sibling;
}
#define __re_request_resource __re_request_resource2
int main()
{
int index;
init();
dump(&root);
/*test cases for resoures*/
struct resource new;
scanf("%d", &index);
/* 10-50, 90-150, 210-250, 310-450 */
switch (index)
{
case 1: // expand the range, left side
new.start = 5;
new.end = 50;
__re_request_resource(&root, &new, &res[0]);
break;
case 2: // expand the range, right side
new.start = 10;
new.end = 60;
__re_request_resource(&root, &new, &res[0]);
break;
case 3: // expand the range, both side
new.start = 7;
new.end = 80;
__re_request_resource(&root, &new, &res[0]);
break;
case 4: // allocate a new range, ahead of old
new.start = 60;
new.end = 80;
__re_request_resource(&root, &new, &res[1]);
break;
case 5: // allocate a new range, after old
new.start = 160;
new.end = 200;
__re_request_resource(&root, &new, &res[1]);
break;
case 6: // allocate a new range, at the beginning
new.start = 2;
new.end = 8;
__re_request_resource(&root, &new, &res[2]);
break;
case 7: // allocate a new range, at last
new.start = 500;
new.end = 600;
__re_request_resource(&root, &new, &res[2]);
break;
case 8: // allocate a new range, at last with old is the last too
new.start = 500;
new.end = 600;
__re_request_resource(&root, &new, &res[3]);
break;
default:
for (index = 0; index < 3; index++)
printf("%x\n", (unsigned int)&res[index]);
printf("------------\n");
remove_old(&root, &res[2]);
break;
}
dump(&root);
return 0;
}
- kernel中 resource结构的操作
- spring的Resource结构
- liyux中目录结构(0.11 kernel)
- kernel结构
- kernel结构
- WPF中resource和content生成操作
- 结构体中使用的bit操作
- stl中有序结构的操作
- C语言中结构体的操作
- kernel中创建属性并且操作
- angularjs中$resource的使用
- angularjs中$resource对应的五种基本操作及扩展
- kernel中bluetooth的初始化
- kernel中bluetooth的初始化
- kernel中 PF_PACKET 的流程
- fedora下对kernel的简单操作
- yum update kernel后的操作
- Linux kernel 关机的底层操作
- Direct 10相关学习笔记
- 关于VS2010编译生成ipch文件夹和*.sdf文件的说明
- 加快xp关机速度
- 【转载】C# 文件操作 全收录 追加、拷贝、删除、移动文件、创建目录、递归删除文件夹及文件....
- Metro让我们看到Windows平板的希望,但仍需开发者支持
- kernel中 resource结构的操作
- MyEclipse 设置默认编码为utf-8 Default Encoding
- Run-Time Check Failure #2
- java中生成对象的方式
- swing中如何实现JFrame为模态窗口
- telnet与java socket发送简单文本文件
- udev
- window.event对象用法讲解
- SCHi559 升级2.3.4后root方法