Justus Winter, le Thu 22 May 2014 22:13:30 +0200, a écrit : > libdiskfs has two kind of nodes, struct node and struct netnode. > struct node is used to store libdiskfs specific data, while struct > netnode contains user supplied data. Previously, both objects were > allocated separatly, and a pointer from the node to the netnode > provided a mapping from the former to the latter. > > Provide a function diskfs_make_node_alloc that allocates both nodes in > a contiguous region. > > This reduces the memory allocation overhead when creating nodes. It > also makes the relation between node and netnode a simple offset > calculation. Provide two functions to compute the netnode address > from the node address and vice-versa. > > Most notably, this makes implementing a cache on top of libdiskfs > easier. Auxiliary data for the cache can be stored in the > user-defined netnode, and the fat node can be used as the value.
Ack! > * libdiskfs/node-make.c (init_node): Move initialization here. > (diskfs_make_node): Use init_node. > (diskfs_make_node_alloc): New function to allocate fat nodes. > * libdiskfs/diskfs.h (diskfs_make_node_alloc): New declaration. > (diskfs_node_netnode): Compute netnode address from node address. > (diskfs_netnode_node): And vice-versa. > --- > libdiskfs/diskfs.h | 22 ++++++++++++++++++++++ > libdiskfs/node-make.c | 39 ++++++++++++++++++++++++++++++--------- > 2 files changed, 52 insertions(+), 9 deletions(-) > > diff --git a/libdiskfs/diskfs.h b/libdiskfs/diskfs.h > index 8151ddc..f710d10 100644 > --- a/libdiskfs/diskfs.h > +++ b/libdiskfs/diskfs.h > @@ -685,6 +685,28 @@ diskfs_notice_filechange (struct node *np, enum > file_changed_type type, > The new node will have one hard reference and no light references. */ > struct node *diskfs_make_node (struct disknode *dn); > > +/* Create a new node structure. Also allocate SIZE bytes for the > + disknode. The address of the disknode can be obtained using > + diskfs_node_disknode. The new node will have one hard reference > + and no light references. */ > +struct node *diskfs_make_node_alloc (size_t size); > + > +/* Return the address of the disknode for NODE. NODE must have been > + allocated using diskfs_make_node_alloc. */ > +static inline struct disknode * > +diskfs_node_disknode (struct node *node) > +{ > + return (struct disknode *) ((char *) node + sizeof (struct node)); > +} > + > +/* Return the address of the node for DISKNODE. DISKNODE must have > + been allocated using diskfs_make_node_alloc. */ > +static inline struct node * > +diskfs_disknode_node (struct disknode *disknode) > +{ > + return (struct node *) ((char *) disknode - sizeof (struct node)); > +} > + > > /* The library also exports the following functions; they are not generally > useful unless you are redefining other functions the library provides. */ > diff --git a/libdiskfs/node-make.c b/libdiskfs/node-make.c > index 2b6ef2a..ff0cc0d 100644 > --- a/libdiskfs/node-make.c > +++ b/libdiskfs/node-make.c > @@ -19,16 +19,9 @@ > #include <fcntl.h> > > > -/* Create a and return new node structure with DN as its physical disknode. > - The node will have one hard reference and no light references. */ > -struct node * > -diskfs_make_node (struct disknode *dn) > +static struct node * > +init_node (struct node *np, struct disknode *dn) > { > - struct node *np = malloc (sizeof (struct node)); > - > - if (np == 0) > - return 0; > - > np->dn = dn; > np->dn_set_ctime = 0; > np->dn_set_atime = 0; > @@ -52,3 +45,31 @@ diskfs_make_node (struct disknode *dn) > > return np; > } > + > +/* Create a and return new node structure with DN as its physical disknode. > + The node will have one hard reference and no light references. */ > +struct node * > +diskfs_make_node (struct disknode *dn) > +{ > + struct node *np = malloc (sizeof (struct node)); > + > + if (np == 0) > + return 0; > + > + return init_node (np, dn); > +} > + > +/* Create a new node structure. Also allocate SIZE bytes for the > + disknode. The address of the disknode can be obtained using > + diskfs_node_disknode. The new node will have one hard reference > + and no light references. */ > +struct node * > +diskfs_make_node_alloc (size_t size) > +{ > + struct node *np = malloc (sizeof (struct node) + size); > + > + if (np == NULL) > + return NULL; > + > + return init_node (np, diskfs_node_disknode (np)); > +} > -- > 2.0.0.rc2 > -- Samuel Battery 1: charging, 90%, charging at zero rate - will never fully charge. -+- acpi - et pourtant, ca monte -+-