4 * Copyright (c) Tuomo Valkonen 1999-2009.
6 * See the included file LICENSE for details.
10 #include <libmainloop/defer.h>
22 static Rb_node retrb
=NULL
;
32 bool region_do_set_return(WRegion
*reg
, WPHolder
*ph
)
36 assert(!OBJ_IS_BEING_DESTROYED(reg
));
38 region_unset_return(reg
);
46 node
=rb_insertp(retrb
, reg
, ph
);
48 region_notify_change(reg
, ioncore_g
.notifies
.set_return
);
54 WPHolder
*region_make_return_pholder(WRegion
*reg
)
56 WRegion
*mgr
=region_manager(reg
);
61 return region_managed_get_pholder(mgr
, reg
);
66 extern WPHolder *region_set_return(WRegion *reg)
68 WPHolder *ph=region_make_return_pholder(reg);
71 if(region_do_set_return(reg, ph))
73 destroy_obj((Obj*)ph);
86 Rb_node
do_find(WRegion
*reg
)
94 node
=rb_find_pkey_n(retrb
, reg
, &found
);
96 return (found
? node
: NULL
);
100 WPHolder
*region_do_get_return(WRegion
*reg
)
102 Rb_node node
=do_find(reg
);
104 return (node
!=NULL
? (WPHolder
*)node
->v
.val
: NULL
);
108 WPHolder
*region_get_return(WRegion
*reg
)
110 /* Should managers be scanned? */
111 return region_do_get_return(reg
);
121 static WPHolder
*do_remove_node(Rb_node node
)
123 WPHolder
*ph
=(WPHolder
*)node
->v
.val
;
125 rb_delete_node(node
);
131 WPHolder
*region_unset_get_return(WRegion
*reg
)
138 region_notify_change(reg
, ioncore_g
.notifies
.unset_return
);
139 return do_remove_node(node
);
146 void region_unset_return(WRegion
*reg
)
148 WPHolder
*ph
=region_unset_get_return(reg
);
151 mainloop_defer_destroy((Obj
*)ph
);
158 /*{{{ Internal Lua exports */
163 WRegion
*region___return_target(WRegion
*reg
)
165 WPHolder
*ph
=region_get_return(reg
);
166 return (ph
!=NULL
? pholder_target(ph
) : NULL
);