Changeset 0c9f27b in rtems-libbsd


Ignore:
Timestamp:
Oct 28, 2013, 2:40:53 PM (6 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, afaeccc05a556f6aa25ba044a7e49d6aa634a59e, freebsd-9.3, master
Children:
a9e26f5
Parents:
bae343a
git-author:
Sebastian Huber <sebastian.huber@…> (10/28/13 14:40:53)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/31/13 12:18:52)
Message:

Use kqueue() and kevent() from FreeBSD

Files:
2 deleted
11 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    rbae343a r0c9f27b  
    8888LIB_C_FILES += rtemsbsd/rtems/rtems-net-setup.c
    8989LIB_C_FILES += rtemsbsd/rtems/rtems-syslog-initialize.c
    90 LIB_C_FILES += rtemsbsd/rtems/rtems-uthread_kevent.c
    91 LIB_C_FILES += rtemsbsd/rtems/rtems-uthread_kqueue.c
    9290LIB_C_FILES += rtemsbsd/rtems/syslog.c
    9391LIB_C_FILES += rtemsbsd/sys/dev/usb/controller/ehci_mpc83xx.c
  • freebsd-to-rtems.py

    rbae343a r0c9f27b  
    645645                'rtems/rtems-net-setup.c',
    646646                'rtems/rtems-syslog-initialize.c',
    647                 'rtems/rtems-uthread_kevent.c',
    648                 'rtems/rtems-uthread_kqueue.c',
    649647                'rtems/syslog.c',
    650648                'sys/dev/usb/controller/ehci_mpc83xx.c',
  • freebsd/sys/kern/kern_event.c

    rbae343a r0c9f27b  
    6767#endif
    6868
    69 #ifndef __rtems__
    70 ##include <vm/uma.h>
     69#include <vm/uma.h>
     70#ifdef __rtems__
     71#include <machine/rtems-bsd-syscall-api.h>
     72
     73/* Maintain a global kqueue list on RTEMS */
     74static struct kqlist fd_kqlist;
    7175#endif /* __rtems__ */
    7276
     
    9296TASKQUEUE_DEFINE_THREAD(kqueue);
    9397
    94 #ifndef __rtems__
    9598static int      kevent_copyout(void *arg, struct kevent *kevp, int count);
    9699static int      kevent_copyin(void *arg, struct kevent *kevp, int count);
     
    110113static void     kqueue_fo_release(int filt);
    111114
     115#ifndef __rtems__
    112116static fo_rdwr_t        kqueue_read;
    113117static fo_rdwr_t        kqueue_write;
     
    129133        .fo_close = kqueue_close,
    130134};
     135#else /* __rtems__ */
     136static const rtems_filesystem_file_handlers_r kqueueops;
     137#endif /* __rtems__ */
    131138
    132139static int      knote_attach(struct knote *kn, struct kqueue *kq);
    133140static void     knote_drop(struct knote *kn, struct thread *td);
    134 #endif /* __rtems__ */
    135141static void     knote_enqueue(struct knote *kn);
    136 #ifndef __rtems__
    137142static void     knote_dequeue(struct knote *kn);
    138143static void     knote_init(void);
     
    142147static void     filt_kqdetach(struct knote *kn);
    143148static int      filt_kqueue(struct knote *kn, long hint);
     149#ifndef __rtems__
    144150static int      filt_procattach(struct knote *kn);
    145151static void     filt_procdetach(struct knote *kn);
    146152static int      filt_proc(struct knote *kn, long hint);
     153#endif /* __rtems__ */
    147154static int      filt_fileattach(struct knote *kn);
    148155static void     filt_timerexpire(void *knx);
     
    161168        { 1, NULL, filt_kqdetach, filt_kqueue };
    162169/* XXX - move to kern_proc.c?  */
     170#ifndef __rtems__
    163171static struct filterops proc_filtops =
    164172        { 0, filt_procattach, filt_procdetach, filt_proc };
     173#endif /* __rtems__ */
    165174static struct filterops timer_filtops =
    166175        { 0, filt_timerattach, filt_timerdetach, filt_timer };
     
    177186SYSCTL_INT(_kern, OID_AUTO, kq_calloutmax, CTLFLAG_RW,
    178187    &kq_calloutmax, 0, "Maximum number of callouts allocated for kqueue");
    179 #endif /* __rtems__ */
    180188
    181189/* XXX - ensure not KN_INFLUX?? */
     
    242250#define KN_HASH(val, mask)      (((val) ^ (val >> 8)) & (mask))
    243251
    244 #ifndef __rtems__
    245252static int
    246253filt_nullattach(struct knote *kn)
     
    271278        { &null_filtops },                      /* EVFILT_AIO */
    272279        { &file_filtops },                      /* EVFILT_VNODE */
     280#ifndef __rtems__
    273281        { &proc_filtops },                      /* EVFILT_PROC */
    274282        { &sig_filtops },                       /* EVFILT_SIGNAL */
     283#else /* __rtems__ */
     284        { &null_filtops },                      /* EVFILT_PROC */
     285        { &null_filtops },                      /* EVFILT_SIGNAL */
     286#endif /* __rtems__ */
    275287        { &timer_filtops },                     /* EVFILT_TIMER */
    276288        { &null_filtops },                      /* former EVFILT_NETDEV */
     289#ifndef __rtems__
    277290        { &fs_filtops },                        /* EVFILT_FS */
     291#else /* __rtems__ */
     292        { &null_filtops },                      /* EVFILT_FS */
     293#endif /* __rtems__ */
    278294        { &null_filtops },                      /* EVFILT_LIO */
    279295        { &user_filtops },                      /* EVFILT_USER */
     
    306322        return (0);
    307323}
     324#ifdef __rtems__
     325static int
     326rtems_bsd_kqueue_kqfilter(rtems_libio_t *iop, struct knote *kn)
     327{
     328        struct file *fp = rtems_bsd_iop_to_fp(iop);
     329
     330        return kqueue_kqfilter(fp, kn);
     331}
     332#endif /* __rtems__ */
    308333
    309334static void
     
    325350}
    326351
     352#ifndef __rtems__
    327353/* XXX - move to kern_proc.c?  */
    328354static int
     
    503529        list->kl_unlock(list->kl_lockarg);
    504530}
     531#endif /* __rtems__ */
    505532
    506533static int
     
    670697}
    671698
     699#ifndef __rtems__
    672700int
    673701kqueue(struct thread *td, struct kqueue_args *uap)
     702#else /* __rtems__ */
     703static int
     704rtems_bsd_kqueue(struct thread *td, struct kqueue_args *uap)
     705#endif /* __rtems__ */
    674706{
    675707        struct filedesc *fdp;
     
    678710        int fd, error;
    679711
     712#ifndef __rtems__
    680713        fdp = td->td_proc->p_fd;
     714#else /* __rtems__ */
     715        (void) fdp;
     716#endif /* __rtems__ */
    681717        error = falloc(td, &fp, &fd);
    682718        if (error)
     
    687723        mtx_init(&kq->kq_lock, "kqueue", NULL, MTX_DEF|MTX_DUPOK);
    688724        TAILQ_INIT(&kq->kq_head);
     725#ifndef __rtems__
    689726        kq->kq_fdp = fdp;
     727#endif /* __rtems__ */
    690728        knlist_init_mtx(&kq->kq_sel.si_note, &kq->kq_lock);
    691729        TASK_INIT(&kq->kq_task, 0, kqueue_task, kq);
    692730
     731#ifndef __rtems__
    693732        FILEDESC_XLOCK(fdp);
    694733        SLIST_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_list);
    695734        FILEDESC_XUNLOCK(fdp);
     735#else /* __rtems__ */
     736        rtems_libio_lock();
     737        SLIST_INSERT_HEAD(&fd_kqlist, kq, kq_list);
     738        rtems_libio_unlock();
     739#endif /* __rtems__ */
    696740
    697741        finit(fp, FREAD | FWRITE, DTYPE_KQUEUE, kq, &kqueueops);
     
    702746        return (error);
    703747}
     748#ifdef __rtems__
     749int
     750kqueue(void)
     751{
     752        struct thread *td = rtems_bsd_get_curthread_or_null();
     753        struct kqueue_args ua;
     754        int error;
     755
     756        if (td != NULL) {
     757                error = rtems_bsd_kqueue(td, &ua);
     758        } else {
     759                error = ENOMEM;
     760        }
     761
     762        if (error == 0) {
     763                return td->td_retval[0];
     764        } else {
     765                rtems_set_errno_and_return_minus_one(error);
     766        }
     767}
     768#endif /* __rtems__ */
    704769
    705770#ifndef _SYS_SYSPROTO_H_
     
    713778};
    714779#endif
     780#ifndef __rtems__
    715781int
    716782kevent(struct thread *td, struct kevent_args *uap)
     783#else /* __rtems__ */
     784static int
     785kern_kevent(struct thread *td, int fd, int nchanges, int nevents, struct
     786    kevent_copyops *k_ops, const struct timespec *timeout);
     787
     788static int
     789rtems_bsd_kevent(struct thread *td, struct kevent_args *uap)
     790#endif /* __rtems__ */
    717791{
    718792        struct timespec ts, *tsp;
     
    764838        return (error);
    765839}
     840#ifdef __rtems__
     841__weak_reference(kevent, _kevent);
     842
     843int
     844kevent(int kq, const struct kevent *changelist, int nchanges,
     845    struct kevent *eventlist, int nevents,
     846    const struct timespec *timeout)
     847{
     848        struct thread *td = rtems_bsd_get_curthread_or_null();
     849        struct kevent_args ua = {
     850                .fd = kq,
     851                .changelist = changelist,
     852                .nchanges = nchanges,
     853                .eventlist = eventlist,
     854                .nevents = nevents,
     855                .timeout = timeout
     856        };
     857        int error;
     858
     859        if (td != NULL) {
     860                error = rtems_bsd_kevent(td, &ua);
     861        } else {
     862                error = ENOMEM;
     863        }
     864
     865        if (error == 0) {
     866                return td->td_retval[0];
     867        } else {
     868                rtems_set_errno_and_return_minus_one(error);
     869        }
     870}
     871#endif /* __rtems__ */
    766872
    767873/*
     
    9821088                }
    9831089
     1090#ifndef __rtems__
    9841091                if (fp->f_type == DTYPE_KQUEUE) {
     1092#else /* __rtems__ */
     1093                if (fp->f_io.pathinfo.handlers == &kqueueops) {
     1094#endif /* __rtems__ */
    9851095                        /*
    9861096                         * if we add some inteligence about what we are doing,
     
    11581268
    11591269        kq = fp->f_data;
     1270#ifndef __rtems__
    11601271        if (fp->f_type != DTYPE_KQUEUE || kq == NULL)
     1272#else /* __rtems__ */
     1273        if (fp->f_io.pathinfo.handlers != &kqueueops || kq == NULL)
     1274#endif /* __rtems__ */
    11611275                return (EBADF);
    11621276        *kqp = kq;
     
    11851299                KQ_UNLOCK(kq);
    11861300}
    1187 #endif /* __rtems__ */
    11881301
    11891302static void
     
    12011314}
    12021315
    1203 #ifndef __rtems__
    12041316/*
    12051317 * Expand the kq to make sure we have storage for fops/ident pair.
     
    14981610}
    14991611
     1612#ifndef __rtems__
    15001613/*
    15011614 * XXX
     
    15741687        return (ENOTTY);
    15751688}
     1689#endif /* __rtems__ */
    15761690
    15771691/*ARGSUSED*/
     
    16011715        return (revents);
    16021716}
     1717#ifdef __rtems__
     1718static int
     1719rtems_bsd_kqueue_poll(rtems_libio_t *iop, int events)
     1720{
     1721        struct thread *td = rtems_bsd_get_curthread_or_null();
     1722        struct file *fp = rtems_bsd_iop_to_fp(iop);
     1723        int error;
     1724
     1725        if (td != NULL) {
     1726                error = kqueue_poll(fp, events, NULL, td);
     1727        } else {
     1728                error = ENOMEM;
     1729        }
     1730
     1731        return error;
     1732}
     1733#endif /* __rtems__ */
    16031734
    16041735/*ARGSUSED*/
     1736#ifndef __rtems__
    16051737static int
    16061738kqueue_stat(struct file *fp, struct stat *st, struct ucred *active_cred,
     
    16091741
    16101742        bzero((void *)st, sizeof *st);
     1743#else /* __rtems__ */
     1744static int
     1745rtems_bsd_kqueue_stat(const rtems_filesystem_location_info_t *loc,
     1746    struct stat *st)
     1747{
     1748        (void) loc;
     1749#endif /* __rtems__ */
    16111750        /*
    16121751         * We no longer return kq_count because the unlocked value is useless.
     
    16301769        int error;
    16311770
     1771#ifdef __rtems__
     1772        /* FIXME: Move this to the RTEMS close() function */
     1773        knote_fdclose(td, rtems_bsd_fp_to_fd(fp));
     1774#endif /* __rtems__ */
     1775
    16321776        if ((error = kqueue_acquire(fp, &kq)))
    16331777                return error;
     
    16421786
    16431787        KASSERT(kq->kq_refcnt == 1, ("other refs are out there!"));
     1788#ifndef __rtems__
    16441789        fdp = kq->kq_fdp;
     1790#else /* __rtems__ */
     1791        (void) fdp;
     1792#endif /* __rtems__ */
    16451793
    16461794        KASSERT(knlist_empty(&kq->kq_sel.si_note),
     
    16941842        KQ_UNLOCK(kq);
    16951843
     1844#ifndef __rtems__
    16961845        FILEDESC_XLOCK(fdp);
    16971846        SLIST_REMOVE(&fdp->fd_kqlist, kq, kqueue, kq_list);
    16981847        FILEDESC_XUNLOCK(fdp);
     1848#else /* __rtems__ */
     1849        rtems_libio_lock();
     1850        SLIST_REMOVE(&fd_kqlist, kq, kqueue, kq_list);
     1851        rtems_libio_unlock();
     1852#endif /* __rtems__ */
    16991853
    17001854        knlist_destroy(&kq->kq_sel.si_note);
    17011855        mtx_destroy(&kq->kq_lock);
     1856#ifndef __rtems__
    17021857        kq->kq_fdp = NULL;
     1858#endif /* __rtems__ */
    17031859
    17041860        if (kq->kq_knhash != NULL)
     
    17131869        return (0);
    17141870}
     1871#ifdef __rtems__
     1872static int
     1873rtems_bsd_kqueue_close(rtems_libio_t *iop)
     1874{
     1875        struct thread *td = rtems_bsd_get_curthread_or_null();
     1876        struct file *fp = rtems_bsd_iop_to_fp(iop);
     1877        int error;
     1878
     1879        if (td != NULL) {
     1880                error = kqueue_close(fp, td);
     1881        } else {
     1882                error = ENOMEM;
     1883        }
     1884
     1885        return rtems_bsd_error_to_status_and_errno(error);
     1886}
    17151887#endif /* __rtems__ */
    17161888
     
    17321904                kqueue_schedtask(kq);
    17331905        if ((kq->kq_state & KQ_ASYNC) == KQ_ASYNC) {
     1906#ifndef __rtems__
    17341907                pgsigio(&kq->kq_sigio, SIGIO, 0);
     1908#else /* __rtems__ */
     1909                BSD_ASSERT(0);
     1910#endif /* __rtems__ */
    17351911        }
    17361912}
     
    18492025}
    18502026
    1851 #ifndef __rtems__
    18522027/*
    18532028 * remove knote from a specified klist while in f_event handler.
     
    18602035            (kn->kn_status & KN_HASKQLOCK) == KN_HASKQLOCK);
    18612036}
    1862 #endif /* __rtems__ */
    18632037
    18642038int
     
    19542128}
    19552129
    1956 #ifndef __rtems__
    19572130/*
    19582131 * Even if we are locked, we may need to drop the lock to allow any influx
     
    20232196knote_fdclose(struct thread *td, int fd)
    20242197{
     2198#ifndef __rtems__
    20252199        struct filedesc *fdp = td->td_proc->p_fd;
     2200#endif /* __rtems__ */
    20262201        struct kqueue *kq;
    20272202        struct knote *kn;
     
    20342209         * since filedesc is locked.
    20352210         */
     2211#ifndef __rtems__
    20362212        SLIST_FOREACH(kq, &fdp->fd_kqlist, kq_list) {
     2213#else /* __rtems__ */
     2214        /* FIXME: Use separate lock? */
     2215        rtems_libio_lock();
     2216        SLIST_FOREACH(kq, &fd_kqlist, kq_list) {
     2217#endif /* __rtems__ */
    20372218                KQ_LOCK(kq);
    20382219
     
    20592240                KQ_UNLOCK_FLUX(kq);
    20602241        }
     2242#ifdef __rtems__
     2243        rtems_libio_unlock();
     2244#endif /* __rtems__ */
    20612245}
    20622246
     
    21212305        knote_free(kn);
    21222306}
    2123 #endif /* __rtems__ */
    21242307
    21252308static void
     
    21372320}
    21382321
    2139 #ifndef __rtems__
    21402322static void
    21412323knote_dequeue(struct knote *kn)
     
    21982380        return error;
    21992381}
    2200 #endif /* __rtems__ */
     2382#ifdef __rtems__
     2383static const rtems_filesystem_file_handlers_r kqueueops = {
     2384        .open_h = rtems_filesystem_default_open,
     2385        .close_h = rtems_bsd_kqueue_close,
     2386        .read_h = rtems_filesystem_default_read,
     2387        .write_h = rtems_filesystem_default_write,
     2388        .ioctl_h = rtems_filesystem_default_ioctl,
     2389        .lseek_h = rtems_filesystem_default_lseek,
     2390        .fstat_h = rtems_bsd_kqueue_stat,
     2391        .ftruncate_h = rtems_filesystem_default_ftruncate,
     2392        .fsync_h = rtems_filesystem_default_fsync_or_fdatasync,
     2393        .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
     2394        .fcntl_h = rtems_filesystem_default_fcntl,
     2395        .poll_h = rtems_bsd_kqueue_poll,
     2396        .kqfilter_h = rtems_bsd_kqueue_kqfilter
     2397};
     2398#endif /* __rtems__ */
  • freebsd/sys/kern/sys_socket.c

    rbae343a r0c9f27b  
    441441        struct socket *so;
    442442
     443#ifdef __rtems__
     444        /* FIXME: Move this to the RTEMS close() function */
     445        knote_fdclose(td, rtems_bsd_fp_to_fd(fp));
     446#endif /* __rtems__ */
     447
    443448        so = fp->f_data;
    444449#ifndef __rtems__
     
    475480        .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
    476481        .fcntl_h = rtems_filesystem_default_fcntl,
    477         .poll_h = rtems_bsd_soo_poll
     482        .poll_h = rtems_bsd_soo_poll,
     483        .kqfilter_h = rtems_bsd_soo_kqfilter
    478484};
    479485#endif /* __rtems__ */
  • freebsd/sys/kern/uipc_socket.c

    rbae343a r0c9f27b  
    29462946}
    29472947
     2948#ifdef __rtems__
     2949static
     2950#endif /* __rtems__ */
    29482951int
    29492952soo_kqfilter(struct file *fp, struct knote *kn)
     
    29742977        return (0);
    29752978}
     2979#ifdef __rtems__
     2980int
     2981rtems_bsd_soo_kqfilter(rtems_libio_t *iop, struct knote *kn)
     2982{
     2983        struct file *fp = rtems_bsd_iop_to_fp(iop);
     2984
     2985        return soo_kqfilter(fp, kn);
     2986}
     2987#endif /* __rtems__ */
    29762988
    29772989/*
  • freebsd/sys/sys/eventvar.h

    rbae343a r0c9f27b  
    4747        struct          selinfo kq_sel;
    4848        struct          sigio *kq_sigio;
     49#ifndef __rtems__
    4950        struct          filedesc *kq_fdp;
     51#endif /* __rtems__ */
    5052        int             kq_state;
    5153#define KQ_SEL          0x01
  • freebsd/sys/sys/file.h

    rbae343a r0c9f27b  
    299299fo_stat_t       soo_stat;
    300300fo_close_t      soo_close;
     301#else /* __rtems__ */
     302int rtems_bsd_soo_kqfilter(rtems_libio_t *iop, struct knote *kn);
    301303#endif /* __rtems__ */
    302304
     
    447449        return ((*fp->f_ops->fo_close)(fp, td));
    448450}
     451#endif /* __rtems__ */
    449452
    450453static __inline int
     
    454457{
    455458
     459#ifndef __rtems__
    456460        return ((*fp->f_ops->fo_kqfilter)(fp, kn));
    457 }
    458 #endif /* __rtems__ */
     461#else /* __rtems__ */
     462        return ((*fp->f_io.pathinfo.handlers->kqfilter_h)(&fp->f_io, kn));
     463#endif /* __rtems__ */
     464}
    459465
    460466#endif /* _KERNEL */
  • freebsd/sys/sys/sysproto.h

    rbae343a r0c9f27b  
    10791079        char sgid_l_[PADL_(gid_t *)]; gid_t * sgid; char sgid_r_[PADR_(gid_t *)];
    10801080};
     1081#endif /* __rtems__ */
    10811082struct kqueue_args {
    10821083        register_t dummy;
     
    10841085struct kevent_args {
    10851086        char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
     1087#ifndef __rtems__
    10861088        char changelist_l_[PADL_(struct kevent *)]; struct kevent * changelist; char changelist_r_[PADR_(struct kevent *)];
     1089#else /* __rtems__ */
     1090        char changelist_l_[PADL_(struct kevent *)]; const struct kevent * changelist; char changelist_r_[PADR_(struct kevent *)];
     1091#endif /* __rtems__ */
    10871092        char nchanges_l_[PADL_(int)]; int nchanges; char nchanges_r_[PADR_(int)];
    10881093        char eventlist_l_[PADL_(struct kevent *)]; struct kevent * eventlist; char eventlist_r_[PADR_(struct kevent *)];
     
    10901095        char timeout_l_[PADL_(const struct timespec *)]; const struct timespec * timeout; char timeout_r_[PADR_(const struct timespec *)];
    10911096};
     1097#ifndef __rtems__
    10921098struct extattr_set_fd_args {
    10931099        char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
  • libbsd.txt

    rbae343a r0c9f27b  
    9898
    9999* ZONE(9): Review allocator lock usage in rtems-bsd-chunk.c.
     100
     101* KQUEUE(2): Choose proper lock for global kqueue list.
    100102
    101103[listing]
  • rtemsbsd/include/machine/rtems-bsd-syscall-api.h

    rbae343a r0c9f27b  
    4646
    4747#include <sys/cdefs.h>
     48#include <sys/types.h>
     49#include <sys/event.h>
    4850#include <sys/poll.h>
    4951#include <sys/select.h>
    5052#include <sys/socket.h>
    5153#include <sys/sysctl.h>
     54#include <sys/time.h>
    5255
    5356__BEGIN_DECLS
     
    6972
    7073int     getsockopt(int, int, int, void * __restrict, socklen_t * __restrict);
     74
     75int     kqueue(void);
     76
     77int     kevent(int kq, const struct kevent *changelist, int nchanges,
     78            struct kevent *eventlist, int nevents,
     79            const struct timespec *timeout);
    7180
    7281int     listen(int, int);
  • testsuite/syscalls01/test_main.c

    rbae343a r0c9f27b  
    3232#include <sys/cdefs.h>
    3333#include <sys/types.h>
     34#include <sys/event.h>
    3435#include <sys/poll.h>
    3536#include <sys/stat.h>
    3637#include <sys/select.h>
    3738#include <sys/socket.h>
     39#include <sys/time.h>
    3840#include <sys/filio.h>
    3941#include <netinet/in.h>
     
    13551357}
    13561358
     1359static void
     1360test_kqueue_unsupported_ops(void)
     1361{
     1362        rtems_resource_snapshot snapshot;
     1363        int kq;
     1364        int rv;
     1365        off_t off;
     1366        ssize_t n;
     1367        char buf[1];
     1368
     1369        puts("test kqueue unsupported ops");
     1370
     1371        rtems_resource_snapshot_take(&snapshot);
     1372
     1373        kq = kqueue();
     1374        assert(kq >= 0);
     1375
     1376        errno = 0;
     1377        n = read(kq, &buf[0], sizeof(buf));
     1378        assert(n == -1);
     1379        assert(errno == ENOTSUP);
     1380
     1381        errno = 0;
     1382        n = write(kq, &buf[0], sizeof(buf));
     1383        assert(n == -1);
     1384        assert(errno == ENOTSUP);
     1385
     1386        errno = 0;
     1387        rv = ioctl(kq, 0);
     1388        assert(rv == -1);
     1389        assert(errno == ENOTSUP);
     1390
     1391        errno = 0;
     1392        off = lseek(kq, 0, SEEK_CUR);
     1393        assert(off == -1);
     1394        assert(errno == ESPIPE);
     1395
     1396        errno = 0;
     1397        rv = ftruncate(kq, 0);
     1398        assert(rv == -1);
     1399        assert(errno == EINVAL);
     1400
     1401        errno = 0;
     1402        rv = fsync(kq);
     1403        assert(rv == -1);
     1404        assert(errno == EINVAL);
     1405
     1406        errno = 0;
     1407        rv = fdatasync(kq);
     1408        assert(rv == -1);
     1409        assert(errno == EINVAL);
     1410
     1411        rv = close(kq);
     1412        assert(rv == 0);
     1413
     1414        assert(rtems_resource_snapshot_check(&snapshot));
     1415}
     1416
     1417static void
     1418no_mem_kqueue_fstat(int fd)
     1419{
     1420        struct stat st;
     1421        int rv;
     1422
     1423        rv = fstat(fd, &st);
     1424        assert(rv == 0);
     1425}
     1426
     1427static void
     1428test_kqueue_fstat(void)
     1429{
     1430        static const struct stat expected_st = {
     1431                .st_mode = S_IFIFO
     1432        };
     1433
     1434        rtems_resource_snapshot snapshot;
     1435        struct stat st;
     1436        int kq;
     1437        int rv;
     1438
     1439        puts("test kqueue fstat");
     1440
     1441        rtems_resource_snapshot_take(&snapshot);
     1442
     1443        kq = kqueue();
     1444        assert(kq >= 0);
     1445
     1446        do_no_mem_test(no_mem_kqueue_fstat, kq);
     1447
     1448        rv = fstat(kq, &st);
     1449        assert(rv == 0);
     1450        assert(memcmp(&expected_st, &st, sizeof(st)) == 0);
     1451
     1452        rv = close(kq);
     1453        assert(rv == 0);
     1454
     1455        assert(rtems_resource_snapshot_check(&snapshot));
     1456}
     1457
     1458static void
     1459no_mem_kqueue_kevent(int fd)
     1460{
     1461        int rv;
     1462
     1463        errno = 0;
     1464        rv = kevent(fd, NULL, 0, NULL, 0, NULL);
     1465        assert(rv == -1);
     1466        assert(errno == ENOMEM);
     1467}
     1468
     1469static void
     1470test_kqueue_kevent(void)
     1471{
     1472        rtems_resource_snapshot snapshot;
     1473        int kq;
     1474        int rv;
     1475
     1476        puts("test kqueue kevent");
     1477
     1478        rtems_resource_snapshot_take(&snapshot);
     1479
     1480        kq = kqueue();
     1481        assert(kq >= 0);
     1482
     1483        do_no_mem_test(no_mem_kqueue_kevent, kq);
     1484
     1485        rv = kevent(kq, NULL, 0, NULL, 0, NULL);
     1486        assert(rv == 0);
     1487
     1488        rv = close(kq);
     1489        assert(rv == 0);
     1490
     1491        errno = 0;
     1492        rv = kevent(kq, NULL, 0, NULL, 0, NULL);
     1493        assert(rv == -1);
     1494        assert(errno == EBADF);
     1495
     1496        errno = 0;
     1497        rv = kevent(0, NULL, 0, NULL, 0, NULL);
     1498        assert(rv == -1);
     1499        assert(errno == EBADF);
     1500
     1501        assert(rtems_resource_snapshot_check(&snapshot));
     1502}
     1503
    13571504static const char prog_name[] = "prog";
    13581505
     
    15641711        test_socket_poll();
    15651712
     1713        test_kqueue_unsupported_ops();
     1714        test_kqueue_fstat();
     1715        test_kqueue_kevent();
     1716
    15661717        test_bsd_program();
    15671718        test_warn();
Note: See TracChangeset for help on using the changeset viewer.