4 * Copyright (c) Tuomo Valkonen 1999-2007.
6 * Ion is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
13 #include <libmainloop/defer.h>
25 static Rb_node retrb=NULL;
35 bool region_do_set_return(WRegion *reg, WPHolder *ph)
40 assert(!OBJ_IS_BEING_DESTROYED(reg));
42 region_unset_return(reg);
50 node=rb_insertp(retrb, reg, ph);
52 region_notify_change(reg, ioncore_g.notifies.set_return);
58 WPHolder *region_make_return_pholder(WRegion *reg)
60 WRegion *mgr=region_manager(reg);
65 return region_managed_get_pholder(mgr, reg);
70 extern WPHolder *region_set_return(WRegion *reg)
72 WPHolder *ph=region_make_return_pholder(reg);
75 if(region_do_set_return(reg, ph))
77 destroy_obj((Obj*)ph);
90 Rb_node do_find(WRegion *reg)
98 node=rb_find_pkey_n(retrb, reg, &found);
100 return (found ? node : NULL);
104 WPHolder *region_do_get_return(WRegion *reg)
106 Rb_node node=do_find(reg);
108 return (node!=NULL ? (WPHolder*)node->v.val : NULL);
112 WPHolder *region_get_return(WRegion *reg)
114 /* Should managers be scanned? */
115 return region_do_get_return(reg);
125 static WPHolder *do_remove_node(Rb_node node)
127 WPHolder *ph=(WPHolder*)node->v.val;
129 rb_delete_node(node);
135 WPHolder *region_unset_get_return(WRegion *reg)
142 region_notify_change(reg, ioncore_g.notifies.unset_return);
143 return do_remove_node(node);
150 void region_unset_return(WRegion *reg)
152 WPHolder *ph=region_unset_get_return(reg);
155 mainloop_defer_destroy((Obj*)ph);