1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
/*
* ion/ioncore/return.h
*
* Copyright (c) Tuomo Valkonen 1999-2007.
*
* See the included file LICENSE for details.
*/
#include <libtu/rb.h>
#include <libmainloop/defer.h>
#include "common.h"
#include "global.h"
#include "region.h"
#include "pholder.h"
#include "return.h"
/*{{{ Storage tree */
static Rb_node retrb=NULL;
/*}}}*/
/*{{{ Set */
bool region_do_set_return(WRegion *reg, WPHolder *ph)
{
Rb_node node;
assert(!OBJ_IS_BEING_DESTROYED(reg));
region_unset_return(reg);
if(retrb==NULL){
retrb=make_rb();
if(retrb==NULL)
return FALSE;
}
node=rb_insertp(retrb, reg, ph);
region_notify_change(reg, ioncore_g.notifies.set_return);
return (node!=NULL);
}
WPHolder *region_make_return_pholder(WRegion *reg)
{
WRegion *mgr=region_manager(reg);
if(mgr==NULL)
return NULL;
return region_managed_get_pholder(mgr, reg);
}
/*
extern WPHolder *region_set_return(WRegion *reg)
{
WPHolder *ph=region_make_return_pholder(reg);
if(ph!=NULL){
if(region_do_set_return(reg, ph))
return ph;
destroy_obj((Obj*)ph);
}
return NULL;
}
*/
/*}}}*/
/*{{{ Get */
Rb_node do_find(WRegion *reg)
{
int found=0;
Rb_node node;
if(retrb==NULL)
return NULL;
node=rb_find_pkey_n(retrb, reg, &found);
return (found ? node : NULL);
}
WPHolder *region_do_get_return(WRegion *reg)
{
Rb_node node=do_find(reg);
return (node!=NULL ? (WPHolder*)node->v.val : NULL);
}
WPHolder *region_get_return(WRegion *reg)
{
/* Should managers be scanned? */
return region_do_get_return(reg);
}
/*}}}*/
/*{{{ Unset */
static WPHolder *do_remove_node(Rb_node node)
{
WPHolder *ph=(WPHolder*)node->v.val;
rb_delete_node(node);
return ph;
}
WPHolder *region_unset_get_return(WRegion *reg)
{
Rb_node node;
node=do_find(reg);
if(node!=NULL){
region_notify_change(reg, ioncore_g.notifies.unset_return);
return do_remove_node(node);
}else{
return NULL;
}
}
void region_unset_return(WRegion *reg)
{
WPHolder *ph=region_unset_get_return(reg);
if(ph!=NULL)
mainloop_defer_destroy((Obj*)ph);
}
/*}}}*/
|