Add timer delete support to rild

Change-Id: Ia862f4cac116bf1ee98788c004860cdb2c70f356
diff --git a/include/telephony/ril.h b/include/telephony/ril.h
index 4b53f6b..0e117ac 100644
--- a/include/telephony/ril.h
+++ b/include/telephony/ril.h
@@ -3464,8 +3464,14 @@
      * soon as possible
      */
 
-    void (*RequestTimedCallback) (RIL_TimedCallback callback,
+    void* (*RequestTimedCallback) (RIL_TimedCallback callback,
                                    void *param, const struct timeval *relativeTime);
+
+
+    /**
+     * Remove user-specified callback function
+     */
+    void (*RemoveTimedCallback) (void *callbackInfo);
 };
 
 
@@ -3529,8 +3535,15 @@
  * @param relativeTime a relative time value at which the callback is invoked
  */
 
-void RIL_requestTimedCallback (RIL_TimedCallback callback,
-                               void *param, const struct timeval *relativeTime);
+void* RIL_requestTimedCallback (RIL_TimedCallback callback,
+                                void *param, const struct timeval *relativeTime);
+
+/**
+ * Remove user-specified callback function
+ *  @param callbackInfo  Pointer returned to the caller when timer was scheduled
+ */
+
+void RIL_removeTimedCallback(void *callbackInfo);
 
 
 #endif /* RIL_SHLIB */
diff --git a/libril/ril.cpp b/libril/ril.cpp
index a7fbaa1..07bf0fa 100644
--- a/libril/ril.cpp
+++ b/libril/ril.cpp
@@ -142,7 +142,6 @@
     struct UserCallbackInfo *p_next;
 } UserCallbackInfo;
 
-
 /*******************************************************************/
 
 RIL_RadioFunctions s_callbacks = {0, NULL, NULL, NULL, NULL, NULL};
@@ -240,8 +239,9 @@
 #endif
 
 static UserCallbackInfo * internalRequestTimedCallback
-    (RIL_TimedCallback callback, void *param,
-        const struct timeval *relativeTime);
+    (RIL_TimedCallback callback, void *param, const struct timeval *relativeTime);
+
+static void internalRemoveTimedCallback(void *callbackInfo);
 
 /** Index == requestNumber */
 static CommandInfo s_commands[] = {
@@ -2862,7 +2862,7 @@
 */
 static UserCallbackInfo *
 internalRequestTimedCallback (RIL_TimedCallback callback, void *param,
-                                const struct timeval *relativeTime)
+                              const struct timeval *relativeTime)
 {
     struct timeval myRelativeTime;
     UserCallbackInfo *p_info;
@@ -2871,7 +2871,6 @@
 
     p_info->p_callback = callback;
     p_info->userParam = param;
-
     if (relativeTime == NULL) {
         /* treat null parameter as a 0 relative time */
         memset (&myRelativeTime, 0, sizeof(myRelativeTime));
@@ -2888,11 +2887,27 @@
     return p_info;
 }
 
+static void
+internalRemoveTimedCallback(void *callbackInfo)
+{
+    UserCallbackInfo *p_info;
+    p_info = (UserCallbackInfo *)callbackInfo;
+    LOGI("remove timer callback event");
+    if(p_info) {
+        ril_timer_delete(&(p_info->event));
+        free(p_info);
+    }
+}
 
-extern "C" void
+extern "C" void *
 RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
                                 const struct timeval *relativeTime) {
-    internalRequestTimedCallback (callback, param, relativeTime);
+   return internalRequestTimedCallback (callback, param, relativeTime);
+}
+
+extern "C" void
+RIL_removeTimedCallback (void *callbackInfo) {
+    internalRemoveTimedCallback(callbackInfo);
 }
 
 const char *
diff --git a/libril/ril_event.cpp b/libril/ril_event.cpp
index e40e72b..c24c655 100644
--- a/libril/ril_event.cpp
+++ b/libril/ril_event.cpp
@@ -312,13 +312,23 @@
     dlog("~~~~ -ril_timer_add ~~~~");
 }
 
+// Remove event from timer list
+void ril_timer_delete(struct ril_event *tev)
+{
+    dlog("~~~~timer event delete=%x",(unsigned int)tev);
+    MUTEX_ACQUIRE();
+    removeFromList(tev);
+    MUTEX_RELEASE();
+}
+
 // Remove event from watch or timer list
 void ril_event_del(struct ril_event * ev)
 {
-    dlog("~~~~ +ril_event_del ~~~~");
+    dlog("~~~~ +ril_event_del event= %x ~~~~", (unsigned int)ev);
     MUTEX_ACQUIRE();
 
     if (ev->index < 0 || ev->index >= MAX_FD_EVENTS) {
+        MUTEX_RELEASE();
         return;
     }
 
diff --git a/libril/ril_event.h b/libril/ril_event.h
index 7ba231b..2b9980a 100644
--- a/libril/ril_event.h
+++ b/libril/ril_event.h
@@ -47,6 +47,9 @@
 // Remove event from watch list
 void ril_event_del(struct ril_event * ev);
 
+// Remove event from timer list
+void ril_timer_delete(struct ril_event * ev);
+
 // Event loop
 void ril_event_loop();
 
diff --git a/rild/rild.c b/rild/rild.c
index 14a6ea9..df78539 100644
--- a/rild/rild.c
+++ b/rild/rild.c
@@ -52,14 +52,16 @@
 extern void RIL_onUnsolicitedResponse(int unsolResponse, const void *data,
                                 size_t datalen);
 
-extern void RIL_requestTimedCallback (RIL_TimedCallback callback,
+extern void* RIL_requestTimedCallback (RIL_TimedCallback callback,
                                void *param, const struct timeval *relativeTime);
 
+extern void RIL_removeTimedCallback(void *callbackInfo);
 
 static struct RIL_Env s_rilEnv = {
     RIL_onRequestComplete,
     RIL_onUnsolicitedResponse,
-    RIL_requestTimedCallback
+    RIL_requestTimedCallback,
+    RIL_removeTimedCallback
 };
 
 extern void RIL_startEventLoop();