Simplify alarm API.
This change removes a corner case that needs to be handled (what happens if you
add an alarm twice?). This corner case was never used, nor tested.
Change on 2014/12/15 by ctiller <ctiller@google.com>
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=82168179
diff --git a/src/core/channel/client_setup.c b/src/core/channel/client_setup.c
index 8060b2a..562f284 100644
--- a/src/core/channel/client_setup.c
+++ b/src/core/channel/client_setup.c
@@ -212,11 +212,11 @@
/* TODO(klempner): Replace these values with further consideration. 2x is
probably too aggressive of a backoff. */
gpr_timespec max_backoff = gpr_time_from_minutes(2);
+ gpr_timespec deadline =
+ gpr_time_add(s->current_backoff_interval, gpr_now());
GPR_ASSERT(!s->in_alarm);
s->in_alarm = 1;
- grpc_alarm_init(&s->backoff_alarm, backoff_alarm_done, s);
- grpc_alarm_add(&s->backoff_alarm,
- gpr_time_add(s->current_backoff_interval, gpr_now()));
+ grpc_alarm_init(&s->backoff_alarm, deadline, backoff_alarm_done, s);
s->current_backoff_interval =
gpr_time_add(s->current_backoff_interval, s->current_backoff_interval);
if (gpr_time_cmp(s->current_backoff_interval, max_backoff) > 0) {
diff --git a/src/core/iomgr/alarm.h b/src/core/iomgr/alarm.h
index 5bd00d9..e09f165 100644
--- a/src/core/iomgr/alarm.h
+++ b/src/core/iomgr/alarm.h
@@ -50,9 +50,10 @@
canceled (CANCELLED). alarm_cb is guaranteed to be called exactly once,
and application code should check the status to determine how it was
invoked. The application callback is also responsible for maintaining
- information about when to free up any user-level state. */
-void grpc_alarm_init(grpc_alarm *alarm, grpc_iomgr_cb_func alarm_cb,
- void *alarm_cb_arg);
+ information about when to free up any user-level state.
+ Returns 1 on success, 0 on failure. */
+int grpc_alarm_init(grpc_alarm *alarm, gpr_timespec deadline,
+ grpc_iomgr_cb_func alarm_cb, void *alarm_cb_arg);
/* Note that there is no alarm destroy function. This is because the
alarm is a one-time occurrence with a guarantee that the callback will
@@ -62,12 +63,6 @@
the alarm, the user is responsible for determining when it is safe to
destroy that state. */
-/* Schedule *alarm to expire at deadline. If *alarm is
- re-added before expiration, the *delay is simply reset to the new value.
- Return GRPC_EM_OK on success, or GRPC_EM_ERROR on failure.
- Upon failure, caller should abort further operations on *alarm */
-int grpc_alarm_add(grpc_alarm *alarm, gpr_timespec deadline);
-
/* Cancel an *alarm.
There are three cases:
1. We normally cancel the alarm
diff --git a/src/core/iomgr/iomgr_libevent.c b/src/core/iomgr/iomgr_libevent.c
index 4d2fe4c..488452c 100644
--- a/src/core/iomgr/iomgr_libevent.c
+++ b/src/core/iomgr/iomgr_libevent.c
@@ -361,29 +361,18 @@
}
}
-void grpc_alarm_init(grpc_alarm *alarm, grpc_iomgr_cb_func alarm_cb,
- void *alarm_cb_arg) {
+int grpc_alarm_init(grpc_alarm *alarm, gpr_timespec deadline,
+ grpc_iomgr_cb_func alarm_cb, void *alarm_cb_arg) {
grpc_libevent_activation_data *adata =
&alarm->task.activation[GRPC_EM_TA_ONLY];
+ gpr_timespec delay_timespec = gpr_time_sub(deadline, gpr_now());
+ struct timeval delay = gpr_timeval_from_timespec(delay_timespec);
alarm->task.type = GRPC_EM_TASK_ALARM;
gpr_atm_rel_store(&alarm->triggered, ALARM_TRIGGER_INIT);
adata->cb = alarm_cb;
adata->arg = alarm_cb_arg;
adata->prev = NULL;
adata->next = NULL;
- adata->ev = NULL;
-}
-
-int grpc_alarm_add(grpc_alarm *alarm, gpr_timespec deadline) {
- grpc_libevent_activation_data *adata =
- &alarm->task.activation[GRPC_EM_TA_ONLY];
- gpr_timespec delay_timespec = gpr_time_sub(deadline, gpr_now());
- struct timeval delay = gpr_timeval_from_timespec(delay_timespec);
- if (adata->ev) {
- event_free(adata->ev);
- gpr_log(GPR_INFO, "Adding an alarm that already has an event.");
- adata->ev = NULL;
- }
adata->ev = evtimer_new(g_event_base, libevent_alarm_cb, alarm);
/* Set the trigger field to untriggered. Do this as the last store since
it is a release of previous stores. */
diff --git a/src/core/surface/call.c b/src/core/surface/call.c
index d9d157c..a9509ac 100644
--- a/src/core/surface/call.c
+++ b/src/core/surface/call.c
@@ -868,6 +868,5 @@
}
grpc_call_internal_ref(call);
call->have_alarm = 1;
- grpc_alarm_init(&call->alarm, call_alarm, call);
- grpc_alarm_add(&call->alarm, deadline);
+ grpc_alarm_init(&call->alarm, deadline, call_alarm, call);
}
diff --git a/test/core/iomgr/alarm_test.c b/test/core/iomgr/alarm_test.c
index 0dcd214..afc0768 100644
--- a/test/core/iomgr/alarm_test.c
+++ b/test/core/iomgr/alarm_test.c
@@ -116,8 +116,7 @@
gpr_cv_init(&arg.cv);
gpr_event_init(&arg.fcb_arg);
- grpc_alarm_init(&alarm, alarm_cb, &arg);
- grpc_alarm_add(&alarm, gpr_time_add(tv0, gpr_now()));
+ grpc_alarm_init(&alarm, gpr_time_add(tv0, gpr_now()), alarm_cb, &arg);
alarm_deadline = gpr_time_add(gpr_now(), tv1);
gpr_mu_lock(&arg.mu);
@@ -162,8 +161,8 @@
gpr_cv_init(&arg2.cv);
gpr_event_init(&arg2.fcb_arg);
- grpc_alarm_init(&alarm_to_cancel, alarm_cb, &arg2);
- grpc_alarm_add(&alarm_to_cancel, gpr_time_add(tv2, gpr_now()));
+ grpc_alarm_init(&alarm_to_cancel, gpr_time_add(tv2, gpr_now()), alarm_cb,
+ &arg2);
grpc_alarm_cancel(&alarm_to_cancel);
alarm_deadline = gpr_time_add(gpr_now(), tv1);