Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
proview
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Esteban Blanc
proview
Commits
f821f2c4
Commit
f821f2c4
authored
Oct 22, 2004
by
claes
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ClassListAttrRef and binary tree of subclass offsets added
parent
dae91727
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
578 additions
and
14 deletions
+578
-14
src/lib/rt/src/rt_gdb.c
src/lib/rt/src/rt_gdb.c
+36
-0
src/lib/rt/src/rt_gdb.h
src/lib/rt/src/rt_gdb.h
+30
-4
src/lib/rt/src/rt_gdh.c
src/lib/rt/src/rt_gdh.c
+117
-1
src/lib/rt/src/rt_gdh.h
src/lib/rt/src/rt_gdh.h
+25
-0
src/lib/rt/src/rt_ivol.c
src/lib/rt/src/rt_ivol.c
+4
-0
src/lib/rt/src/rt_mvol.c
src/lib/rt/src/rt_mvol.c
+350
-9
src/lib/rt/src/rt_mvol.h
src/lib/rt/src/rt_mvol.h
+16
-0
No files found.
src/lib/rt/src/rt_gdb.c
View file @
f821f2c4
...
...
@@ -47,6 +47,36 @@
gdb_sLocal
*
gdbroot
=
NULL
;
#endif
/** Compare two keys in class attribute binary tree
*/
static
int
compCatt
(
ptree_sTable
*
tp
,
ptree_sNode
*
x
,
ptree_sNode
*
y
)
{
gdb_sClassAttrKey
*
xKey
=
(
gdb_sClassAttrKey
*
)
(
tp
->
g
->
keyOffset
+
(
char
*
)
x
);
gdb_sClassAttrKey
*
yKey
=
(
gdb_sClassAttrKey
*
)
(
tp
->
g
->
keyOffset
+
(
char
*
)
y
);
if
(
xKey
->
subCid
==
yKey
->
subCid
)
{
if
(
xKey
->
hostCid
==
yKey
->
hostCid
)
{
if
(
xKey
->
idx
==
yKey
->
idx
)
return
0
;
else
if
(
xKey
->
idx
<
yKey
->
idx
)
return
-
1
;
else
return
1
;
}
else
if
(
xKey
->
hostCid
<
yKey
->
hostCid
)
return
-
1
;
else
return
1
;
}
else
if
(
xKey
->
subCid
<
yKey
->
subCid
)
return
-
1
;
else
return
1
;
}
static
void
evaluateInit
(
...
...
@@ -216,6 +246,9 @@ mapLocalDb (
gdbroot
->
sc_ht
=
hash_Create
(
sts
,
gdbroot
->
pool
,
&
gdbroot
->
h
.
sc_ht
,
&
gdbroot
->
db
->
h
.
sc_ht
,
NULL
,
NULL
);
if
(
gdbroot
->
sc_ht
==
NULL
)
errh_Bugcheck
(
*
sts
,
"initiating sub class object hash table"
);
gdbroot
->
catt_tt
=
ptree_Create
(
sts
,
gdbroot
->
pool
,
&
gdbroot
->
t
.
catt_tt
,
&
gdbroot
->
db
->
t
.
catt_tt
,
compCatt
);
if
(
gdbroot
->
catt_tt
==
NULL
)
errh_Bugcheck
(
*
sts
,
"initiating class attribute tree table"
);
if
(
offsetof
(
sub_sClient
,
sid
)
!=
offsetof
(
sub_sServer
,
sid
))
errh_Bugcheck
(
GDH__WEIRD
,
"offset id: client - server"
);
...
...
@@ -711,6 +744,9 @@ gdb_CreateDb (
hash_Init
(
&
gdbroot
->
db
->
h
.
sc_ht
,
ip
->
scObjects
,
sizeof
(
pwr_tObjid
),
sizeof
(
gdb_sScObject
),
offsetof
(
gdb_sScObject
,
sc_htl
),
offsetof
(
gdb_sCclass
,
cclass_htl
),
hash_eKey_oid
);
ptree_Init
(
gdbroot
->
pool
,
&
gdbroot
->
db
->
t
.
catt_tt
,
sizeof
(
gdb_sClassAttrKey
),
offsetof
(
gdb_sClassAttr
,
key
),
sizeof
(
gdb_sClassAttr
),
100
);
lp
=
mapLocalDb
(
sts
);
if
(
lp
==
NULL
)
break
;
...
...
src/lib/rt/src/rt_gdb.h
View file @
f821f2c4
...
...
@@ -65,6 +65,10 @@
#include "rt_hash.h"
#endif
#ifndef rt_ptree_h
#include "rt_ptree.h"
#endif
#ifndef rt_net_h
#include "rt_net.h"
#endif
...
...
@@ -560,7 +564,23 @@ typedef struct {
}
gdb_sCclass
;
/** Class attributes
*/
typedef
struct
{
pwr_tCid
subCid
;
/**< Class Id for class attribute */
pwr_tCid
hostCid
;
/**< Class Id for owner class */
pwr_tUInt32
idx
;
/**< Index of offset data */
}
gdb_sClassAttrKey
;
#define gdb_cCattOffsetSize 20
typedef
struct
{
ptree_sNode
n
;
gdb_sClassAttrKey
key
;
int
numOffset
;
pwr_tUInt32
offset
[
gdb_cCattOffsetSize
];
}
gdb_sClassAttr
;
/** Object.
...
...
@@ -807,7 +827,7 @@ typedef struct {
pwr_tUInt32
elem
;
pwr_tUInt32
moffset
;
/**< Attribute maximum offset within body. */
pwr_tAix
aix
;
pwr_t
ClassId
cid
;
/**< I
f class, Class Id */
pwr_t
Tid
tid
;
/**< Type id or i
f class, Class Id */
pool_tRef
cr
;
/**< If class, gdb_sClass reference */
}
gdb_sAttribute
;
...
...
@@ -973,9 +993,11 @@ typedef struct {
hash_sGtable
as_ht
;
/**< mount soid -> alias server hash table. */
hash_sGtable
ccvol_ht
;
/**< nid + vid -> cached class volume */
hash_sGtable
cclass_ht
;
/**< cid + cached voltime -> cached class */
hash_sGtable
sc_ht
;
/**< oid -> Sub Class object hash table*/
hash_sGtable
sc_ht
;
/**< oid -> Sub Class object hash table
*/
}
h
;
struct
{
ptree_sGtable
catt_tt
;
/**< cid and offset of class attributes tree table */
}
t
;
qcom_sQid
nethandler
;
/**< local nethandler */
qcom_sQid
neth_acp
;
/**< local neth acp */
qcom_sQid
tmon
;
/**< local neth acp */
...
...
@@ -1070,6 +1092,9 @@ typedef struct {
hash_sTable
cclass_ht
;
/**< cid + cached voltime -> cached class hash table */
hash_sTable
sc_ht
;
/**< oid -> sub class object hash table */
}
h
;
struct
{
ptree_sTable
catt_tt
;
/**< cid and offset of class attributes tree table*/
}
t
;
gdb_sGlobal
*
db
;
/**< Database Root, (in db_lock section) */
sect_sHead
*
sect
;
/**< Section header for global database. */
sect_sHead
*
lock
;
/**< Section header for . */
...
...
@@ -1090,6 +1115,7 @@ typedef struct {
hash_sTable
*
ccvol_ht
;
/**< nid + vid -> cached class volume hash table */
hash_sTable
*
cclass_ht
;
/**< cid + cached voltime -> cached class hash table */
hash_sTable
*
sc_ht
;
/**< oid -> sub class object hash table */
ptree_sTable
*
catt_tt
;
/**< cid and offset of class attributes tree table */
gdb_sVolume
*
my_volume
;
/**< The local root volume. */
gdb_sVolume
*
no_volume
;
/**< The unknown volume with vid = 0.0.0.0. */
...
...
src/lib/rt/src/rt_gdh.c
View file @
f821f2c4
...
...
@@ -1188,7 +1188,7 @@ gdh_GetRootList (
pwr_tStatus
gdh_GetClassList
(
pwr_tClassId
cid
,
/**< The
object
identity. */
pwr_tClassId
cid
,
/**< The
class
identity. */
pwr_tObjid
*
oid
/**< Receives the object identity. */
)
{
...
...
@@ -1243,6 +1243,122 @@ gdh_GetNextObject (
return
sts
;
}
/**
* @brief Get the attribute reference of the first object
* in the list of objects of a specified class.
* The object can be a solitary object or an attribute object.
*
* The call shows only private volumes
* (of class $RootVolume, $SubVolume,
* $DynamicVolume, $ClassVolume and $SystemVolume),
* and shared volumes.
* @return pwr_tStatus
*/
pwr_tStatus
gdh_GetClassListAttrRef
(
pwr_tClassId
cid
,
/**< The class identity. */
pwr_sAttrRef
*
arp
/**< Receives the attribute reference. */
)
{
pwr_tStatus
sts
=
GDH__SUCCESS
;
gdh_ScopeLock
{
mvol_ClassListAttrRef
(
&
sts
,
cid
,
NULL
,
arp
,
mvol_eList_first
);
}
gdh_ScopeUnlock
;
return
sts
;
}
/**
* @brief Get the attrref of the next object
* in the list of objects of a certain class.
* The object can be a solitary object or an attribute object.
*
* The visibility of objects in the class list are
* restricted to objects in private volumes,
* (of class $RootVolume, $SubVolume,
* $DynamicVolume, $ClassVolume and $SystemVolume),
* and in shared volumes.
* @return pwr_tStatus
*/
pwr_tStatus
gdh_GetNextAttrRef
(
pwr_tClassId
cid
,
/**< The class identity. */
pwr_sAttrRef
*
arp
,
/**< The attribute reference. */
pwr_sAttrRef
*
new_arp
/**< Receives the attribute reference */
)
{
pwr_tStatus
sts
=
GDH__SUCCESS
;
/* Check arguments. */
if
(
new_arp
==
NULL
)
return
GDH__BADARG
;
gdh_ScopeLock
{
mvol_ClassListAttrRef
(
&
sts
,
cid
,
arp
,
new_arp
,
mvol_eList_next
);
}
gdh_ScopeUnlock
;
return
sts
;
}
/**
* @brief Get the attribute reference of the first attribute object
* of a specified class in the specified object.
* @return pwr_tStatus
*/
pwr_tStatus
gdh_GetObjectClassList
(
pwr_tCid
cid
,
/**< The class identity. */
pwr_tOid
oid
,
/**< Host object. */
pwr_sAttrRef
*
arp
/**< Receives the attribute reference. */
)
{
pwr_tStatus
sts
=
GDH__SUCCESS
;
pwr_sAttrRef
ar
;
gdh_ScopeLock
{
ar
.
Objid
=
oid
;
mvol_ClassListAttrRef
(
&
sts
,
cid
,
&
ar
,
arp
,
mvol_eList_objectfirst
);
}
gdh_ScopeUnlock
;
return
sts
;
}
/**
* @brief Get the attrref of the next attribute object
* of a specified class in a specified object.
* @return pwr_tStatus
*/
pwr_tStatus
gdh_GetNextObjectAttrRef
(
pwr_tClassId
cid
,
/**< The class identity. */
pwr_sAttrRef
*
arp
,
/**< The attribute reference. */
pwr_sAttrRef
*
new_arp
/**< Receives the attribute reference */
)
{
pwr_tStatus
sts
=
GDH__SUCCESS
;
/* Check arguments. */
if
(
new_arp
==
NULL
)
return
GDH__BADARG
;
gdh_ScopeLock
{
mvol_ClassListAttrRef
(
&
sts
,
cid
,
arp
,
new_arp
,
mvol_eList_objectnext
);
}
gdh_ScopeUnlock
;
return
sts
;
}
/**
* @brief Return the objid of the node object for a node identified by a
* node identifier (of type pwr_tNodeId).
...
...
src/lib/rt/src/rt_gdh.h
View file @
f821f2c4
...
...
@@ -383,7 +383,32 @@ gdh_GetPreviousObject (
pwr_tObjid
*
previousObject
);
pwr_tStatus
gdh_GetClassListAttrRef
(
pwr_tClassId
cid
,
pwr_sAttrRef
*
arp
);
pwr_tStatus
gdh_GetNextAttrRef
(
pwr_tClassId
cid
,
pwr_sAttrRef
*
arp
,
pwr_sAttrRef
*
new_arp
);
pwr_tStatus
gdh_GetObjectClassList
(
pwr_tCid
cid
,
/**< The class identity. */
pwr_tOid
oid
,
/**< Host object. */
pwr_sAttrRef
*
arp
/**< Receives the attribute reference. */
);
pwr_tStatus
gdh_GetNextObjectAttrRef
(
pwr_tClassId
cid
,
/**< The class identity. */
pwr_sAttrRef
*
arp
,
/**< The attribute reference. */
pwr_sAttrRef
*
new_arp
/**< Receives the attribute reference */
);
#define gdh_ClassNameToNumber gdh_ClassNameToId
pwr_tStatus
...
...
src/lib/rt/src/rt_ivol.c
View file @
f821f2c4
...
...
@@ -464,6 +464,10 @@ ivol_BuildNode (
}
/* Build class attribute tree */
mvol_BuildCatt
(
sts
);
convFctn
=
dvms_GetFctns
(
formatp
);
if
(
convFctn
!=
NULL
)
decodeObjects
(
formatp
->
b
.
bo
);
...
...
src/lib/rt/src/rt_mvol.c
View file @
f821f2c4
...
...
@@ -411,7 +411,7 @@ mvol_LinkClass (
{
cdh_uObjid
coid
;
pwr_sObjBodyDef
*
bp
;
pwr_sPar
Info
*
abp
;
pwr_sPar
am
*
abp
;
gdb_sObject
*
aop
;
gdb_sObject
*
cop
;
gdb_sObject
*
bop
;
...
...
@@ -496,16 +496,17 @@ mvol_LinkClass (
)
{
aop
=
pool_Qitem
(
ol
,
gdb_sObject
,
u
.
n
.
sib_ll
);
abp
=
pool_Address
(
NULL
,
gdbroot
->
rtdb
,
aop
->
u
.
n
.
body
);
i
=
abp
->
ParamIndex
;
i
=
abp
->
Info
.
ParamIndex
;
cp
->
attr
[
i
].
aor
=
pool_ItemReference
(
NULL
,
gdbroot
->
pool
,
aop
);
cp
->
attr
[
i
].
abr
=
aop
->
u
.
n
.
body
;
cp
->
attr
[
i
].
flags
.
m
=
abp
->
Flags
;
cp
->
attr
[
i
].
type
=
abp
->
Type
;
cp
->
attr
[
i
].
offs
=
abp
->
Offset
;
cp
->
attr
[
i
].
size
=
abp
->
Size
;
cp
->
attr
[
i
].
elem
=
abp
->
Elements
;
cp
->
attr
[
i
].
moffset
=
abp
->
Offset
+
abp
->
Size
-
1
;
cp
->
attr
[
i
].
flags
.
m
=
abp
->
Info
.
Flags
;
cp
->
attr
[
i
].
type
=
abp
->
Info
.
Type
;
cp
->
attr
[
i
].
offs
=
abp
->
Info
.
Offset
;
cp
->
attr
[
i
].
size
=
abp
->
Info
.
Size
;
cp
->
attr
[
i
].
elem
=
abp
->
Info
.
Elements
;
cp
->
attr
[
i
].
moffset
=
abp
->
Info
.
Offset
+
abp
->
Info
.
Size
-
1
;
cp
->
attr
[
i
].
tid
=
abp
->
TypeRef
;
coid
.
pwr
=
aop
->
g
.
oid
;
cp
->
attr
[
i
].
aix
=
coid
.
t
.
aix
;
#if 0
...
...
@@ -535,7 +536,7 @@ mvol_LinkSubClassToAttribute (
for
(
i
=
0
;
i
<
cp
->
acount
;
i
++
)
{
if
(
cp
->
attr
[
i
].
flags
.
b
.
isclass
)
{
subcp
=
hash_Search
(
sts
,
gdbroot
->
cid_ht
,
&
cp
->
attr
[
i
].
c
id
);
subcp
=
hash_Search
(
sts
,
gdbroot
->
cid_ht
,
&
cp
->
attr
[
i
].
t
id
);
if
(
subcp
==
NULL
)
errh_Bugcheck
(
0
,
"No sub class"
);
cp
->
attr
[
i
].
cr
=
pool_Reference
(
sts
,
gdbroot
->
pool
,
subcp
);
...
...
@@ -693,3 +694,343 @@ mvol_NameToClass (
pwr_Return
(
NULL
,
sts
,
GDH__BADOBJTYPE
);
}
}
static
void
insertCattObject
(
pwr_tStatus
*
sts
,
pwr_tCid
cid
,
gdb_sAttribute
*
ap
,
int
offset
)
{
gdb_sClassAttrKey
key
;
gdb_sClassAttr
*
item
;
gdb_sClass
*
cp
;
int
i
,
j
;
cp
=
hash_Search
(
sts
,
gdbroot
->
cid_ht
,
&
ap
->
tid
);
if
(
cp
==
NULL
)
pwr_ReturnVoid
(
sts
,
GDH__WEIRD
);
/* Find a tree node with free offsets */
key
.
subCid
=
ap
->
tid
;
key
.
hostCid
=
cid
;
key
.
idx
=
0
;
item
=
ptree_Find
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
while
(
ODD
(
*
sts
)
&&
item
->
numOffset
==
gdb_cCattOffsetSize
)
{
key
.
idx
++
;
item
=
ptree_Find
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
}
if
(
!
ap
->
flags
.
b
.
array
)
{
if
(
ODD
(
*
sts
))
{
/* Insert in found item */
item
->
offset
[
item
->
numOffset
++
]
=
offset
+
ap
->
offs
;
}
else
{
/* Insert a new item */
pool_tRef
itemr
;
itemr
=
ptree_Insert
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
item
=
(
gdb_sClassAttr
*
)
pool_Address
(
sts
,
gdbroot
->
pool
,
itemr
);
if
(
item
==
NULL
)
return
;
item
->
offset
[
item
->
numOffset
++
]
=
offset
+
ap
->
offs
;
}
/* Look for class attributes in this class */
for
(
i
=
0
;
i
<
cp
->
acount
;
i
++
)
{
if
(
cp
->
attr
[
i
].
flags
.
b
.
isclass
&&
cdh_tidIsCid
(
cp
->
attr
[
i
].
tid
))
{
insertCattObject
(
sts
,
cid
,
&
cp
->
attr
[
i
],
offset
+
ap
->
offs
);
if
(
EVEN
(
*
sts
))
return
;
}
}
}
else
{
/* Insert all offsets in the array */
for
(
j
=
0
;
j
<
ap
->
elem
;
j
++
)
{
if
(
ODD
(
*
sts
)
&&
item
->
numOffset
<
gdb_cCattOffsetSize
)
{
/* Insert in current item */
item
->
offset
[
item
->
numOffset
++
]
=
offset
+
ap
->
offs
+
j
*
ap
->
size
/
ap
->
elem
;
}
else
{
/* Insert a new item */
pool_tRef
itemr
;
if
(
ODD
(
*
sts
))
key
.
idx
++
;
itemr
=
ptree_Insert
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
item
=
(
gdb_sClassAttr
*
)
pool_Address
(
sts
,
gdbroot
->
pool
,
itemr
);
if
(
item
==
NULL
)
return
;
item
->
offset
[
item
->
numOffset
++
]
=
offset
+
ap
->
offs
;
}
/* Look for class attributes in this class */
for
(
i
=
0
;
i
<
cp
->
acount
;
i
++
)
{
if
(
cp
->
attr
[
i
].
flags
.
b
.
isclass
&&
cdh_tidIsCid
(
cp
->
attr
[
i
].
tid
))
{
insertCattObject
(
sts
,
cid
,
&
cp
->
attr
[
i
],
offset
+
ap
->
offs
+
j
*
ap
->
size
/
ap
->
elem
);
if
(
EVEN
(
*
sts
))
return
;
}
}
}
}
}
void
mvol_BuildCatt
(
pwr_tStatus
*
sts
)
{
gdb_sObject
*
op
=
NULL
;
pwr_tCid
cid
;
gdb_sClass
*
cp
;
int
i
;
/* Loop through all $ClassDef objects */
op
=
mvol_ClassList
(
sts
,
pwr_eClass_ClassDef
,
pwr_cNObjid
,
mvol_eList_first
);
while
(
op
)
{
cid
=
cdh_ClassObjidToId
(
op
->
g
.
oid
);
cp
=
hash_Search
(
sts
,
gdbroot
->
cid_ht
,
&
cid
);
if
(
cp
==
NULL
)
return
;
for
(
i
=
0
;
i
<
cp
->
acount
;
i
++
)
{
if
(
cp
->
attr
[
i
].
flags
.
b
.
isclass
&&
cdh_tidIsCid
(
cp
->
attr
[
i
].
tid
))
{
insertCattObject
(
sts
,
cid
,
&
cp
->
attr
[
i
],
0
);
if
(
EVEN
(
*
sts
))
return
;
}
}
op
=
mvol_ClassList
(
sts
,
pwr_cNClassId
,
op
->
g
.
oid
,
mvol_eList_next
);
}
}
void
mvol_ClassListAttrRef
(
pwr_tStatus
*
sts
,
pwr_tClassId
cid
,
pwr_sAttrRef
*
iarp
,
pwr_sAttrRef
*
oarp
,
mvol_eList
list
)
{
gdb_sClass
*
cp
;
gdb_sClass
*
cap
=
NULL
;
gdb_sObject
*
op
=
NULL
;
gdb_sObject
*
fop
=
NULL
;
pool_sQlink
*
ol
;
gdb_sClassAttrKey
key
;
gdb_sClassAttr
*
item
=
0
;
pwr_tUInt32
first_offset
;
int
i
;
if
(
iarp
!=
NULL
&&
cdh_ObjidIsNotNull
(
iarp
->
Objid
))
{
op
=
vol_OidToObject
(
sts
,
iarp
->
Objid
,
gdb_mLo_native
,
vol_mTrans_none
,
cvol_eHint_none
);
if
(
op
==
NULL
)
return
;
}
else
if
(
cid
==
pwr_cNClassId
)
pwr_ReturnVoid
(
sts
,
GDH__WEIRD
);
cp
=
(
gdb_sClass
*
)
hash_Search
(
sts
,
gdbroot
->
cid_ht
,
&
cid
);
if
(
cp
==
NULL
)
pwr_ReturnVoid
(
sts
,
GDH__BADOBJTYPE
);
switch
(
list
)
{
case
mvol_eList_first
:
/* Find object in class list */
ol
=
pool_Qsucc
(
NULL
,
gdbroot
->
pool
,
&
cp
->
cid_lh
);
if
(
ol
!=
NULL
&&
ol
!=
&
cp
->
cid_lh
)
{
fop
=
pool_Qitem
(
ol
,
gdb_sObject
,
u
.
n
.
cid_ll
);
*
oarp
=
pwr_cNAttrRef
;
oarp
->
Objid
=
fop
->
g
.
oid
;
oarp
->
Flags
.
b
.
Object
=
1
;
oarp
->
Size
=
cp
->
size
;
pwr_ReturnVoid
(
sts
,
MVOL__SUCCESS
);
}
else
{
/* Find attribute object */
key
.
subCid
=
cid
;
key
.
hostCid
=
0
;
key
.
idx
=
0
;
for
(
item
=
ptree_FindSuccessor
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
item
!=
NULL
&&
item
->
key
.
subCid
==
cid
;
item
=
ptree_FindSuccessor
(
sts
,
gdbroot
->
catt_tt
,
&
item
->
key
))
{
if
(
cap
!=
NULL
&&
item
->
key
.
hostCid
==
cap
->
cid
)
/* Same class with other index */
continue
;
cap
=
(
gdb_sClass
*
)
hash_Search
(
sts
,
gdbroot
->
cid_ht
,
&
item
->
key
.
hostCid
);
if
(
cap
==
NULL
)
return
;
ol
=
pool_Qsucc
(
NULL
,
gdbroot
->
pool
,
&
cap
->
cid_lh
);
if
(
ol
!=
NULL
&&
ol
!=
&
cap
->
cid_lh
)
{
fop
=
pool_Qitem
(
ol
,
gdb_sObject
,
u
.
n
.
cid_ll
);
*
oarp
=
pwr_cNAttrRef
;
oarp
->
Objid
=
fop
->
g
.
oid
;
oarp
->
Flags
.
b
.
ObjectAttr
=
1
;
oarp
->
Offset
=
item
->
offset
[
0
];
oarp
->
Size
=
cp
->
size
;
oarp
->
Body
=
cid
;
pwr_ReturnVoid
(
sts
,
MVOL__SUCCESS
);
}
}
pwr_ReturnVoid
(
sts
,
GDH__NO_TYPE
);
}
break
;
case
mvol_eList_next
:
if
(
op
->
g
.
cid
==
cid
)
{
/* Find next object in class list */
ol
=
pool_Qsucc
(
NULL
,
gdbroot
->
pool
,
&
op
->
u
.
n
.
cid_ll
);
if
(
ol
!=
NULL
&&
ol
!=
&
cp
->
cid_lh
)
{
fop
=
pool_Qitem
(
ol
,
gdb_sObject
,
u
.
n
.
cid_ll
);
*
oarp
=
pwr_cNAttrRef
;
oarp
->
Objid
=
fop
->
g
.
oid
;
oarp
->
Flags
.
b
.
Object
=
1
;
oarp
->
Size
=
cp
->
size
;
pwr_ReturnVoid
(
sts
,
MVOL__SUCCESS
);
}
else
{
/* Find first attribute object */
key
.
subCid
=
cid
;
key
.
hostCid
=
0
;
key
.
idx
=
0
;
for
(
item
=
ptree_FindSuccessor
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
item
!=
NULL
&&
item
->
key
.
subCid
==
cid
;
item
=
ptree_FindSuccessor
(
sts
,
gdbroot
->
catt_tt
,
&
item
->
key
))
{
if
(
cap
!=
NULL
&&
item
->
key
.
hostCid
==
cap
->
cid
)
/* Same class with other index */
continue
;
cap
=
(
gdb_sClass
*
)
hash_Search
(
sts
,
gdbroot
->
cid_ht
,
&
item
->
key
.
hostCid
);
if
(
cap
==
NULL
)
return
;
ol
=
pool_Qsucc
(
NULL
,
gdbroot
->
pool
,
&
cap
->
cid_lh
);
if
(
ol
!=
NULL
&&
ol
!=
&
cap
->
cid_lh
)
{
fop
=
pool_Qitem
(
ol
,
gdb_sObject
,
u
.
n
.
cid_ll
);
*
oarp
=
pwr_cNAttrRef
;
oarp
->
Objid
=
fop
->
g
.
oid
;
oarp
->
Flags
.
b
.
ObjectAttr
=
1
;
oarp
->
Offset
=
item
->
offset
[
0
];
oarp
->
Size
=
cp
->
size
;
oarp
->
Body
=
cid
;
pwr_ReturnVoid
(
sts
,
MVOL__SUCCESS
);
}
}
pwr_ReturnVoid
(
sts
,
GDH__NO_TYPE
);
}
}
/* Find next attribute object in current object */
key
.
subCid
=
cid
;
key
.
hostCid
=
op
->
g
.
cid
;
key
.
idx
=
0
;
for
(
item
=
ptree_Find
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
item
!=
NULL
&&
item
->
key
.
subCid
==
cid
&&
item
->
key
.
hostCid
==
op
->
g
.
cid
;
item
=
ptree_FindSuccessor
(
sts
,
gdbroot
->
catt_tt
,
&
item
->
key
))
{
/* Find next offset */
for
(
i
=
0
;
i
<
item
->
numOffset
;
i
++
)
{
if
(
i
==
0
&&
item
->
key
.
idx
==
0
)
first_offset
=
item
->
offset
[
0
];
if
(
item
->
offset
[
i
]
>
iarp
->
Offset
)
{
*
oarp
=
pwr_cNAttrRef
;
oarp
->
Objid
=
op
->
g
.
oid
;
oarp
->
Flags
.
b
.
ObjectAttr
=
1
;
oarp
->
Offset
=
item
->
offset
[
i
];
oarp
->
Size
=
cp
->
size
;
oarp
->
Body
=
cid
;
pwr_ReturnVoid
(
sts
,
MVOL__SUCCESS
);
}
}
}
/* Find first attribute in next object */
if
(
cap
==
NULL
)
{
cap
=
(
gdb_sClass
*
)
hash_Search
(
sts
,
gdbroot
->
cid_ht
,
&
op
->
g
.
cid
);
if
(
cap
==
NULL
)
pwr_ReturnVoid
(
sts
,
GDH__WEIRD
);
}
ol
=
pool_Qsucc
(
NULL
,
gdbroot
->
pool
,
&
op
->
u
.
n
.
cid_ll
);
if
(
ol
!=
NULL
&&
ol
!=
&
cap
->
cid_lh
)
{
fop
=
pool_Qitem
(
ol
,
gdb_sObject
,
u
.
n
.
cid_ll
);
*
oarp
=
pwr_cNAttrRef
;
oarp
->
Objid
=
fop
->
g
.
oid
;
oarp
->
Flags
.
b
.
ObjectAttr
=
1
;
oarp
->
Offset
=
first_offset
;
oarp
->
Size
=
cp
->
size
;
oarp
->
Body
=
cid
;
pwr_ReturnVoid
(
sts
,
MVOL__SUCCESS
);
}
/* Find first offset in first object of next class */
key
.
subCid
=
cid
;
key
.
hostCid
=
op
->
g
.
cid
;
key
.
idx
=
0
;
for
(
item
=
ptree_Find
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
item
!=
NULL
&&
item
->
key
.
subCid
==
cid
;
item
=
ptree_FindSuccessor
(
sts
,
gdbroot
->
catt_tt
,
&
item
->
key
))
{
if
(
item
->
key
.
hostCid
==
key
.
hostCid
)
continue
;
cap
=
(
gdb_sClass
*
)
hash_Search
(
sts
,
gdbroot
->
cid_ht
,
&
item
->
key
.
hostCid
);
if
(
cap
==
NULL
)
pwr_ReturnVoid
(
sts
,
GDH__WEIRD
);
ol
=
pool_Qsucc
(
NULL
,
gdbroot
->
pool
,
&
cap
->
cid_lh
);
if
(
ol
!=
NULL
&&
ol
!=
&
cap
->
cid_lh
)
{
fop
=
pool_Qitem
(
ol
,
gdb_sObject
,
u
.
n
.
cid_ll
);
*
oarp
=
pwr_cNAttrRef
;
oarp
->
Objid
=
fop
->
g
.
oid
;
oarp
->
Flags
.
b
.
ObjectAttr
=
1
;
oarp
->
Offset
=
item
->
offset
[
0
];
oarp
->
Size
=
cp
->
size
;
oarp
->
Body
=
cid
;
pwr_ReturnVoid
(
sts
,
MVOL__SUCCESS
);
}
}
pwr_ReturnVoid
(
sts
,
GDH__NO_TYPE
);
case
mvol_eList_objectfirst
:
/* Find first attrref in this object */
key
.
subCid
=
cid
;
key
.
hostCid
=
op
->
g
.
cid
;
key
.
idx
=
0
;
item
=
ptree_Find
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
if
(
item
==
NULL
)
pwr_ReturnVoid
(
sts
,
GDH__NO_TYPE
);
*
oarp
=
pwr_cNAttrRef
;
oarp
->
Objid
=
op
->
g
.
oid
;
oarp
->
Flags
.
b
.
ObjectAttr
=
1
;
oarp
->
Offset
=
item
->
offset
[
0
];
oarp
->
Size
=
cp
->
size
;
oarp
->
Body
=
cid
;
pwr_ReturnVoid
(
sts
,
MVOL__SUCCESS
);
case
mvol_eList_objectnext
:
/* Find next attribute object in current object */
key
.
subCid
=
cid
;
key
.
hostCid
=
op
->
g
.
cid
;
key
.
idx
=
0
;
for
(
item
=
ptree_Find
(
sts
,
gdbroot
->
catt_tt
,
&
key
);
item
!=
NULL
&&
item
->
key
.
subCid
==
cid
&&
item
->
key
.
hostCid
==
op
->
g
.
cid
;
item
=
ptree_FindSuccessor
(
sts
,
gdbroot
->
catt_tt
,
&
item
->
key
))
{
/* Find next offset */
for
(
i
=
0
;
i
<
item
->
numOffset
;
i
++
)
{
if
(
i
==
0
&&
item
->
key
.
idx
==
0
)
first_offset
=
item
->
offset
[
0
];
if
(
item
->
offset
[
i
]
>
iarp
->
Offset
)
{
*
oarp
=
pwr_cNAttrRef
;
oarp
->
Objid
=
op
->
g
.
oid
;
oarp
->
Flags
.
b
.
ObjectAttr
=
1
;
oarp
->
Offset
=
item
->
offset
[
i
];
oarp
->
Size
=
cp
->
size
;
oarp
->
Body
=
cid
;
pwr_ReturnVoid
(
sts
,
MVOL__SUCCESS
);
}
}
}
pwr_ReturnVoid
(
sts
,
GDH__NO_TYPE
);
default:
pwr_ReturnVoid
(
sts
,
GDH__NYI
);
}
}
src/lib/rt/src/rt_mvol.h
View file @
f821f2c4
...
...
@@ -35,6 +35,8 @@ typedef enum {
mvol_eList_last
,
mvol_eList_next
,
mvol_eList_prev
,
mvol_eList_objectfirst
,
mvol_eList_objectnext
,
mvol_eList_
}
mvol_eList
;
...
...
@@ -102,6 +104,15 @@ mvol_ClassList (
mvol_eList
list
);
void
mvol_ClassListAttrRef
(
pwr_tStatus
*
sts
,
pwr_tClassId
cid
,
pwr_sAttrRef
*
iarp
,
pwr_sAttrRef
*
oarp
,
mvol_eList
list
);
gdb_sClass
*
mvol_LinkClass
(
pwr_tStatus
*
sts
,
...
...
@@ -136,4 +147,9 @@ mvol_NameToClass (
char
*
name
);
void
mvol_BuildCatt
(
pwr_tStatus
*
sts
);
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment