Changeset acc2a64 in libbsdport


Ignore:
Timestamp:
Apr 23, 2009, 4:26:07 AM (10 years ago)
Author:
Till Straumann <strauman@…>
Branches:
master
Children:
c1a7644
Parents:
86beed8
Message:
  • callout_stop() and callout_reset() actually must return an 'int' value indicating whether a callout was pending.
  • added callout_active(), callout_pending(), callout_deactivate().
Location:
bsd_eth_drivers/libbsdport
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • bsd_eth_drivers/libbsdport/callout.h

    r86beed8 racc2a64  
    1919        struct mtx      *c_mtx;
    2020        callout_time_t   c_time;
     21        unsigned         c_flags;
    2122};
     23
     24#define CALLOUT_PENDING (1<<0)
     25#define CALLOUT_ACTIVE  (1<<1)
     26
     27/*
     28 * Strictly, we don't need any protection
     29 * because the global network semaphore
     30 * takes care; however we want to
     31 */
     32static inline int
     33callout_active(struct callout *p_c)
     34{
     35int rval;
     36rtems_interrupt_level l;
     37        rtems_interrupt_disable(l);
     38                rval = p_c->c_flags & CALLOUT_ACTIVE;
     39        rtems_interrupt_enable(l);
     40        return rval;   
     41}
     42
     43static inline int
     44callout_pending(struct callout *p_c)
     45{
     46int rval;
     47rtems_interrupt_level l;
     48        rtems_interrupt_disable(l);
     49                rval = p_c->c_flags & CALLOUT_PENDING;
     50        rtems_interrupt_enable(l);
     51        return rval;   
     52}
     53
     54static inline void
     55callout_decativate(struct callout *p_c)
     56{
     57rtems_interrupt_level l;
     58        rtems_interrupt_disable(l);
     59                p_c->c_flags &= ~CALLOUT_ACTIVE;
     60        rtems_interrupt_enable(l);
     61}
    2262
    2363/* We cannot stop a callout that's in progress */
    2464
    25 void
     65int
    2666callout_stop(struct callout *c);
    2767
    2868#define callout_drain callout_stop
    2969
    30 void
     70int
    3171callout_reset(struct callout *c, int ticks, void (*fn)(void*), void *arg);
    3272
  • bsd_eth_drivers/libbsdport/rtems_callout.c

    r86beed8 racc2a64  
    101101                        if ( c->c_time <= 0 ) {
    102102                                /* this one expired */
     103                                rtems_interrupt_disable(k1);
     104                                        c->c_flags &= ~ CALLOUT_PENDING;
     105                                rtems_interrupt_enable(k1);
    103106                                c_deq(c);
    104107                                if ( c->c_func )
     
    174177/* We cannot stop a callout that's in progress */
    175178
    176 void
     179int
    177180callout_stop(struct callout *c)
    178181{
     182rtems_interrupt_level l;
    179183LIST_KEY_DECL(k);
    180184
    181185        if ( !c->c_pprev )
    182                 return; /* not currently on a list */
     186                return 0;       /* not currently on a list */
    183187
    184188        LIST_LOCK(k);
    185189                /* remove from list */
    186190                c_deq(c);
     191                rtems_interrupt_disable(l);
     192                c->c_flags &= ~(CALLOUT_ACTIVE | CALLOUT_PENDING);
     193                rtems_interrupt_enable(l);
    187194        LIST_UNLOCK(k);
    188 }
    189 
    190 
    191 void
     195
     196        return 1;
     197}
     198
     199
     200int
    192201callout_reset(struct callout *c, int ticks, timeout_t fn, void *arg)
    193202{
     203rtems_interrupt_level l;
    194204LIST_KEY_DECL(k);
    195 int                 i;
     205int                 i, rval;
    196206
    197207        if ( ticks <= 0 )
    198208                ticks = 1;
    199209
    200         callout_stop(c);
     210        rval = callout_stop(c);
    201211
    202212        c->c_func = fn;
     
    210220        c_enq(&c_wheel[i], c);
    211221
     222        rtems_interrupt_disable(l);
     223                c->c_flags |= (CALLOUT_ACTIVE | CALLOUT_PENDING);
     224        rtems_interrupt_enable(l);
     225
    212226        LIST_UNLOCK(k);
     227
     228        return rval;
    213229}
    214230
Note: See TracChangeset for help on using the changeset viewer.