Subversion Repositories HelenOS

Rev

Rev 2336 | Rev 2421 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2336 Rev 2416
Line 53... Line 53...
53
 */
53
 */
54
void timeout_init(void)
54
void timeout_init(void)
55
{
55
{
56
    spinlock_initialize(&CPU->timeoutlock, "timeout_lock");
56
    spinlock_initialize(&CPU->timeoutlock, "timeout_lock");
57
 
57
 
-
 
58
#if defined CONFIG_TIMEOUT_AVL_TREE
-
 
59
    avltree_create(&CPU->timeout_active_tree);
58
#ifdef CONFIG_TIMEOUT_EXTAVL_TREE
60
#elif defined CONFIG_TIMEOUT_EXTAVL_TREE
59
    extavltree_create(&CPU->timeout_active_tree);
61
    extavltree_create(&CPU->timeout_active_tree);
-
 
62
#elif defined CONFIG_TIMEOUT_EXTAVL_TREE
-
 
63
    extavlreltree_create(&CPU->timeout_active_tree);
60
#else
64
#else
61
    list_initialize(&CPU->timeout_active_head);
65
    list_initialize(&CPU->timeout_active_head);
62
#endif
66
#endif
63
}
67
}
64
 
68
 
Line 73... Line 77...
73
void timeout_reinitialize(timeout_t *t)
77
void timeout_reinitialize(timeout_t *t)
74
{
78
{
75
    t->cpu = NULL;
79
    t->cpu = NULL;
76
    t->handler = NULL;
80
    t->handler = NULL;
77
    t->arg = NULL;
81
    t->arg = NULL;
78
   
82
 
-
 
83
#if defined CONFIG_TIMEOUT_AVL_TREE
-
 
84
    avltree_node_initialize(&t->node);
79
#ifdef CONFIG_TIMEOUT_EXTAVL_TREE
85
#elif defined CONFIG_TIMEOUT_EXTAVL_TREE
80
    extavltree_node_initialize(&t->node);
86
    extavltree_node_initialize(&t->node);
-
 
87
#elif defined CONFIG_TIMEOUT_EXTAVLREL_TREE
-
 
88
    extavlreltree_node_initialize(&t->node);
81
#else
89
#else
82
    t->ticks = 0;
90
    t->ticks = 0;
83
    link_initialize(&t->link);
91
    link_initialize(&t->link);
84
#endif
92
#endif
85
}
93
}
Line 96... Line 104...
96
{
104
{
97
    spinlock_initialize(&t->lock, "timeout_t_lock");
105
    spinlock_initialize(&t->lock, "timeout_t_lock");
98
    timeout_reinitialize(t);
106
    timeout_reinitialize(t);
99
}
107
}
100
 
108
 
-
 
109
#if defined CONFIG_TIMEOUT_AVL_TREE || \
-
 
110
    defined CONFIG_TIMEOUT_EXTAVL_TREE || \
101
#ifdef CONFIG_TIMEOUT_EXTAVL_TREE
111
    defined CONFIG_TIMEOUT_EXTAVLREL_TREE
-
 
112
 
102
/** Register timeout
113
/** Register timeout
103
 *
114
 *
104
 * Insert timeout handler f (with argument arg)
115
 * Insert timeout handler f (with argument arg)
105
 * to timeout list and make it execute in
116
 * to timeout ExtAVL tree and make it execute in
106
 * time microseconds (or slightly more).
117
 * time microseconds (or slightly more).
107
 *
118
 *
108
 * @param t    Timeout structure.
119
 * @param t    Timeout structure.
109
 * @param time Number of usec in the future to execute
120
 * @param time Number of usec in the future to execute
110
 *             the handler.
121
 *             the handler.
Line 122... Line 133...
122
 
133
 
123
    if (t->cpu)
134
    if (t->cpu)
124
        panic("t->cpu != 0");
135
        panic("t->cpu != 0");
125
   
136
   
126
    t->cpu = CPU;
137
    t->cpu = CPU;
127
   
-
 
128
    //tiky nejsou, musim zmenit klice primo v uzlech
-
 
129
   
-
 
130
    t->handler = f;
138
    t->handler = f;
131
    t->arg = arg;
139
    t->arg = arg;
-
 
140
    t->node.key = us2ticks(time);
132
 
141
 
-
 
142
    /*
-
 
143
     * Put timeout into tree structure.
-
 
144
     */
-
 
145
#if defined CONFIG_TIMEOUT_AVL_TREE
-
 
146
    avltree_insert(&CPU->timeout_active_tree,&t->node);
-
 
147
#elif defined CONFIG_TIMEOUT_EXTAVL_TREE
133
    extavltree_insert(&CPU->timeout_active_tree,&t->node);
148
    extavltree_insert(&CPU->timeout_active_tree,&t->node);
-
 
149
#elif defined CONFIG_TIMEOUT_EXTAVLREL_TREE
-
 
150
    extavlreltree_insert(&CPU->timeout_active_tree,&t->node);
-
 
151
#endif
134
   
152
 
135
    spinlock_unlock(&t->lock);
153
    spinlock_unlock(&t->lock);
136
    spinlock_unlock(&CPU->timeoutlock);
154
    spinlock_unlock(&CPU->timeoutlock);
137
    interrupts_restore(ipl);
155
    interrupts_restore(ipl);
138
}
156
}
139
 
157
 
140
 
158
 
141
/** Unregister timeout
159
/** Unregister timeout
142
 *
160
 *
143
 * Remove timeout from timeout list.
161
 * Remove timeout from timeout ExtAVL tree structure.
144
 *
162
 *
145
 * @param t Timeout to unregister.
163
 * @param t Timeout to unregister.
146
 *
164
 *
147
 * @return true on success, false on failure.
165
 * @return true on success, false on failure.
148
 */
166
 */
Line 161... Line 179...
161
    if (!spinlock_trylock(&t->cpu->timeoutlock)) {
179
    if (!spinlock_trylock(&t->cpu->timeoutlock)) {
162
        spinlock_unlock(&t->lock);
180
        spinlock_unlock(&t->lock);
163
        interrupts_restore(ipl);       
181
        interrupts_restore(ipl);       
164
        goto grab_locks;
182
        goto grab_locks;
165
    }
183
    }
166
   
-
 
167
    /*
184
    /*
168
     * Now we know for sure that t hasn't been activated yet
185
     * Now we know for sure that t hasn't been activated yet
169
     * and is lurking in t->cpu->timeout_active_head queue.
186
     * and is lurking in t->cpu->timeout_active_head queue.
170
     */
187
     */
171
 
188
 
-
 
189
    /*
-
 
190
     * Delete timeout from tree structure.
-
 
191
     */
-
 
192
#if defined CONFIG_TIMEOUT_AVL_TREE
-
 
193
    avltree_delete(&CPU->timeout_active_tree,&t->node);
-
 
194
#elif defined CONFIG_TIMEOUT_EXTAVL_TREE
172
    extavltree_delete(&CPU->timeout_active_tree,&t->node);
195
    extavltree_delete(&CPU->timeout_active_tree,&t->node);
-
 
196
#elif defined CONFIG_TIMEOUT_EXTAVLREL_TREE
-
 
197
    extavlreltree_delete(&CPU->timeout_active_tree,&t->node);
-
 
198
#endif
173
   
199
 
174
    spinlock_unlock(&t->cpu->timeoutlock);
200
    spinlock_unlock(&t->cpu->timeoutlock);
175
 
201
 
176
    timeout_reinitialize(t);
202
    timeout_reinitialize(t);
177
    spinlock_unlock(&t->lock);
203
    spinlock_unlock(&t->lock);
178
 
204