Changeset 894c965 in rtems-libbsd


Ignore:
Timestamp:
Sep 15, 2017, 10:46:57 AM (2 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
fd86c091b97759106da7355ce1dd81ebe030e285, f020f08430150c1656a0ad0a1de13699db9b980b
Children:
b16eca9
Parents:
666a568
Message:

Support reference counting for file descriptors

Close #3132.

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/kern/sys_generic.c

    r666a568 r894c965  
    16151615                 */
    16161616                fd->revents = fo_poll(fp, fd->events, td->td_ucred, td);
     1617#ifdef __rtems__
     1618                rtems_libio_iop_drop(&fp->f_io);
     1619#endif /* __rtems__ */
    16171620                if (fd->revents != 0)
    16181621                        n++;
     
    16721675                if (fds->fd > fdp->fd_lastfile) {
    16731676#else /* __rtems__ */
    1674                 if (fds->fd >= rtems_libio_number_iops) {
     1677                if ((uint32_t)fds->fd >= rtems_libio_number_iops) {
    16751678#endif /* __rtems__ */
    16761679                        fds->revents = POLLNVAL;
     
    17021705                                fds->revents = fo_poll(fp, fds->events,
    17031706                                    td->td_ucred, td);
     1707#ifdef __rtems__
     1708                                rtems_libio_iop_drop(&fp->f_io);
     1709#endif /* __rtems__ */
    17041710                                /*
    17051711                                 * POSIX requires POLLOUT to be never
  • freebsd/sys/kern/uipc_syscalls.c

    r666a568 r894c965  
    127127
    128128        if ((uint32_t) fd < rtems_libio_number_iops) {
     129                unsigned int flags;
     130
    129131                fp = rtems_bsd_fd_to_fp(fd);
    130                 if ((fp->f_io.flags & LIBIO_FLAGS_OPEN) != LIBIO_FLAGS_OPEN) {
     132                flags = rtems_libio_iop_hold(&fp->f_io);
     133                if ((flags & LIBIO_FLAGS_OPEN) == 0) {
     134                        rtems_libio_iop_drop(&fp->f_io);
    131135                        fp = NULL;
    132136                        error = EBADF;
    133137                } else if (fp->f_io.pathinfo.handlers != &socketops) {
     138                        rtems_libio_iop_drop(&fp->f_io);
    134139                        fp = NULL;
    135140                        error = ENOTSOCK;
  • freebsd/sys/sys/file.h

    r666a568 r894c965  
    331331rtems_bsd_do_fget(int fd, struct file **fpp)
    332332{
    333         struct file *fp = rtems_bsd_get_file(fd);
    334 
     333        struct file *fp;
     334
     335        fp = rtems_bsd_get_file(fd);
    335336        *fpp = fp;
    336 
    337         return fp != NULL ? 0 : EBADF;
     337        return (fp != NULL ? 0 : EBADF);
    338338}
    339339
     
    375375    const rtems_filesystem_file_handlers_r *ops)
    376376{
    377         rtems_filesystem_location_info_t *pathinfo = &fp->f_io.pathinfo;
    378 
    379         (void) type;
    380 
     377
     378        (void)type;
    381379        fp->f_data = data;
    382         fp->f_io.flags |= rtems_bsd_fflag_to_libio_flags(fflag);
    383 
    384         pathinfo->handlers = ops;
     380        fp->f_io.pathinfo.handlers = ops;
     381        rtems_libio_iop_flags_set(&fp->f_io, LIBIO_FLAGS_OPEN |
     382            rtems_bsd_fflag_to_libio_flags(fflag));
    385383}
    386384#endif /* __rtems__ */
     
    409407        (refcount_release(&(fp)->f_count) ? _fdrop((fp), (td)) : _fnoop())
    410408#else /* __rtems__ */
    411 #define fdrop(fp, td) do { } while (0)
     409static inline void
     410rtems_bsd_fdrop(struct file *fp)
     411{
     412
     413        rtems_libio_iop_drop(&fp->f_io);
     414}
     415
     416#define fdrop(fp, td) rtems_bsd_fdrop(fp)
    412417#endif /* __rtems__ */
    413418
  • freebsd/sys/sys/filedesc.h

    r666a568 r894c965  
    193193    int flags, struct filecaps *fcaps)
    194194{
    195         rtems_libio_t *iop = rtems_libio_allocate();
    196 
    197         (void) td;
    198         (void) flags;
    199         (void) fcaps;
    200 
     195        rtems_libio_t *iop;
     196
     197        (void)td;
     198        (void)flags;
     199        (void)fcaps;
     200
     201        iop = rtems_libio_allocate();
    201202        *resultfp = rtems_bsd_iop_to_fp(iop);
    202203
    203204        if (iop != NULL) {
     205                rtems_libio_iop_hold(iop);
    204206                iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
    205207                rtems_filesystem_location_add_to_mt_entry(&iop->pathinfo);
    206208                *resultfd = rtems_libio_iop_to_descriptor(iop);
    207 
    208209                return (0);
    209210        } else {
     
    264265    struct file **fpp, seq_t *seqp)
    265266{
     267        struct file *fp;
     268
    266269        (void)fdp;
    267270        (void)needrightsp;
    268271        (void)seqp;
    269 
    270         *fpp = rtems_bsd_get_file(fd);
    271 
    272         if (*fpp != NULL) {
    273                 return (0);
    274         } else {
    275                 return (EBADF);
    276         }
     272        fp = rtems_bsd_get_file(fd);
     273        *fpp = fp;
     274        return (fp != NULL ? 0 : EBADF);
    277275}
    278276#endif /* __rtems__ */
  • rtemsbsd/rtems/rtems-kernel-get-file.c

    r666a568 r894c965  
    4848
    4949        if ((uint32_t) fd < rtems_libio_number_iops) {
     50                unsigned int flags;
     51
    5052                fp = rtems_bsd_fd_to_fp(fd);
    51                 if ((fp->f_io.flags & LIBIO_FLAGS_OPEN) != LIBIO_FLAGS_OPEN) {
     53                flags = rtems_libio_iop_hold(&fp->f_io);
     54
     55                if ((flags & LIBIO_FLAGS_OPEN) == 0) {
     56                        rtems_libio_iop_drop(&fp->f_io);
    5257                        fp = NULL;
    5358                }
Note: See TracChangeset for help on using the changeset viewer.