@@ -368,6 +368,49 @@ bool prop_area::add(const char* name, unsigned int namelen, const char* value,
368
368
return find_property (root_node (), name, namelen, value, valuelen, true );
369
369
}
370
370
371
+ bool prop_area::del (const char * name) {
372
+ prop_bt* const trie = root_node ();
373
+ if (!trie) return false ;
374
+
375
+ const char * remaining_name = name;
376
+ prop_bt* current = trie;
377
+ while (true ) {
378
+ const char * sep = strchr (remaining_name, ' .' );
379
+ const bool want_subtree = (sep != nullptr );
380
+ const uint32_t substr_size = (want_subtree) ? sep - remaining_name : strlen (remaining_name);
381
+
382
+ if (!substr_size) {
383
+ return false ;
384
+ }
385
+
386
+ prop_bt* root = nullptr ;
387
+ uint_least32_t children_offset = atomic_load_explicit (¤t->children , memory_order_relaxed);
388
+ if (children_offset != 0 ) {
389
+ root = to_prop_bt (¤t->children );
390
+ }
391
+
392
+ if (!root) {
393
+ return false ;
394
+ }
395
+
396
+ current = find_prop_bt (root, remaining_name, substr_size, false );
397
+ if (!current) {
398
+ return false ;
399
+ }
400
+
401
+ if (!want_subtree) break ;
402
+
403
+ remaining_name = sep + 1 ;
404
+ }
405
+
406
+ uint_least32_t prop_offset = atomic_load_explicit (¤t->prop , memory_order_relaxed);
407
+ if (prop_offset != 0 ) {
408
+ uint_least32_t new_offset = 0 ;
409
+ atomic_store_explicit (¤t->prop , new_offset, memory_order_release);
410
+ }
411
+ return true ;
412
+ }
413
+
371
414
bool prop_area::foreach (void (*propfn)(const prop_info* pi, void * cookie), void* cookie) {
372
415
return foreach_property (root_node (), propfn, cookie);
373
416
}
0 commit comments