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