timer_queue.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 249 行

C
249
字号
/* *    * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. *//** * @file * * Implementation of the timer queue inteface. * Can be used to support any timer alarms in the master mode. */#include <kni.h>#include <stdlib.h>#include <midpMalloc.h>#include <timer_queue.h>/** *  TimerHandle * *  Implementation of data structure to keep an ordered list of *  upcoming timers. Operations on data structure: *    add    : insert new timer into ordered timers list *    get    : fetch first pending timer *    peek   : fetch first pending timer but do not remove from data-structure *    new    : create a new entry and enqueue in data-structure *    delete : remove an entry from data-structure and free its memory *    remove : remove a specific entry indicated by user data **/struct _TimerHandle {    jlong timeToWakeup;             /* Absolute time to wakeup */    void* userData;                 /* User data provided with timer */    fTimerCallback userCallback;    /* User action on alarm */    struct _TimerHandle* next;      /* Next timer handle in the queue */};/** Timers queue */static TimerHandle* rootTimer = NULL;/** * Insert new timer to the correct place in timer queue * ordered by wakeup time * * @param newTimer new timer to add to queue */void add_timer(TimerHandle* newTimer) {    TimerHandle **ptr = &rootTimer;    REPORT_INFO1(LC_PUSH, "[add_timer] newTimer=%p", newTimer);    for(; *ptr != NULL; ptr = &((*ptr)->next)) {        if ((*ptr)->timeToWakeup > newTimer->timeToWakeup) {           break;        }    }    newTimer->next = *ptr;    (*ptr) = newTimer;}/** * Create a new entry and enqueue in data-structure * * @param timeToWakeup the abs time for the timer (used to order the timer queue) * @param userData user specified data * @param userCallback user specified callback * * @return poitner to new element if successful, * NULL if there was an error allocating this timer. */TimerHandle* new_timer(    jlong timeToWakeup, void* userData, fTimerCallback userCallback) {    TimerHandle* newTimer = (TimerHandle*)midpMalloc(sizeof(TimerHandle));    if (newTimer != NULL) {        REPORT_INFO3(LC_PUSH, "[new_timer] timeToWakeup=%#lx userData=%p userCallback=%p",            (long)timeToWakeup, userData, (void *)userCallback);        newTimer->next = NULL; 		newTimer->timeToWakeup = timeToWakeup;		newTimer->userData = userData;        newTimer->userCallback = userCallback;        add_timer(newTimer);    }    return newTimer;}/** Search for handle instance in the sockets list and return its reference */static TimerHandle** get_timer_ptr(TimerHandle* timer) {    TimerHandle** ptr;    if (timer != NULL) {        for (ptr = &rootTimer; *ptr != NULL; ptr = &((*ptr)->next)) {            if (*ptr == timer) return ptr;        }    }    return NULL;}/** * Remove specified timer handler from queue and free allocated memory * * @param timer instance of timer that should be remove */void delete_timer(TimerHandle* timer) {    TimerHandle **ptr = get_timer_ptr(timer);    REPORT_INFO1(LC_PUSH, "[delete_timer] timer=%p", timer);    if (ptr != NULL) {        *ptr = timer->next;        midpFree(timer);    }}/** * Remove specified timer handler from queue but don't free allocated memory * * @param timer instance that should be remove * * @return poitner to timer instance that should be remove from queue */TimerHandle* remove_timer(TimerHandle* timer) {    TimerHandle **ptr = get_timer_ptr(timer);    REPORT_INFO1(LC_PUSH, "[remove_timer] timer=%p", timer);    if (ptr != NULL) {        *ptr = timer->next;    }    return timer;}/** * Remove a specific entry indicated by user data. * Only first element matching the userData is removed. * * @param userdata user specified data used to identify the entry to remove */void delete_timer_by_userdata(void* userdata) {    TimerHandle* timer;    REPORT_INFO1(LC_PUSH, "[delete_timer_by_userdata] userdata=%p", userdata);    for(timer = rootTimer; timer != NULL; timer = timer->next) {        if (timer->userData == userdata) {            delete_timer(timer);            return;        }    }}/** * Fetch first pending timer and remove from data-structure * * @return poitner to first pending timer if successful, * NULL if there is not timer */TimerHandle* get_timer() {    TimerHandle* timer;    if (rootTimer != NULL) {        timer = rootTimer;        rootTimer = rootTimer->next;        timer->next = NULL;        return timer;    }    return NULL;}/** * Fetch first pending timer without removing it from data-structure * * @return poitner to first pending timer if successful, * NULL if there is not timer */TimerHandle* peek_timer() {    return rootTimer;}/** * Get user data of the timer * * @param timer instance of the timer to get user data from * @return untyped user data registered during timer creation, *    or NULL for NULL timer handle */void* get_timer_data(const TimerHandle *timer) {    if (timer != NULL) {        return timer->userData;    }    return NULL;}/** * Get absoulte wakeup time of the timer * * @param timer instance of the timer to get wakeup time from * @return absoulte time when the timer should wakeup, *    or -1 for NULL timer handle */jlong get_timer_wakeup(const TimerHandle *timer) {    if (timer != NULL) {        return timer->timeToWakeup;    }    return -1;}/** * Set absoulte wakeup time for the timer * * @param timer instance of the timer to set wakeup time to * @param timeToWakeup absolute time when the timer should wakeup */void set_timer_wakeup(TimerHandle *timer, jlong timeToWakeup) {    if (timer != NULL) {        timer->timeToWakeup = timeToWakeup;    }}/** * Perform wakeup action accosiated with the timer * * @param timer instance of the timer to wakeup */void wakeup_timer(TimerHandle *timer) {    if (timer != NULL && timer->userCallback != NULL) {        REPORT_INFO1(LC_PUSH, "[wakeup_timer] timer=%p", timer);        timer->userCallback(timer);        }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?