Changeset f2da0bb in mainline
- Timestamp:
- 2012-06-24T19:24:35Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 04a7435f
- Parents:
- 0d1a8fd
- Location:
- uspace/app/bithenge
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified uspace/app/bithenge/blob.c ¶
r0d1a8fd rf2da0bb 59 59 60 60 blob->base.type = BITHENGE_NODE_BLOB; 61 blob->base.refs = 1; 61 62 blob->base.blob_ops = ops; 62 63 return EOK; -
TabularUnified uspace/app/bithenge/script.c ¶
r0d1a8fd rf2da0bb 328 328 free(entry->name); 329 329 bithenge_transform_dec_ref(entry->transform); 330 free(entry); 330 331 entry = next; 331 332 } -
TabularUnified uspace/app/bithenge/test.c ¶
r0d1a8fd rf2da0bb 67 67 bithenge_print_node(BITHENGE_PRINT_JSON, node); 68 68 printf("\n"); 69 bithenge_node_de stroy(node);69 bithenge_node_dec_ref(node); 70 70 } else { 71 71 bithenge_transform_t *transform; … … 89 89 } 90 90 91 bithenge_node_de stroy(node);91 bithenge_node_dec_ref(node); 92 92 bithenge_transform_dec_ref(transform); 93 93 … … 97 97 return 1; 98 98 } 99 bithenge_node_dec_ref(node2); 99 100 printf("\n"); 100 101 } -
TabularUnified uspace/app/bithenge/transform.h ¶
r0d1a8fd rf2da0bb 104 104 } 105 105 106 /** Decrement a transform's reference count .106 /** Decrement a transform's reference count and free it if appropriate. 107 107 * @param xform The transform to dereference, or NULL. 108 108 * @return EOK on success or an error code from errno.h. */ -
TabularUnified uspace/app/bithenge/tree.c ¶
r0d1a8fd rf2da0bb 48 48 } 49 49 50 /** Destroy a node. 51 * @memberof bithenge_node_t 52 * @param node The node to destroy. 53 * @return EOK on success or an error code from errno.h. */ 54 int bithenge_node_destroy(bithenge_node_t *node) 50 static int node_destroy(bithenge_node_t *node) 55 51 { 56 52 switch (bithenge_node_type(node)) { … … 72 68 } 73 69 70 /** Decrement a node's reference count and free it if appropriate. 71 * @memberof bithenge_node_t 72 * @param node The node to dereference, or NULL. 73 * @return EOK on success or an error code from errno.h. */ 74 int bithenge_node_dec_ref(bithenge_node_t *node) 75 { 76 if (!node) 77 return EOK; 78 if (--node->refs == 0) 79 return node_destroy(node); 80 return EOK; 81 } 82 74 83 typedef struct 75 84 { … … 83 92 { 84 93 return (simple_internal_node_t *)node; 94 } 95 96 static bithenge_node_t *simple_as_node(simple_internal_node_t *node) 97 { 98 return &node->base; 85 99 } 86 100 … … 102 116 int rc; 103 117 simple_internal_node_t *node = node_as_simple(base); 104 for (bithenge_int_t i = 0; i < node->len; i++) { 105 rc = bithenge_node_destroy(node->nodes[2*i+0]); 106 if (rc != EOK) 107 return rc; 108 rc = bithenge_node_destroy(node->nodes[2*i+1]); 118 for (bithenge_int_t i = 0; i < 2 * node->len; i++) { 119 rc = bithenge_node_dec_ref(node->nodes[i]); 109 120 if (rc != EOK) 110 121 return rc; … … 121 132 }; 122 133 123 static bithenge_node_t *simple_internal_as_node(simple_internal_node_t *node) 124 { 125 return &node->base; 126 } 127 128 /** Create an internal node from a set of keys and values. The node must be 129 * freed with @a bithenge_node_t::bithenge_node_destroy after it is used, which 130 * will also destroy all the key and value nodes. 134 /** Create an internal node from a set of keys and values. This function takes 135 * ownership of a reference to the key and value nodes, and optionally the 136 * array @a nodes. 131 137 * @memberof bithenge_node_t 132 138 * @param[out] out Stores the created internal node. … … 135 141 * @param len The number of key-value pairs in the node array. 136 142 * @param needs_free If true, when the internal node is destroyed it will free 137 * the nodes array as well as destroying each node inside it.143 * the nodes array rather than just dereferencing each node inside it. 138 144 * @return EOK on success or an error code from errno.h. */ 139 145 int bithenge_new_simple_internal_node(bithenge_node_t **out, … … 142 148 assert(out); 143 149 simple_internal_node_t *node = malloc(sizeof(*node)); 144 if (!node) 150 if (!node) { 151 for (bithenge_int_t i = 0; i < 2 * len; i++) 152 bithenge_node_dec_ref(nodes[i]); 153 if (needs_free) 154 free(nodes); 145 155 return ENOMEM; 156 } 146 157 node->base.type = BITHENGE_NODE_INTERNAL; 158 node->base.refs = 1; 147 159 node->base.internal_ops = &simple_internal_node_ops; 148 160 node->nodes = nodes; 149 161 node->len = len; 150 162 node->needs_free = needs_free; 151 *out = simple_internal_as_node(node); 152 return EOK; 153 } 154 155 static bithenge_node_t false_node = { BITHENGE_NODE_BOOLEAN, .boolean_value = false }; 156 static bithenge_node_t true_node = { BITHENGE_NODE_BOOLEAN, .boolean_value = true }; 157 158 /** Create a boolean node. The node must be freed with @a 159 * bithenge_node_t::bithenge_node_destroy after it is used. 163 *out = simple_as_node(node); 164 return EOK; 165 } 166 167 static bithenge_node_t false_node = { BITHENGE_NODE_BOOLEAN, 1, .boolean_value = false }; 168 static bithenge_node_t true_node = { BITHENGE_NODE_BOOLEAN, 1, .boolean_value = true }; 169 170 /** Create a boolean node. 160 171 * @memberof bithenge_node_t 161 172 * @param[out] out Stores the created boolean node. … … 166 177 assert(out); 167 178 *out = value ? &true_node : &false_node; 168 return EOK;169 } 170 171 /** Create an integer node. The node must be freed with @a 172 * bithenge_node_t::bithenge_node_destroy after it is used.179 (*out)->refs++; 180 return EOK; 181 } 182 183 /** Create an integer node. 173 184 * @memberof bithenge_node_t 174 185 * @param[out] out Stores the created integer node. … … 182 193 return ENOMEM; 183 194 node->type = BITHENGE_NODE_INTEGER; 195 node->refs = 1; 184 196 node->integer_value = value; 185 197 *out = node; … … 187 199 } 188 200 189 /** Create a string node. The node must be freed with @a 190 * bithenge_node_t::bithenge_node_destroy after it is used. 201 /** Create a string node. 191 202 * @memberof bithenge_node_t 192 203 * @param[out] out Stores the created string node. … … 202 213 return ENOMEM; 203 214 node->type = BITHENGE_NODE_STRING; 215 node->refs = 1; 204 216 node->string_value.ptr = value; 205 217 node->string_value.needs_free = needs_free; -
TabularUnified uspace/app/bithenge/tree.h ¶
r0d1a8fd rf2da0bb 68 68 /** @privatesection */ 69 69 bithenge_node_type_t type; 70 unsigned int refs; 70 71 union { 71 72 const struct bithenge_internal_node_ops_t *internal_ops; … … 104 105 return node->type; 105 106 } 107 108 /** Increment a node's reference count. 109 * @memberof bithenge_node_t 110 * @param node The node to reference. 111 * @return EOK on success or an error code from errno.h. */ 112 static inline int bithenge_node_inc_ref(bithenge_node_t *node) 113 { 114 assert(node); 115 node->refs++; 116 return EOK; 117 } 118 119 int bithenge_node_dec_ref(bithenge_node_t *node); 106 120 107 121 /** Iterate over a node's children. … … 152 166 int bithenge_new_integer_node(bithenge_node_t **, bithenge_int_t); 153 167 int bithenge_new_string_node(bithenge_node_t **, const char *, bool); 154 int bithenge_node_destroy(bithenge_node_t *);155 168 bool bithenge_node_equal(bithenge_node_t *, bithenge_node_t *); 156 169
Note:
See TracChangeset
for help on using the changeset viewer.