From: Daniel Elstner Date: Fri, 9 Oct 2015 17:46:14 +0000 (+0200) Subject: session: Make event source injection API private X-Git-Tag: libsigrok-0.4.0~215 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=ee9953ef12514d833c6719777dfc285d56c0ffc1;p=libsigrok.git session: Make event source injection API private Also remove the corresponding functionality from the bindings. --- diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index f40a6dc5..af10e8ea 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -872,55 +872,6 @@ void DatafeedCallbackData::run(const struct sr_dev_inst *sdi, _callback(device, packet); } -SourceCallbackData::SourceCallbackData(shared_ptr source) : - _source(source) -{ -} - -bool SourceCallbackData::run(int revents) -{ - return _source->_callback((Glib::IOCondition) revents); -} - -shared_ptr EventSource::create(int fd, Glib::IOCondition events, - int timeout, SourceCallbackFunction callback) -{ - auto result = new EventSource(timeout, callback); - result->_type = EventSource::SOURCE_FD; - result->_fd = fd; - result->_events = events; - return shared_ptr(result, EventSource::Deleter()); -} - -shared_ptr EventSource::create(Glib::PollFD pollfd, int timeout, - SourceCallbackFunction callback) -{ - auto result = new EventSource(timeout, callback); - result->_type = EventSource::SOURCE_POLLFD; - result->_pollfd = pollfd; - return shared_ptr(result, EventSource::Deleter()); -} - -shared_ptr EventSource::create(Glib::RefPtr channel, - Glib::IOCondition events, int timeout, SourceCallbackFunction callback) -{ - auto result = new EventSource(timeout, callback); - result->_type = EventSource::SOURCE_IOCHANNEL; - result->_channel = channel; - result->_events = events; - return shared_ptr(result, EventSource::Deleter()); -} - -EventSource::EventSource(int timeout, SourceCallbackFunction callback) : - _timeout(timeout), - _callback(callback) -{ -} - -EventSource::~EventSource() -{ -} - SessionDevice::SessionDevice(struct sr_dev_inst *structure) : ParentOwned(structure), Device(structure) @@ -967,9 +918,6 @@ Session::~Session() for (auto callback : _datafeed_callbacks) delete callback; - for (auto entry : _source_callbacks) - delete entry.second; - for (auto entry : _owned_devices) delete entry.second; } @@ -1073,66 +1021,6 @@ void Session::remove_datafeed_callbacks(void) _datafeed_callbacks.clear(); } -static int source_callback(int fd, int revents, void *cb_data) -{ - (void) fd; - auto callback = (SourceCallbackData *) cb_data; - return callback->run(revents); -} - -void Session::add_source(shared_ptr source) -{ - if (_source_callbacks.count(source) == 1) - throw Error(SR_ERR_ARG); - - auto cb_data = new SourceCallbackData(source); - - switch (source->_type) - { - case EventSource::SOURCE_FD: - check(sr_session_source_add(_structure, source->_fd, source->_events, - source->_timeout, source_callback, cb_data)); - break; - case EventSource::SOURCE_POLLFD: - check(sr_session_source_add_pollfd(_structure, - source->_pollfd.gobj(), source->_timeout, source_callback, - cb_data)); - break; - case EventSource::SOURCE_IOCHANNEL: - check(sr_session_source_add_channel(_structure, - source->_channel->gobj(), source->_events, source->_timeout, - source_callback, cb_data)); - break; - } - - _source_callbacks[source] = cb_data; -} - -void Session::remove_source(shared_ptr source) -{ - if (_source_callbacks.count(source) == 0) - throw Error(SR_ERR_ARG); - - switch (source->_type) - { - case EventSource::SOURCE_FD: - check(sr_session_source_remove(_structure, source->_fd)); - break; - case EventSource::SOURCE_POLLFD: - check(sr_session_source_remove_pollfd(_structure, - source->_pollfd.gobj())); - break; - case EventSource::SOURCE_IOCHANNEL: - check(sr_session_source_remove_channel(_structure, - source->_channel->gobj())); - break; - } - - delete _source_callbacks[source]; - - _source_callbacks.erase(source); -} - shared_ptr Session::trigger() { return _trigger; diff --git a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp index 2441c2c3..b000e4cd 100644 --- a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp +++ b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp @@ -91,7 +91,6 @@ class SR_API Driver; class SR_API Device; class SR_API HardwareDevice; class SR_API Channel; -class SR_API EventSource; class SR_API Session; class SR_API ConfigKey; class SR_API InputFormat; @@ -610,71 +609,6 @@ protected: friend class Session; }; -/** Type of source callback */ -typedef function - SourceCallbackFunction; - -/* Data required for C callback function to call a C++ source callback */ -class SR_PRIV SourceCallbackData -{ -public: - bool run(int revents); -protected: - SourceCallbackData(shared_ptr source); - shared_ptr _source; - friend class Session; -}; - -/** An I/O event source */ -class SR_API EventSource -{ -public: - /** Create an event source from a file descriptor. - * @param fd File descriptor. - * @param events GLib IOCondition event mask. - * @param timeout Timeout in milliseconds. - * @param callback Callback of the form callback(events) */ - static shared_ptr create(int fd, Glib::IOCondition events, - int timeout, SourceCallbackFunction callback); - /** Create an event source from a GLib PollFD - * @param pollfd GLib PollFD - * @param timeout Timeout in milliseconds. - * @param callback Callback of the form callback(events) */ - static shared_ptr create(Glib::PollFD pollfd, int timeout, - SourceCallbackFunction callback); - /** Create an event source from a GLib IOChannel - * @param channel GLib IOChannel. - * @param events GLib IOCondition event mask. - * @param timeout Timeout in milliseconds. - * @param callback Callback of the form callback(events) */ - static shared_ptr create( - Glib::RefPtr channel, Glib::IOCondition events, - int timeout, SourceCallbackFunction callback); -protected: - EventSource(int timeout, SourceCallbackFunction callback); - ~EventSource(); - enum source_type { - SOURCE_FD, - SOURCE_POLLFD, - SOURCE_IOCHANNEL - } _type; - int _fd; - Glib::PollFD _pollfd; - Glib::RefPtr _channel; - Glib::IOCondition _events; - int _timeout; - SourceCallbackFunction _callback; - /** Deleter needed to allow shared_ptr use with protected destructor. */ - class Deleter - { - public: - void operator()(EventSource *source) { delete source; } - }; - friend class Deleter; - friend class Session; - friend class SourceCallbackData; -}; - /** A virtual device associated with a stored session */ class SR_API SessionDevice : public ParentOwned, @@ -710,12 +644,6 @@ public: void add_datafeed_callback(DatafeedCallbackFunction callback); /** Remove all datafeed callbacks from this session. */ void remove_datafeed_callbacks(); - /** Add an I/O event source. - * @param source EventSource to add. */ - void add_source(shared_ptr source); - /** Remove an event source. - * @param source EventSource to remove. */ - void remove_source(shared_ptr source); /** Start the session. */ void start(); /** Run the session event loop. */ @@ -745,7 +673,6 @@ protected: map > _other_devices; vector _datafeed_callbacks; SessionStoppedCallback _stopped_callback; - map, SourceCallbackData *> _source_callbacks; string _filename; shared_ptr _trigger; friend class Deleter; diff --git a/bindings/java/org/sigrok/core/classes/classes.i b/bindings/java/org/sigrok/core/classes/classes.i index 9979a618..5cf25836 100644 --- a/bindings/java/org/sigrok/core/classes/classes.i +++ b/bindings/java/org/sigrok/core/classes/classes.i @@ -36,21 +36,8 @@ import org.sigrok.core.interfaces.LogCallback; import org.sigrok.core.interfaces.DatafeedCallback; -import org.sigrok.core.interfaces.SourceCallback; %} -/* Map Java FileDescriptor objects to int fds */ -%typemap(jni) int fd "jobject" -%typemap(jtype) int fd "java.io.FileDescriptor" -%typemap(jstype) int fd "java.io.FileDescriptor" -%typemap(javain) int fd "$javainput" - -%typemap(in) int fd { - jclass FileDescriptor = jenv->FindClass("java/io/FileDescriptor"); - jfieldID fd = jenv->GetFieldID(FileDescriptor, "fd", "I"); - $1 = jenv->GetIntField($input, fd); -} - /* Map Glib::VariantBase to a Variant class in Java */ %rename(Variant) VariantBase; namespace Glib { @@ -346,41 +333,6 @@ typedef jobject jdatafeedcallback; } } -/* Support Java event source callbacks. */ - -%typemap(javaimports) sigrok::EventSource - "import org.sigrok.core.interfaces.SourceCallback;" - -%inline { -typedef jobject jsourcecallback; -} - -%typemap(jni) jsourcecallback "jsourcecallback" -%typemap(jtype) jsourcecallback "SourceCallback" -%typemap(jstype) jsourcecallback "SourceCallback" -%typemap(javain) jsourcecallback "$javainput" - -%extend sigrok::EventSource -{ - std::shared_ptr create( - int fd, Glib::IOCondition events, int timeout, - JNIEnv *env, jsourcecallback obj) - { - (void) $self; - jclass obj_class = env->GetObjectClass(obj); - jmethodID method = env->GetMethodID(obj_class, "run", "(I)V"); - jobject obj_ref = env->NewGlobalRef(obj); - - return sigrok::EventSource::create(fd, events, timeout, [=] (int revents) - { - bool result = env->CallBooleanMethod(obj_ref, method, revents); - if (env->ExceptionCheck()) - throw sigrok::Error(SR_ERR); - return result; - }); - } -} - %include "doc.i" %define %attributevector(Class, Type, Name, Get) diff --git a/bindings/python/sigrok/core/classes.i b/bindings/python/sigrok/core/classes.i index 93e03ef2..856038ee 100644 --- a/bindings/python/sigrok/core/classes.i +++ b/bindings/python/sigrok/core/classes.i @@ -51,8 +51,6 @@ which provides access to the error code and description." PyObject *PyGObject_lib; PyObject *GLib; -PyTypeObject *IOChannel; -PyTypeObject *PollFD; #include "config.h" @@ -81,8 +79,6 @@ typedef guint pyg_flags_type; return; #endif } - IOChannel = (PyTypeObject *) PyObject_GetAttrString(GLib, "IOChannel"); - PollFD = (PyTypeObject *) PyObject_GetAttrString(GLib, "PollFD"); import_array(); %} @@ -91,15 +87,6 @@ typedef guint pyg_flags_type; $1 = (PyObject_AsFileDescriptor($input) != -1); } -%typemap(in) int fd { - int fd = PyObject_AsFileDescriptor($input); - if (fd == -1) - SWIG_exception(SWIG_TypeError, - "Expected file object or integer file descriptor"); - else - $1 = fd; -} - /* Map from Glib::Variant to native Python types. */ %typemap(out) Glib::VariantBase { GValue *value = g_new0(GValue, 1); @@ -113,113 +100,6 @@ typedef guint pyg_flags_type; g_free(value); } -/* Map from Glib::IOCondition to GLib.IOCondition. */ -%typecheck(SWIG_TYPECHECK_POINTER) Glib::IOCondition { - pyg_flags_type flags; - $1 = pygobject_check($input, &PyGFlags_Type) && - (pyg_flags_get_value(G_TYPE_IO_CONDITION, $input, &flags) != -1); -} - -%typemap(in) Glib::IOCondition { - if (!pygobject_check($input, &PyGFlags_Type)) - SWIG_exception(SWIG_TypeError, "Expected GLib.IOCondition value"); - pyg_flags_type flags; - if (pyg_flags_get_value(G_TYPE_IO_CONDITION, $input, &flags) == -1) - SWIG_exception(SWIG_TypeError, "Not a valid Glib.IOCondition value"); - $1 = (Glib::IOCondition) flags; -} - -/* And back */ -%typemap(out) Glib::IOCondition { - GValue *value = g_new0(GValue, 1); - g_value_init(value, G_TYPE_IO_CONDITION); - g_value_set_flags(value, &$1); - $result = pyg_value_as_pyobject(value, true); - g_free(value); -} - -/* Map from GLib.PollFD to Glib::PollFD *. */ -%typecheck(SWIG_TYPECHECK_POINTER) Glib::PollFD { - $1 = pygobject_check($input, PollFD); -} - -%typemap(in) Glib::PollFD { - if (!pygobject_check($input, PollFD)) - SWIG_exception(SWIG_TypeError, "Expected GLib.PollFD"); - PyObject *fd_obj = PyObject_GetAttrString($input, "fd"); - PyObject *events_obj = PyObject_GetAttrString($input, "events"); - pyg_flags_type flags; - pyg_flags_get_value(G_TYPE_IO_CONDITION, events_obj, &flags); - int fd = PyInt_AsLong(fd_obj); - Glib::IOCondition events = (Glib::IOCondition) flags; - $1 = Glib::PollFD(fd, events); -} - -/* Map from GLib.IOChannel to Glib::IOChannel *. */ -%typecheck(SWIG_TYPECHECK_POINTER) Glib::RefPtr { - $1 = pygobject_check($input, IOChannel); -} - -%typemap(in) Glib::RefPtr { - if (!pygobject_check($input, IOChannel)) - SWIG_exception(SWIG_TypeError, "Expected GLib.IOChannel"); - $1 = Glib::wrap((GIOChannel *) PyObject_Hash($input), true); -} - -/* Map from callable PyObject to SourceCallbackFunction. */ -%typecheck(SWIG_TYPECHECK_POINTER) sigrok::SourceCallbackFunction { - $1 = PyCallable_Check($input); -} - -%typemap(in) sigrok::SourceCallbackFunction { - if (!PyCallable_Check($input)) - SWIG_exception(SWIG_TypeError, "Expected a callable Python object"); - - $1 = [=] (Glib::IOCondition revents) { - auto gstate = PyGILState_Ensure(); - - GValue *value = g_new0(GValue, 1); - g_value_init(value, G_TYPE_IO_CONDITION); - g_value_set_flags(value, revents); - auto revents_obj = pyg_value_as_pyobject(value, true); - g_free(value); - - auto arglist = Py_BuildValue("(O)", revents_obj); - - auto result = PyEval_CallObject($input, arglist); - - Py_XDECREF(arglist); - Py_XDECREF(revents_obj); - - bool completed = !PyErr_Occurred(); - - if (!completed) - PyErr_Print(); - - bool valid_result = (completed && PyBool_Check(result)); - - if (completed && !valid_result) - { - PyErr_SetString(PyExc_TypeError, - "EventSource callback did not return a boolean"); - PyErr_Print(); - } - - bool retval = (valid_result && result == Py_True); - - Py_XDECREF(result); - - PyGILState_Release(gstate); - - if (!valid_result) - throw sigrok::Error(SR_ERR); - - return retval; - }; - - Py_XINCREF($input); -} - /* Map from callable PyObject to LogCallbackFunction */ %typecheck(SWIG_TYPECHECK_POINTER) sigrok::LogCallbackFunction { $1 = PyCallable_Check($input); diff --git a/bindings/swig/classes.i b/bindings/swig/classes.i index 8f57e418..309bd340 100644 --- a/bindings/swig/classes.i +++ b/bindings/swig/classes.i @@ -66,7 +66,6 @@ template< class T > class enable_shared_from_this; %shared_ptr(sigrok::HardwareDevice); %shared_ptr(sigrok::Channel); %shared_ptr(sigrok::ChannelGroup); -%shared_ptr(sigrok::EventSource); %shared_ptr(sigrok::Session); %shared_ptr(sigrok::SessionDevice); %shared_ptr(sigrok::Packet); @@ -138,7 +137,6 @@ template< class T > class enable_shared_from_this; #define SR_PRIV %ignore sigrok::DatafeedCallbackData; -%ignore sigrok::SourceCallbackData; #define SWIG_ATTRIBUTE_TEMPLATE diff --git a/include/libsigrok/proto.h b/include/libsigrok/proto.h index afc89dbc..d42967fc 100644 --- a/include/libsigrok/proto.h +++ b/include/libsigrok/proto.h @@ -128,20 +128,6 @@ SR_API int sr_session_is_running(struct sr_session *session); SR_API int sr_session_stopped_callback_set(struct sr_session *session, sr_session_stopped_callback cb, void *cb_data); -SR_API int sr_session_source_add(struct sr_session *session, int fd, - int events, int timeout, sr_receive_data_callback cb, void *cb_data); -SR_API int sr_session_source_add_pollfd(struct sr_session *session, - GPollFD *pollfd, int timeout, sr_receive_data_callback cb, - void *cb_data); -SR_API int sr_session_source_add_channel(struct sr_session *session, - GIOChannel *channel, int events, int timeout, - sr_receive_data_callback cb, void *cb_data); -SR_API int sr_session_source_remove(struct sr_session *session, int fd); -SR_API int sr_session_source_remove_pollfd(struct sr_session *session, - GPollFD *pollfd); -SR_API int sr_session_source_remove_channel(struct sr_session *session, - GIOChannel *channel); - /*--- input/input.c ---------------------------------------------------------*/ SR_API const struct sr_input_module **sr_input_list(void); diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 184c3831..95ac98f1 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -730,6 +730,21 @@ SR_PRIV int sr_session_source_destroyed(struct sr_session *session, SR_PRIV int sr_session_fd_source_add(struct sr_session *session, void *key, gintptr fd, int events, int timeout, sr_receive_data_callback cb, void *cb_data); + +SR_PRIV int sr_session_source_add(struct sr_session *session, int fd, + int events, int timeout, sr_receive_data_callback cb, void *cb_data); +SR_PRIV int sr_session_source_add_pollfd(struct sr_session *session, + GPollFD *pollfd, int timeout, sr_receive_data_callback cb, + void *cb_data); +SR_PRIV int sr_session_source_add_channel(struct sr_session *session, + GIOChannel *channel, int events, int timeout, + sr_receive_data_callback cb, void *cb_data); +SR_PRIV int sr_session_source_remove(struct sr_session *session, int fd); +SR_PRIV int sr_session_source_remove_pollfd(struct sr_session *session, + GPollFD *pollfd); +SR_PRIV int sr_session_source_remove_channel(struct sr_session *session, + GIOChannel *channel); + SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *packet); SR_PRIV int sr_sessionfile_check(const char *filename); diff --git a/src/session.c b/src/session.c index 3750cdc0..993d9bdf 100644 --- a/src/session.c +++ b/src/session.c @@ -1132,10 +1132,13 @@ SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi, * @param session The session to use. Must not be NULL. * @param key The key which identifies the event source. * @param source An event source object. Must not be NULL. + * * @retval SR_OK Success. * @retval SR_ERR_ARG Invalid argument. * @retval SR_ERR_BUG Event source with @a key already installed. * @retval SR_ERR Other error. + * + * @private */ SR_PRIV int sr_session_source_add_internal(struct sr_session *session, void *key, GSource *source) @@ -1192,8 +1195,9 @@ SR_PRIV int sr_session_fd_source_add(struct sr_session *session, * @retval SR_ERR_ARG Invalid argument. * * @since 0.3.0 + * @private */ -SR_API int sr_session_source_add(struct sr_session *session, int fd, +SR_PRIV int sr_session_source_add(struct sr_session *session, int fd, int events, int timeout, sr_receive_data_callback cb, void *cb_data) { if (fd < 0 && timeout < 0) { @@ -1218,8 +1222,9 @@ SR_API int sr_session_source_add(struct sr_session *session, int fd, * @retval SR_ERR_ARG Invalid argument. * * @since 0.3.0 + * @private */ -SR_API int sr_session_source_add_pollfd(struct sr_session *session, +SR_PRIV int sr_session_source_add_pollfd(struct sr_session *session, GPollFD *pollfd, int timeout, sr_receive_data_callback cb, void *cb_data) { @@ -1246,8 +1251,9 @@ SR_API int sr_session_source_add_pollfd(struct sr_session *session, * @retval SR_ERR_ARG Invalid argument. * * @since 0.3.0 + * @private */ -SR_API int sr_session_source_add_channel(struct sr_session *session, +SR_PRIV int sr_session_source_add_channel(struct sr_session *session, GIOChannel *channel, int events, int timeout, sr_receive_data_callback cb, void *cb_data) { @@ -1278,6 +1284,8 @@ SR_API int sr_session_source_add_channel(struct sr_session *session, * * @retval SR_OK Success * @retval SR_ERR_BUG No event source for poll_object found. + * + * @private */ SR_PRIV int sr_session_source_remove_internal(struct sr_session *session, void *key) @@ -1309,8 +1317,9 @@ SR_PRIV int sr_session_source_remove_internal(struct sr_session *session, * @retval SR_ERR_BUG Internal error. * * @since 0.3.0 + * @private */ -SR_API int sr_session_source_remove(struct sr_session *session, int fd) +SR_PRIV int sr_session_source_remove(struct sr_session *session, int fd) { return sr_session_source_remove_internal(session, GINT_TO_POINTER(fd)); } @@ -1326,8 +1335,9 @@ SR_API int sr_session_source_remove(struct sr_session *session, int fd) * internal errors. * * @since 0.2.0 + * @private */ -SR_API int sr_session_source_remove_pollfd(struct sr_session *session, +SR_PRIV int sr_session_source_remove_pollfd(struct sr_session *session, GPollFD *pollfd) { if (!pollfd) { @@ -1348,8 +1358,9 @@ SR_API int sr_session_source_remove_pollfd(struct sr_session *session, * @return SR_ERR_BUG Internal error. * * @since 0.2.0 + * @private */ -SR_API int sr_session_source_remove_channel(struct sr_session *session, +SR_PRIV int sr_session_source_remove_channel(struct sr_session *session, GIOChannel *channel) { if (!channel) { @@ -1370,6 +1381,8 @@ SR_API int sr_session_source_remove_channel(struct sr_session *session, * @retval SR_OK Success. * @retval SR_ERR_BUG Event source for @a key does not match @a source. * @retval SR_ERR Other error. + * + * @private */ SR_PRIV int sr_session_source_destroyed(struct sr_session *session, void *key, GSource *source)