Re #1616: symbian port of ioqueue & timer

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@4374 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/build.symbian/pjlibU.def b/build.symbian/pjlibU.def
index 3ddcb40..6dbffdf 100644
--- a/build.symbian/pjlibU.def
+++ b/build.symbian/pjlibU.def
@@ -130,194 +130,197 @@
 	pj_ioqueue_recv                          @ 129 NONAME
 	pj_ioqueue_recvfrom                      @ 130 NONAME
 	pj_ioqueue_register_sock                 @ 131 NONAME
-	pj_ioqueue_send                          @ 132 NONAME
-	pj_ioqueue_sendto                        @ 133 NONAME
-	pj_ioqueue_set_lock                      @ 134 NONAME
-	pj_ioqueue_set_user_data                 @ 135 NONAME
-	pj_ioqueue_unregister                    @ 136 NONAME
-	pj_leave_critical_section                @ 137 NONAME
-	pj_list_erase                            @ 138 NONAME
-	pj_list_find_node                        @ 139 NONAME
-	pj_list_insert_after                     @ 140 NONAME
-	pj_list_insert_before                    @ 141 NONAME
-	pj_list_insert_nodes_after               @ 142 NONAME
-	pj_list_insert_nodes_before              @ 143 NONAME
-	pj_list_merge_first                      @ 144 NONAME
-	pj_list_merge_last                       @ 145 NONAME
-	pj_list_search                           @ 146 NONAME
-	pj_list_size                             @ 147 NONAME
-	pj_lock_acquire                          @ 148 NONAME
-	pj_lock_create_null_mutex                @ 149 NONAME
-	pj_lock_create_recursive_mutex           @ 150 NONAME
-	pj_lock_create_semaphore                 @ 151 NONAME
-	pj_lock_create_simple_mutex              @ 152 NONAME
-	pj_lock_destroy                          @ 153 NONAME
-	pj_lock_release                          @ 154 NONAME
-	pj_lock_tryacquire                       @ 155 NONAME
-	pj_log                                   @ 156 NONAME
-	pj_log_1                                 @ 157 NONAME
-	pj_log_2                                 @ 158 NONAME
-	pj_log_3                                 @ 159 NONAME
-	pj_log_4                                 @ 160 NONAME
-	pj_log_5                                 @ 161 NONAME
-	pj_log_get_decor                         @ 162 NONAME
-	pj_log_get_level                         @ 163 NONAME
-	pj_log_get_log_func                      @ 164 NONAME
-	pj_log_set_decor                         @ 165 NONAME
-	pj_log_set_level                         @ 166 NONAME
-	pj_log_set_log_func                      @ 167 NONAME
-	pj_log_write                             @ 168 NONAME
-	pj_mutex_create                          @ 169 NONAME
-	pj_mutex_create_recursive                @ 170 NONAME
-	pj_mutex_create_simple                   @ 171 NONAME
-	pj_mutex_destroy                         @ 172 NONAME
-	pj_mutex_lock                            @ 173 NONAME
-	pj_mutex_trylock                         @ 174 NONAME
-	pj_mutex_unlock                          @ 175 NONAME
-	pj_ntohl                                 @ 176 NONAME
-	pj_ntohs                                 @ 177 NONAME
-	pj_pool_alloc                            @ 178 NONAME
-	pj_pool_alloc_from_block                 @ 179 NONAME
-	pj_pool_allocate_find                    @ 180 NONAME
-	pj_pool_calloc                           @ 181 NONAME
-	pj_pool_create                           @ 182 NONAME
-	pj_pool_create_int                       @ 183 NONAME
-	pj_pool_create_on_buf                    @ 184 NONAME
-	pj_pool_destroy_int                      @ 185 NONAME
-	pj_pool_factory_default_policy           @ 186 NONAME
-	pj_pool_factory_get_default_policy       @ 187 NONAME
-	pj_pool_get_capacity                     @ 188 NONAME
-	pj_pool_get_used_size                    @ 189 NONAME
-	pj_pool_getobjname                       @ 190 NONAME
-	pj_pool_init_int                         @ 191 NONAME
-	pj_pool_release                          @ 192 NONAME
-	pj_pool_reset                            @ 193 NONAME
-	pj_rand                                  @ 194 NONAME
-	pj_rbtree_erase                          @ 195 NONAME
-	pj_rbtree_find                           @ 196 NONAME
-	pj_rbtree_first                          @ 197 NONAME
-	pj_rbtree_init                           @ 198 NONAME
-	pj_rbtree_insert                         @ 199 NONAME
-	pj_rbtree_last                           @ 200 NONAME
-	pj_rbtree_max_height                     @ 201 NONAME
-	pj_rbtree_min_height                     @ 202 NONAME
-	pj_rbtree_next                           @ 203 NONAME
-	pj_rbtree_prev                           @ 204 NONAME
-	pj_register_strerror                     @ 205 NONAME
-	pj_rwmutex_create                        @ 206 NONAME
-	pj_rwmutex_destroy                       @ 207 NONAME
-	pj_rwmutex_lock_read                     @ 208 NONAME
-	pj_rwmutex_lock_write                    @ 209 NONAME
-	pj_rwmutex_unlock_read                   @ 210 NONAME
-	pj_rwmutex_unlock_write                  @ 211 NONAME
-	pj_sem_create                            @ 212 NONAME
-	pj_sem_destroy                           @ 213 NONAME
-	pj_sem_post                              @ 214 NONAME
-	pj_sem_trywait                           @ 215 NONAME
-	pj_sem_wait                              @ 216 NONAME
-	pj_set_netos_error                       @ 217 NONAME
-	pj_set_os_error                          @ 218 NONAME
-	pj_shutdown                              @ 219 NONAME
-	pj_sock_accept                           @ 220 NONAME
-	pj_sock_bind                             @ 221 NONAME
-	pj_sock_bind_in                          @ 222 NONAME
-	pj_sock_close                            @ 223 NONAME
-	pj_sock_connect                          @ 224 NONAME
-	pj_sock_getpeername                      @ 225 NONAME
-	pj_sock_getsockname                      @ 226 NONAME
-	pj_sock_getsockopt                       @ 227 NONAME
-	pj_sock_listen                           @ 228 NONAME
-	pj_sock_recv                             @ 229 NONAME
-	pj_sock_recvfrom                         @ 230 NONAME
-	pj_sock_select                           @ 231 NONAME
-	pj_sock_send                             @ 232 NONAME
-	pj_sock_sendto                           @ 233 NONAME
-	pj_sock_setsockopt                       @ 234 NONAME
-	pj_sock_shutdown                         @ 235 NONAME
-	pj_sock_socket                           @ 236 NONAME
-	pj_sockaddr_cmp                          @ 237 NONAME
-	pj_sockaddr_copy_addr                    @ 238 NONAME
-	pj_sockaddr_get_addr                     @ 239 NONAME
-	pj_sockaddr_get_addr_len                 @ 240 NONAME
-	pj_sockaddr_get_len                      @ 241 NONAME
-	pj_sockaddr_get_port                     @ 242 NONAME
-	pj_sockaddr_has_addr                     @ 243 NONAME
-	pj_sockaddr_in_get_addr                  @ 244 NONAME
-	pj_sockaddr_in_get_port                  @ 245 NONAME
-	pj_sockaddr_in_init                      @ 246 NONAME
-	pj_sockaddr_in_set_addr                  @ 247 NONAME
-	pj_sockaddr_in_set_port                  @ 248 NONAME
-	pj_sockaddr_in_set_str_addr              @ 249 NONAME
-	pj_sockaddr_init                         @ 250 NONAME
-	pj_sockaddr_print                        @ 251 NONAME
-	pj_sockaddr_set_port                     @ 252 NONAME
-	pj_sockaddr_set_str_addr                 @ 253 NONAME
-	pj_srand                                 @ 254 NONAME
-	pj_str                                   @ 255 NONAME
-	pj_strassign                             @ 256 NONAME
-	pj_strcat                                @ 257 NONAME
-	pj_strcat2                               @ 258 NONAME
-	pj_strcmp                                @ 259 NONAME
-	pj_strcmp2                               @ 260 NONAME
-	pj_strcpy                                @ 261 NONAME
-	pj_strcpy2                               @ 262 NONAME
-	pj_strdup                                @ 263 NONAME
-	pj_strdup2                               @ 264 NONAME
-	pj_strdup2_with_null                     @ 265 NONAME
-	pj_strdup3                               @ 266 NONAME
-	pj_strdup_with_null                      @ 267 NONAME
-	pj_strerror                              @ 268 NONAME
-	pj_stricmp                               @ 269 NONAME
-	pj_stricmp2                              @ 270 NONAME
-	pj_strltrim                              @ 271 NONAME
-	pj_strncmp                               @ 272 NONAME
-	pj_strncmp2                              @ 273 NONAME
-	pj_strncpy                               @ 274 NONAME
-	pj_strncpy_with_null                     @ 275 NONAME
-	pj_strnicmp                              @ 276 NONAME
-	pj_strnicmp2                             @ 277 NONAME
-	pj_strrtrim                              @ 278 NONAME
-	pj_strtoul                               @ 279 NONAME
-	pj_strtoul2                              @ 280 NONAME
-	pj_strtrim                               @ 281 NONAME
-	pj_symbianos_poll                        @ 282 NONAME
-	pj_symbianos_set_params                  @ 283 NONAME
-	pj_thread_check_stack                    @ 284 NONAME
-	pj_thread_create                         @ 285 NONAME
-	pj_thread_destroy                        @ 286 NONAME
-	pj_thread_get_name                       @ 287 NONAME
-	pj_thread_get_os_handle                  @ 288 NONAME
-	pj_thread_get_stack_info                 @ 289 NONAME
-	pj_thread_get_stack_max_usage            @ 290 NONAME
-	pj_thread_is_registered                  @ 291 NONAME
-	pj_thread_join                           @ 292 NONAME
-	pj_thread_local_alloc                    @ 293 NONAME
-	pj_thread_local_free                     @ 294 NONAME
-	pj_thread_local_get                      @ 295 NONAME
-	pj_thread_local_set                      @ 296 NONAME
-	pj_thread_register                       @ 297 NONAME
-	pj_thread_resume                         @ 298 NONAME
-	pj_thread_sleep                          @ 299 NONAME
-	pj_thread_this                           @ 300 NONAME
-	pj_time_decode                           @ 301 NONAME
-	pj_time_encode                           @ 302 NONAME
-	pj_time_gmt_to_local                     @ 303 NONAME
-	pj_time_local_to_gmt                     @ 304 NONAME
-	pj_time_val_normalize                    @ 305 NONAME
-	pj_timer_entry_init                      @ 306 NONAME
-	pj_timer_heap_cancel                     @ 307 NONAME
-	pj_timer_heap_count                      @ 308 NONAME
-	pj_timer_heap_create                     @ 309 NONAME
-	pj_timer_heap_destroy                    @ 310 NONAME
-	pj_timer_heap_earliest_time              @ 311 NONAME
-	pj_timer_heap_mem_size                   @ 312 NONAME
-	pj_timer_heap_poll                       @ 313 NONAME
-	pj_timer_heap_schedule                   @ 314 NONAME
-	pj_timer_heap_set_lock                   @ 315 NONAME
-	pj_timer_heap_set_max_timed_out_per_poll @ 316 NONAME
-	pj_unicode_to_ansi                       @ 317 NONAME
-	pj_utoa                                  @ 318 NONAME
-	pj_utoa_pad                              @ 319 NONAME
-	platform_strerror                        @ 320 NONAME
-	snprintf                                 @ 321 NONAME
-	vsnprintf                                @ 322 NONAME
+	pj_ioqueue_register_sock2                @ 132 NONAME
+	pj_ioqueue_send                          @ 133 NONAME
+	pj_ioqueue_sendto                        @ 134 NONAME
+	pj_ioqueue_set_lock                      @ 135 NONAME
+	pj_ioqueue_set_user_data                 @ 136 NONAME
+	pj_ioqueue_unregister                    @ 137 NONAME
+	pj_leave_critical_section                @ 138 NONAME
+	pj_list_erase                            @ 139 NONAME
+	pj_list_find_node                        @ 140 NONAME
+	pj_list_insert_after                     @ 141 NONAME
+	pj_list_insert_before                    @ 142 NONAME
+	pj_list_insert_nodes_after               @ 143 NONAME
+	pj_list_insert_nodes_before              @ 144 NONAME
+	pj_list_merge_first                      @ 145 NONAME
+	pj_list_merge_last                       @ 146 NONAME
+	pj_list_search                           @ 147 NONAME
+	pj_list_size                             @ 148 NONAME
+	pj_lock_acquire                          @ 149 NONAME
+	pj_lock_create_null_mutex                @ 150 NONAME
+	pj_lock_create_recursive_mutex           @ 151 NONAME
+	pj_lock_create_semaphore                 @ 152 NONAME
+	pj_lock_create_simple_mutex              @ 153 NONAME
+	pj_lock_destroy                          @ 154 NONAME
+	pj_lock_release                          @ 155 NONAME
+	pj_lock_tryacquire                       @ 156 NONAME
+	pj_log                                   @ 157 NONAME
+	pj_log_1                                 @ 158 NONAME
+	pj_log_2                                 @ 159 NONAME
+	pj_log_3                                 @ 160 NONAME
+	pj_log_4                                 @ 161 NONAME
+	pj_log_5                                 @ 162 NONAME
+	pj_log_get_decor                         @ 163 NONAME
+	pj_log_get_level                         @ 164 NONAME
+	pj_log_get_log_func                      @ 165 NONAME
+	pj_log_set_decor                         @ 166 NONAME
+	pj_log_set_level                         @ 167 NONAME
+	pj_log_set_log_func                      @ 168 NONAME
+	pj_log_write                             @ 169 NONAME
+	pj_mutex_create                          @ 170 NONAME
+	pj_mutex_create_recursive                @ 171 NONAME
+	pj_mutex_create_simple                   @ 172 NONAME
+	pj_mutex_destroy                         @ 173 NONAME
+	pj_mutex_lock                            @ 174 NONAME
+	pj_mutex_trylock                         @ 175 NONAME
+	pj_mutex_unlock                          @ 176 NONAME
+	pj_ntohl                                 @ 177 NONAME
+	pj_ntohs                                 @ 178 NONAME
+	pj_pool_alloc                            @ 179 NONAME
+	pj_pool_alloc_from_block                 @ 180 NONAME
+	pj_pool_allocate_find                    @ 181 NONAME
+	pj_pool_calloc                           @ 182 NONAME
+	pj_pool_create                           @ 183 NONAME
+	pj_pool_create_int                       @ 184 NONAME
+	pj_pool_create_on_buf                    @ 185 NONAME
+	pj_pool_destroy_int                      @ 186 NONAME
+	pj_pool_factory_default_policy           @ 187 NONAME
+	pj_pool_factory_get_default_policy       @ 188 NONAME
+	pj_pool_get_capacity                     @ 189 NONAME
+	pj_pool_get_used_size                    @ 190 NONAME
+	pj_pool_getobjname                       @ 191 NONAME
+	pj_pool_init_int                         @ 192 NONAME
+	pj_pool_release                          @ 193 NONAME
+	pj_pool_reset                            @ 194 NONAME
+	pj_rand                                  @ 195 NONAME
+	pj_rbtree_erase                          @ 196 NONAME
+	pj_rbtree_find                           @ 197 NONAME
+	pj_rbtree_first                          @ 198 NONAME
+	pj_rbtree_init                           @ 199 NONAME
+	pj_rbtree_insert                         @ 200 NONAME
+	pj_rbtree_last                           @ 201 NONAME
+	pj_rbtree_max_height                     @ 202 NONAME
+	pj_rbtree_min_height                     @ 203 NONAME
+	pj_rbtree_next                           @ 204 NONAME
+	pj_rbtree_prev                           @ 205 NONAME
+	pj_register_strerror                     @ 206 NONAME
+	pj_rwmutex_create                        @ 207 NONAME
+	pj_rwmutex_destroy                       @ 208 NONAME
+	pj_rwmutex_lock_read                     @ 209 NONAME
+	pj_rwmutex_lock_write                    @ 210 NONAME
+	pj_rwmutex_unlock_read                   @ 211 NONAME
+	pj_rwmutex_unlock_write                  @ 212 NONAME
+	pj_sem_create                            @ 213 NONAME
+	pj_sem_destroy                           @ 214 NONAME
+	pj_sem_post                              @ 215 NONAME
+	pj_sem_trywait                           @ 216 NONAME
+	pj_sem_wait                              @ 217 NONAME
+	pj_set_netos_error                       @ 218 NONAME
+	pj_set_os_error                          @ 219 NONAME
+	pj_shutdown                              @ 220 NONAME
+	pj_sock_accept                           @ 221 NONAME
+	pj_sock_bind                             @ 222 NONAME
+	pj_sock_bind_in                          @ 223 NONAME
+	pj_sock_close                            @ 224 NONAME
+	pj_sock_connect                          @ 225 NONAME
+	pj_sock_getpeername                      @ 226 NONAME
+	pj_sock_getsockname                      @ 227 NONAME
+	pj_sock_getsockopt                       @ 228 NONAME
+	pj_sock_listen                           @ 229 NONAME
+	pj_sock_recv                             @ 230 NONAME
+	pj_sock_recvfrom                         @ 231 NONAME
+	pj_sock_select                           @ 232 NONAME
+	pj_sock_send                             @ 233 NONAME
+	pj_sock_sendto                           @ 234 NONAME
+	pj_sock_setsockopt                       @ 235 NONAME
+	pj_sock_shutdown                         @ 236 NONAME
+	pj_sock_socket                           @ 237 NONAME
+	pj_sockaddr_cmp                          @ 238 NONAME
+	pj_sockaddr_copy_addr                    @ 239 NONAME
+	pj_sockaddr_get_addr                     @ 240 NONAME
+	pj_sockaddr_get_addr_len                 @ 241 NONAME
+	pj_sockaddr_get_len                      @ 242 NONAME
+	pj_sockaddr_get_port                     @ 243 NONAME
+	pj_sockaddr_has_addr                     @ 244 NONAME
+	pj_sockaddr_in_get_addr                  @ 245 NONAME
+	pj_sockaddr_in_get_port                  @ 246 NONAME
+	pj_sockaddr_in_init                      @ 247 NONAME
+	pj_sockaddr_in_set_addr                  @ 248 NONAME
+	pj_sockaddr_in_set_port                  @ 249 NONAME
+	pj_sockaddr_in_set_str_addr              @ 250 NONAME
+	pj_sockaddr_init                         @ 251 NONAME
+	pj_sockaddr_print                        @ 252 NONAME
+	pj_sockaddr_set_port                     @ 253 NONAME
+	pj_sockaddr_set_str_addr                 @ 254 NONAME
+	pj_srand                                 @ 255 NONAME
+	pj_str                                   @ 256 NONAME
+	pj_strassign                             @ 257 NONAME
+	pj_strcat                                @ 258 NONAME
+	pj_strcat2                               @ 259 NONAME
+	pj_strcmp                                @ 260 NONAME
+	pj_strcmp2                               @ 261 NONAME
+	pj_strcpy                                @ 262 NONAME
+	pj_strcpy2                               @ 263 NONAME
+	pj_strdup                                @ 264 NONAME
+	pj_strdup2                               @ 265 NONAME
+	pj_strdup2_with_null                     @ 266 NONAME
+	pj_strdup3                               @ 267 NONAME
+	pj_strdup_with_null                      @ 268 NONAME
+	pj_strerror                              @ 269 NONAME
+	pj_stricmp                               @ 270 NONAME
+	pj_stricmp2                              @ 271 NONAME
+	pj_strltrim                              @ 272 NONAME
+	pj_strncmp                               @ 273 NONAME
+	pj_strncmp2                              @ 274 NONAME
+	pj_strncpy                               @ 275 NONAME
+	pj_strncpy_with_null                     @ 276 NONAME
+	pj_strnicmp                              @ 277 NONAME
+	pj_strnicmp2                             @ 278 NONAME
+	pj_strrtrim                              @ 279 NONAME
+	pj_strtoul                               @ 280 NONAME
+	pj_strtoul2                              @ 281 NONAME
+	pj_strtrim                               @ 282 NONAME
+	pj_symbianos_poll                        @ 283 NONAME
+	pj_symbianos_set_params                  @ 284 NONAME
+	pj_thread_check_stack                    @ 285 NONAME
+	pj_thread_create                         @ 286 NONAME
+	pj_thread_destroy                        @ 287 NONAME
+	pj_thread_get_name                       @ 288 NONAME
+	pj_thread_get_os_handle                  @ 289 NONAME
+	pj_thread_get_stack_info                 @ 290 NONAME
+	pj_thread_get_stack_max_usage            @ 291 NONAME
+	pj_thread_is_registered                  @ 292 NONAME
+	pj_thread_join                           @ 293 NONAME
+	pj_thread_local_alloc                    @ 294 NONAME
+	pj_thread_local_free                     @ 295 NONAME
+	pj_thread_local_get                      @ 296 NONAME
+	pj_thread_local_set                      @ 297 NONAME
+	pj_thread_register                       @ 298 NONAME
+	pj_thread_resume                         @ 299 NONAME
+	pj_thread_sleep                          @ 300 NONAME
+	pj_thread_this                           @ 301 NONAME
+	pj_time_decode                           @ 302 NONAME
+	pj_time_encode                           @ 303 NONAME
+	pj_time_gmt_to_local                     @ 304 NONAME
+	pj_time_local_to_gmt                     @ 305 NONAME
+	pj_time_val_normalize                    @ 306 NONAME
+	pj_timer_entry_init                      @ 307 NONAME
+	pj_timer_heap_cancel                     @ 308 NONAME
+	pj_timer_heap_cancel_if_active           @ 309 NONAME
+	pj_timer_heap_count                      @ 310 NONAME
+	pj_timer_heap_create                     @ 311 NONAME
+	pj_timer_heap_destroy                    @ 312 NONAME
+	pj_timer_heap_earliest_time              @ 313 NONAME
+	pj_timer_heap_mem_size                   @ 314 NONAME
+	pj_timer_heap_poll                       @ 315 NONAME
+	pj_timer_heap_schedule                   @ 316 NONAME
+	pj_timer_heap_schedule_w_grp_lock        @ 317 NONAME
+	pj_timer_heap_set_lock                   @ 318 NONAME
+	pj_timer_heap_set_max_timed_out_per_poll @ 319 NONAME
+	pj_unicode_to_ansi                       @ 320 NONAME
+	pj_utoa                                  @ 321 NONAME
+	pj_utoa_pad                              @ 322 NONAME
+	platform_strerror                        @ 323 NONAME
+	snprintf                                 @ 324 NONAME
+	vsnprintf                                @ 325 NONAME
\ No newline at end of file
diff --git a/pjlib/src/pj/ioqueue_symbian.cpp b/pjlib/src/pj/ioqueue_symbian.cpp
index f945b2b..1264621 100644
--- a/pjlib/src/pj/ioqueue_symbian.cpp
+++ b/pjlib/src/pj/ioqueue_symbian.cpp
@@ -528,6 +528,19 @@
     return PJ_SUCCESS;
 }
 
+PJ_DEF(pj_status_t) pj_ioqueue_register_sock2(pj_pool_t *pool,
+					      pj_ioqueue_t *ioqueue,
+					      pj_sock_t sock,
+					      pj_grp_lock_t *grp_lock,
+					      void *user_data,
+					      const pj_ioqueue_callback *cb,
+                                              pj_ioqueue_key_t **p_key)
+{
+    PJ_UNUSED_ARG(grp_lock);
+
+    return pj_ioqueue_register_sock(pool, ioqueue, sock, user_data, cb, p_key);
+}
+
 /*
  * Unregister from the I/O Queue framework. 
  */
diff --git a/pjlib/src/pj/timer_symbian.cpp b/pjlib/src/pj/timer_symbian.cpp
index ca40a66..4b1d61b 100644
--- a/pjlib/src/pj/timer_symbian.cpp
+++ b/pjlib/src/pj/timer_symbian.cpp
@@ -392,6 +392,24 @@
     return PJ_SUCCESS;
 }
 
+PJ_DEF(pj_status_t) pj_timer_heap_schedule_w_grp_lock(pj_timer_heap_t *ht,
+                                                      pj_timer_entry *entry,
+                                                      const pj_time_val *delay,
+                                                      int id_val,
+                                                      pj_grp_lock_t *grp_lock)
+{
+    pj_status_t status;
+	    
+    PJ_UNUSED_ARG(grp_lock);
+
+    status = pj_timer_heap_schedule(ht, entry, delay);
+    
+    if (status == PJ_SUCCESS)
+    	entry->id = id_val;
+    
+    return status;
+}
+
 PJ_DEF(int) pj_timer_heap_cancel( pj_timer_heap_t *ht,
 				  pj_timer_entry *entry)
 {
@@ -411,6 +429,17 @@
     }
 }
 
+PJ_DEF(int) pj_timer_heap_cancel_if_active(pj_timer_heap_t *ht,
+                                           pj_timer_entry *entry,
+                                           int id_val)
+{
+    int count = pj_timer_heap_cancel(ht, entry);
+    if (count == 1)
+    	entry->id = id_val;
+    
+    return count;
+}
+
 PJ_DEF(unsigned) pj_timer_heap_poll( pj_timer_heap_t *ht, 
                                      pj_time_val *next_delay )
 {