From 731410fef0533e0056ffa39d9708e61944e9459c Mon Sep 17 00:00:00 2001 From: marius Date: Tue, 26 Apr 2011 20:12:28 +0000 Subject: [PATCH] EVFILT_USER implementation on windows Change VS Solution structure to be more well-arranged git-svn-id: svn://svn.code.sf.net/p/libkqueue/code/trunk@490 fb4e3144-bc1c-4b72-a658-5bcd248dd7f7 --- libkqueue.vcxproj | 1 + libkqueue.vcxproj.filters | 67 ++++++++++++++++++++ src/windows/platform.c | 1 - src/windows/user.c | 127 ++++++++++++++++++++++++++++++++++++++ test/common.h | 1 + 5 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 libkqueue.vcxproj.filters create mode 100644 src/windows/user.c diff --git a/libkqueue.vcxproj b/libkqueue.vcxproj index 09a7912..361b083 100644 --- a/libkqueue.vcxproj +++ b/libkqueue.vcxproj @@ -78,6 +78,7 @@ + diff --git a/libkqueue.vcxproj.filters b/libkqueue.vcxproj.filters new file mode 100644 index 0000000..986e4f4 --- /dev/null +++ b/libkqueue.vcxproj.filters @@ -0,0 +1,67 @@ + + + + + common + + + common + + + common + + + common + + + common + + + windows + + + windows + + + windows + + + windows + + + windows + + + + + common + + + common + + + common + + + common + + + windows + + + windows + + + windows + + + + + + {d00529d5-005e-4a55-950f-987dc27e5101} + + + {11f5eddb-b2fe-4fc5-9733-f52ee80e8a4c} + + + \ No newline at end of file diff --git a/src/windows/platform.c b/src/windows/platform.c index 94af24f..5527112 100644 --- a/src/windows/platform.c +++ b/src/windows/platform.c @@ -33,7 +33,6 @@ const struct filter evfilt_proc = EVFILT_NOTIMPL; const struct filter evfilt_vnode = EVFILT_NOTIMPL; const struct filter evfilt_signal = EVFILT_NOTIMPL; const struct filter evfilt_write = EVFILT_NOTIMPL; -const struct filter evfilt_user = EVFILT_NOTIMPL; const struct kqueue_vtable kqops = { windows_kqueue_init, diff --git a/src/windows/user.c b/src/windows/user.c new file mode 100644 index 0000000..bdbc1bf --- /dev/null +++ b/src/windows/user.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2009 Mark Heily + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../common/private.h" + +int +evfilt_user_init(struct filter *filt) +{ + return (0); +} + +void +evfilt_user_destroy(struct filter *filt) +{ +} + +int +evfilt_user_copyout(struct kevent* dst, struct knote* src, void* ptr) +{ + memcpy(dst, &src->kev, sizeof(struct kevent)); + + dst->fflags &= ~NOTE_FFCTRLMASK; //FIXME: Not sure if needed + dst->fflags &= ~NOTE_TRIGGER; + if (src->kev.flags & EV_ADD) { + /* NOTE: True on FreeBSD but not consistent behavior with + other filters. */ + dst->flags &= ~EV_ADD; + } + if (src->kev.flags & EV_CLEAR) + src->kev.fflags &= ~NOTE_TRIGGER; + + if (src->kev.flags & EV_DISPATCH) + src->kev.fflags &= ~NOTE_TRIGGER; + + return (0); +} + +int +evfilt_user_knote_create(struct filter *filt, struct knote *kn) +{ + return (0); +} + +int +evfilt_user_knote_modify(struct filter *filt, struct knote *kn, + const struct kevent *kev) +{ + unsigned int ffctrl; + unsigned int fflags; + + /* Excerpted from sys/kern/kern_event.c in FreeBSD HEAD */ + ffctrl = kev->fflags & NOTE_FFCTRLMASK; + fflags = kev->fflags & NOTE_FFLAGSMASK; + switch (ffctrl) { + case NOTE_FFNOP: + break; + + case NOTE_FFAND: + kn->kev.fflags &= fflags; + break; + + case NOTE_FFOR: + kn->kev.fflags |= fflags; + break; + + case NOTE_FFCOPY: + kn->kev.fflags = fflags; + break; + + default: + /* XXX Return error? */ + break; + } + + if ((!(kn->kev.flags & EV_DISABLE)) && kev->fflags & NOTE_TRIGGER) { + kn->kev.fflags |= NOTE_TRIGGER; + if (!PostQueuedCompletionStatus(kn->kn_kq->kq_iocp, 1, (ULONG_PTR) 0, (LPOVERLAPPED) kn)) { + dbg_lasterror("PostQueuedCompletionStatus()"); + return (-1); + } + } + + return (0); +} + +int +evfilt_user_knote_delete(struct filter *filt, struct knote *kn) +{ + return (0); +} + +int +evfilt_user_knote_enable(struct filter *filt, struct knote *kn) +{ + return evfilt_user_knote_create(filt, kn); +} + +int +evfilt_user_knote_disable(struct filter *filt, struct knote *kn) +{ + return evfilt_user_knote_delete(filt, kn); +} + +const struct filter evfilt_user = { + EVFILT_USER, + evfilt_user_init, + evfilt_user_destroy, + evfilt_user_copyout, + evfilt_user_knote_create, + evfilt_user_knote_modify, + evfilt_user_knote_delete, + evfilt_user_knote_enable, + evfilt_user_knote_disable, +}; \ No newline at end of file diff --git a/test/common.h b/test/common.h index 6405269..081d1d6 100644 --- a/test/common.h +++ b/test/common.h @@ -51,6 +51,7 @@ #else # include "../include/sys/event.h" # include "../src/windows/platform.h" +# define HAVE_EVFILT_USER 1 #endif