]> git.proxmox.com Git - mirror_ovs.git/blame - ovsdb/trigger.c
ovsdb-idlc: Make generated references to table classes easier to read.
[mirror_ovs.git] / ovsdb / trigger.c
CommitLineData
b4e8d170 1/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
f85f8ebb
BP
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <config.h>
17
18#include "trigger.h"
19
f85f8ebb
BP
20#include <limits.h>
21
ee89ea7b 22#include "openvswitch/json.h"
f85f8ebb
BP
23#include "jsonrpc.h"
24#include "ovsdb.h"
25#include "poll-loop.h"
e317253b 26#include "server.h"
f85f8ebb 27
e317253b 28static bool ovsdb_trigger_try(struct ovsdb_trigger *, long long int now);
f85f8ebb
BP
29static void ovsdb_trigger_complete(struct ovsdb_trigger *);
30
31void
b4e8d170 32ovsdb_trigger_init(struct ovsdb_session *session, struct ovsdb *db,
e317253b 33 struct ovsdb_trigger *trigger,
e51879e9
AZ
34 struct json *request, long long int now,
35 bool read_only)
f85f8ebb 36{
e317253b 37 trigger->session = session;
b4e8d170 38 trigger->db = db;
417e7e66 39 ovs_list_push_back(&trigger->db->triggers, &trigger->node);
f85f8ebb
BP
40 trigger->request = request;
41 trigger->result = NULL;
42 trigger->created = now;
43 trigger->timeout_msec = LLONG_MAX;
e51879e9 44 trigger->read_only = read_only;
e317253b 45 ovsdb_trigger_try(trigger, now);
f85f8ebb
BP
46}
47
48void
49ovsdb_trigger_destroy(struct ovsdb_trigger *trigger)
50{
417e7e66 51 ovs_list_remove(&trigger->node);
f85f8ebb
BP
52 json_destroy(trigger->request);
53 json_destroy(trigger->result);
54}
55
56bool
57ovsdb_trigger_is_complete(const struct ovsdb_trigger *trigger)
58{
59 return trigger->result != NULL;
60}
61
62struct json *
63ovsdb_trigger_steal_result(struct ovsdb_trigger *trigger)
64{
65 struct json *result = trigger->result;
66 trigger->result = NULL;
67 return result;
68}
69
70void
71ovsdb_trigger_run(struct ovsdb *db, long long int now)
72{
73 struct ovsdb_trigger *t, *next;
74 bool run_triggers;
75
76 run_triggers = db->run_triggers;
77 db->run_triggers = false;
4e8e4213 78 LIST_FOR_EACH_SAFE (t, next, node, &db->triggers) {
f85f8ebb 79 if (run_triggers || now - t->created >= t->timeout_msec) {
e317253b 80 ovsdb_trigger_try(t, now);
f85f8ebb
BP
81 }
82 }
83}
84
85void
86ovsdb_trigger_wait(struct ovsdb *db, long long int now)
87{
88 if (db->run_triggers) {
89 poll_immediate_wake();
90 } else {
91 long long int deadline = LLONG_MAX;
92 struct ovsdb_trigger *t;
93
4e8e4213 94 LIST_FOR_EACH (t, node, &db->triggers) {
f85f8ebb
BP
95 if (t->created < LLONG_MAX - t->timeout_msec) {
96 long long int t_deadline = t->created + t->timeout_msec;
97 if (deadline > t_deadline) {
98 deadline = t_deadline;
99 if (now >= deadline) {
100 break;
101 }
102 }
103 }
104 }
105
106 if (deadline < LLONG_MAX) {
7cf8b266 107 poll_timer_wait_until(deadline);
f85f8ebb
BP
108 }
109 }
110}
111
112static bool
e317253b 113ovsdb_trigger_try(struct ovsdb_trigger *t, long long int now)
f85f8ebb 114{
b4e8d170 115 t->result = ovsdb_execute(t->db, t->session,
e51879e9
AZ
116 t->request, t->read_only,
117 now - t->created, &t->timeout_msec);
f85f8ebb
BP
118 if (t->result) {
119 ovsdb_trigger_complete(t);
120 return true;
121 } else {
122 return false;
123 }
124}
125
126static void
127ovsdb_trigger_complete(struct ovsdb_trigger *t)
128{
cb22974d 129 ovs_assert(t->result != NULL);
417e7e66
BW
130 ovs_list_remove(&t->node);
131 ovs_list_push_back(&t->session->completions, &t->node);
f85f8ebb 132}