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