Changeset 30413b31 in mainline for uspace/lib


Ignore:
Timestamp:
2011-12-10T08:29:44Z (14 years ago)
Author:
Frantisek Princ <frantisek.princ@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d9f8dd13
Parents:
b8b1e631 (diff), 87955bfb (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge with mainline

Location:
uspace/lib
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/ddi.c

    rb8b1e631 r30413b31  
    5353}
    5454
    55 /** Map piece of physical memory to task.
     55/** Map a piece of physical memory to task.
    5656 *
    5757 * Caller of this function must have the CAP_MEM_MANAGER capability.
    5858 *
    59  * @param pf            Physical address of the starting frame.
    60  * @param vp            Virtual address of the starting page.
    61  * @param pages         Number of pages to map.
    62  * @param flags         Flags for the new address space area.
     59 * @param pf    Physical address of the starting frame.
     60 * @param vp    Virtual address of the starting page.
     61 * @param pages Number of pages to map.
     62 * @param flags Flags for the new address space area.
    6363 *
    64  * @return              0 on success, EPERM if the caller lacks the
    65  *                      CAP_MEM_MANAGER capability, ENOENT if there is no task
    66  *                      with specified ID and ENOMEM if there was some problem
    67  *                      in creating address space area.
     64 * @return EOK on success
     65 * @return EPERM if the caller lacks the CAP_MEM_MANAGER capability
     66 * @return ENOENT if there is no task with specified ID
     67 * @return ENOMEM if there was some problem in creating
     68 *         the address space area.
     69 *
    6870 */
    69 int physmem_map(void *pf, void *vp, unsigned long pages, int flags)
     71int physmem_map(void *pf, void *vp, size_t pages, unsigned int flags)
    7072{
    71         return __SYSCALL4(SYS_PHYSMEM_MAP, (sysarg_t) pf, (sysarg_t) vp, pages,
    72             flags);
     73        return __SYSCALL4(SYS_PHYSMEM_MAP, (sysarg_t) pf, (sysarg_t) vp,
     74            pages, flags);
    7375}
    7476
  • uspace/lib/c/generic/fibril_synch.c

    rb8b1e631 r30413b31  
    447447}
    448448
     449/** Timer fibril.
     450 *
     451 * @param arg   Timer
     452 */
     453static int fibril_timer_func(void *arg)
     454{
     455        fibril_timer_t *timer = (fibril_timer_t *) arg;
     456        int rc;
     457
     458        fibril_mutex_lock(&timer->lock);
     459
     460        while (true) {
     461                while (timer->state != fts_active &&
     462                    timer->state != fts_cleanup) {
     463
     464                        if (timer->state == fts_cleanup)
     465                                break;
     466
     467                        fibril_condvar_wait(&timer->cv, &timer->lock);
     468                }
     469
     470                if (timer->state == fts_cleanup)
     471                        break;
     472
     473                rc = fibril_condvar_wait_timeout(&timer->cv, &timer->lock,
     474                    timer->delay);
     475                if (rc == ETIMEOUT) {
     476                        timer->state = fts_fired;
     477                        fibril_mutex_unlock(&timer->lock);
     478                        timer->fun(timer->arg);
     479                        fibril_mutex_lock(&timer->lock);
     480                }
     481        }
     482
     483        fibril_mutex_unlock(&timer->lock);
     484        return 0;
     485}
     486
     487/** Create new timer.
     488 *
     489 * @return              New timer on success, @c NULL if out of memory.
     490 */
     491fibril_timer_t *fibril_timer_create(void)
     492{
     493        fid_t fid;
     494        fibril_timer_t *timer;
     495
     496        timer = calloc(1, sizeof(fibril_timer_t));
     497        if (timer == NULL)
     498                return NULL;
     499
     500        fid = fibril_create(fibril_timer_func, (void *) timer);
     501        if (fid == 0) {
     502                free(timer);
     503                return NULL;
     504        }
     505
     506        fibril_mutex_initialize(&timer->lock);
     507        fibril_condvar_initialize(&timer->cv);
     508
     509        timer->fibril = fid;
     510        timer->state = fts_not_set;
     511
     512        fibril_add_ready(fid);
     513
     514        return timer;
     515}
     516
     517/** Destroy timer.
     518 *
     519 * @param timer         Timer, must not be active or accessed by other threads.
     520 */
     521void fibril_timer_destroy(fibril_timer_t *timer)
     522{
     523        fibril_mutex_lock(&timer->lock);
     524        assert(timer->state != fts_active);
     525        timer->state = fts_cleanup;
     526        fibril_condvar_broadcast(&timer->cv);
     527        fibril_mutex_unlock(&timer->lock);
     528}
     529
     530/** Set timer.
     531 *
     532 * Set timer to execute a callback function after the specified
     533 * interval.
     534 *
     535 * @param timer         Timer
     536 * @param delay         Delay in microseconds
     537 * @param fun           Callback function
     538 * @param arg           Argument for @a fun
     539 */
     540void fibril_timer_set(fibril_timer_t *timer, suseconds_t delay,
     541    fibril_timer_fun_t fun, void *arg)
     542{
     543        fibril_mutex_lock(&timer->lock);
     544        timer->state = fts_active;
     545        timer->delay = delay;
     546        timer->fun = fun;
     547        timer->arg = arg;
     548        fibril_condvar_broadcast(&timer->cv);
     549        fibril_mutex_unlock(&timer->lock);
     550}
     551
     552/** Clear timer.
     553 *
     554 * Clears (cancels) timer and returns last state of the timer.
     555 * This can be one of:
     556 *    - fts_not_set     If the timer has not been set or has been cleared
     557 *    - fts_active      Timer was set but did not fire
     558 *    - fts_fired       Timer fired
     559 *
     560 * @param timer         Timer
     561 * @return              Last timer state
     562 */
     563fibril_timer_state_t fibril_timer_clear(fibril_timer_t *timer)
     564{
     565        fibril_timer_state_t old_state;
     566
     567        fibril_mutex_lock(&timer->lock);
     568        old_state = timer->state;
     569        timer->state = fts_not_set;
     570
     571        timer->delay = 0;
     572        timer->fun = NULL;
     573        timer->arg = NULL;
     574        fibril_condvar_broadcast(&timer->cv);
     575        fibril_mutex_unlock(&timer->lock);
     576
     577        return old_state;
     578}
     579
    449580/** @}
    450581 */
  • uspace/lib/c/include/bitops.h

    rb8b1e631 r30413b31  
    4040/** Mask with bit @a n set. */
    4141#define BIT_V(type, n) \
    42     ((type)1 << ((n) - 1))
     42    ((type)1 << (n))
    4343
    4444/** Mask with rightmost @a n bits set. */
    4545#define BIT_RRANGE(type, n) \
    46     (BIT_V(type, (n) + 1) - 1)
     46    (BIT_V(type, (n)) - 1)
    4747
    4848/** Mask with bits @a hi .. @a lo set. @a hi >= @a lo. */
  • uspace/lib/c/include/ddi.h

    rb8b1e631 r30413b31  
    4141
    4242extern int device_assign_devno(void);
    43 extern int physmem_map(void *, void *, unsigned long, int);
     43extern int physmem_map(void *, void *, size_t, unsigned int);
    4444extern int iospace_enable(task_id_t, void *, unsigned long);
    4545extern int pio_enable(void *, size_t, void **);
  • uspace/lib/c/include/errno.h

    rb8b1e631 r30413b31  
    9696#define ENOTCONN  (-10057)
    9797
     98#define ECONNREFUSED  (-10058)
     99
     100#define ECONNABORTED  (-10059)
     101
    98102/** The requested operation was not performed. Try again later. */
    99103#define EAGAIN  (-11002)
  • uspace/lib/c/include/fibril_synch.h

    rb8b1e631 r30413b31  
    107107        fibril_condvar_t name = FIBRIL_CONDVAR_INITIALIZER(name)
    108108
     109typedef void (*fibril_timer_fun_t)(void *);
     110
     111typedef enum {
     112        /** Timer has not been set or has been cleared */
     113        fts_not_set,
     114        /** Timer was set but did not fire yet */
     115        fts_active,
     116        /** Timer has fired and has not been cleared since */
     117        fts_fired,
     118        /** Timer is being destroyed */
     119        fts_cleanup
     120} fibril_timer_state_t;
     121
     122/** Fibril timer.
     123 *
     124 * When a timer is set it executes a callback function (in a separate
     125 * fibril) after a specified time interval. The timer can be cleared
     126 * (canceled) before that. From the return value of fibril_timer_clear()
     127 * one can tell whether the timer fired or not.
     128 */
     129typedef struct {
     130        fibril_mutex_t lock;
     131        fibril_condvar_t cv;
     132        fid_t fibril;
     133        fibril_timer_state_t state;
     134
     135        suseconds_t delay;
     136        fibril_timer_fun_t fun;
     137        void *arg;
     138} fibril_timer_t;
     139
    109140extern void fibril_mutex_initialize(fibril_mutex_t *);
    110141extern void fibril_mutex_lock(fibril_mutex_t *);
     
    129160extern void fibril_condvar_broadcast(fibril_condvar_t *);
    130161
     162extern fibril_timer_t *fibril_timer_create(void);
     163extern void fibril_timer_destroy(fibril_timer_t *);
     164extern void fibril_timer_set(fibril_timer_t *, suseconds_t, fibril_timer_fun_t,
     165    void *);
     166extern fibril_timer_state_t fibril_timer_clear(fibril_timer_t *);
     167
    131168#endif
    132169
  • uspace/lib/minix/minix.h

    rb8b1e631 r30413b31  
    3939#define S_ISDIR(m)              (((m) & S_IFMT) == S_IFDIR)
    4040#define S_ISREG(m)              (((m) & S_IFMT) == S_IFREG)
    41 #define S_IFDIR                 0040000         /*Directory*/
    42 #define S_IFREG                 0100000         /*Regular file*/
     41#define S_IFDIR                 0040000         /* Directory */
     42#define S_IFREG                 0100000         /* Regular file */
    4343#define S_IFMT                  00170000
    4444
    45 /*The following block sizes are valid only on V3 filesystem*/
     45/* The following block sizes are valid only on V3 filesystem */
    4646#define MFS_MIN_BLOCKSIZE       1024
    4747#define MFS_MAX_BLOCKSIZE       4096
     
    8888#define MFS_ERROR_FS            0x0002
    8989
    90 /*MFS V1/V2 superblock data on disk*/
     90/* MFS V1/V2 superblock data on disk */
    9191struct mfs_superblock {
    92         /*Total number of inodes on the device*/
     92        /* Total number of inodes on the device */
    9393        uint16_t        s_ninodes;
    94         /*Total number of zones on the device*/
     94        /* Total number of zones on the device */
    9595        uint16_t        s_nzones;
    96         /*Number of inode bitmap blocks*/
     96        /* Number of inode bitmap blocks */
    9797        uint16_t        s_ibmap_blocks;
    98         /*Number of zone bitmap blocks*/
     98        /* Number of zone bitmap blocks */
    9999        uint16_t        s_zbmap_blocks;
    100         /*First data zone on device*/
     100        /* First data zone on device */
    101101        uint16_t        s_first_data_zone;
    102         /*Base 2 logarithm of the zone to block ratio*/
     102        /* Base 2 logarithm of the zone to block ratio */
    103103        uint16_t        s_log2_zone_size;
    104         /*Maximum file size expressed in bytes*/
     104        /* Maximum file size expressed in bytes */
    105105        uint32_t        s_max_file_size;
    106106        /*
     
    109109         */
    110110        uint16_t        s_magic;
    111         /*Flag used to detect FS errors*/
     111        /* Flag used to detect FS errors*/
    112112        uint16_t        s_state;
    113         /*Total number of zones on the device (V2 only)*/
     113        /* Total number of zones on the device (V2 only) */
    114114        uint32_t        s_nzones2;
    115115} __attribute__ ((packed));
    116116
    117117
    118 /*MFS V3 superblock data on disk*/
     118/* MFS V3 superblock data on disk */
    119119struct mfs3_superblock {
    120         /*Total number of inodes on the device*/
     120        /* Total number of inodes on the device */
    121121        uint32_t        s_ninodes;
    122122        uint16_t        s_pad0;
    123         /*Number of inode bitmap blocks*/
     123        /* Number of inode bitmap blocks */
    124124        int16_t         s_ibmap_blocks;
    125         /*Number of zone bitmap blocks*/
     125        /* Number of zone bitmap blocks */
    126126        int16_t         s_zbmap_blocks;
    127         /*First data zone on device*/
     127        /* First data zone on device */
    128128        uint16_t        s_first_data_zone;
    129         /*Base 2 logarithm of the zone to block ratio*/
     129        /* Base 2 logarithm of the zone to block ratio */
    130130        int16_t         s_log2_zone_size;
    131131        int16_t         s_pad1;
    132         /*Maximum file size expressed in bytes*/
     132        /* Maximum file size expressed in bytes */
    133133        uint32_t        s_max_file_size;
    134         /*Total number of zones on the device*/
     134        /* Total number of zones on the device */
    135135        uint32_t        s_nzones;
    136136        /*
     
    140140        int16_t         s_magic;
    141141        int16_t         s_pad2;
    142         /*Filesystem block size expressed in bytes*/
     142        /* Filesystem block size expressed in bytes */
    143143        uint16_t        s_block_size;
    144         /*Filesystem disk format version*/
     144        /* Filesystem disk format version */
    145145        int8_t          s_disk_version;
    146146} __attribute__ ((packed));
    147147
    148 /*MinixFS V1 inode structure as it is on disk*/
     148/* MinixFS V1 inode structure as it is on disk */
    149149struct mfs_inode {
    150150        uint16_t        i_mode;
     
    154154        uint8_t         i_gid;
    155155        uint8_t         i_nlinks;
    156         /*Block numbers for direct zones*/
     156        /* Block numbers for direct zones */
    157157        uint16_t        i_dzone[V1_NR_DIRECT_ZONES];
    158         /*Block numbers for indirect zones*/
     158        /* Block numbers for indirect zones */
    159159        uint16_t        i_izone[V1_NR_INDIRECT_ZONES];
    160160} __attribute__ ((packed));
    161161
    162 /*MinixFS V2 inode structure as it is on disk (also valid for V3).*/
     162/* MinixFS V2 inode structure as it is on disk (also valid for V3). */
    163163struct mfs2_inode {
    164164        uint16_t        i_mode;
     
    170170        int32_t         i_mtime;
    171171        int32_t         i_ctime;
    172         /*Block numbers for direct zones*/
     172        /* Block numbers for direct zones */
    173173        uint32_t        i_dzone[V2_NR_DIRECT_ZONES];
    174         /*Block numbers for indirect zones*/
     174        /* Block numbers for indirect zones */
    175175        uint32_t        i_izone[V2_NR_INDIRECT_ZONES];
    176176} __attribute__ ((packed));
    177177
    178 /*MinixFS V1/V2 directory entry on-disk structure*/
     178/* MinixFS V1/V2 directory entry on-disk structure */
    179179struct mfs_dentry {
    180180        uint16_t d_inum;
     
    182182};
    183183
    184 /*MinixFS V3 directory entry on-disk structure*/
     184/* MinixFS V3 directory entry on-disk structure */
    185185struct mfs3_dentry {
    186186        uint32_t d_inum;
  • uspace/lib/net/generic/generic.c

    rb8b1e631 r30413b31  
    104104    nic_device_id_t device_id, uint8_t *address, size_t max_len)
    105105{
    106         if (!address)
    107                 return EBADMEM;
     106        aid_t aid;
     107        ipc_call_t result;
     108       
     109        assert(address != NULL);
    108110       
    109111        /* Request the address */
    110112        async_exch_t *exch = async_exchange_begin(sess);
    111         aid_t aid = async_send_1(exch, message, (sysarg_t) device_id,
    112             NULL);
     113        aid = async_send_1(exch, message, (sysarg_t) device_id, &result);
     114       
     115        sysarg_t ipcrc;
    113116        int rc = async_data_read_start(exch, address, max_len);
    114117        async_exchange_end(exch);
    115118       
    116         sysarg_t result;
    117         async_wait_for(aid, &result);
    118        
    119         if (rc != EOK)
     119        if (rc != EOK) {
     120                async_wait_for(aid, &ipcrc);
    120121                return rc;
    121        
    122         return (int) result;
     122        }
     123       
     124        async_wait_for(aid, &ipcrc);
     125        if (ipcrc == EOK) {
     126                return IPC_GET_ARG1(result);
     127        } else {
     128                return (int) ipcrc;
     129        }
    123130}
    124131
Note: See TracChangeset for help on using the changeset viewer.