]> sigrok.org Git - libsigrok.git/blobdiff - src/soft-trigger.c
Doxygen: Properly mark a few symbols as private.
[libsigrok.git] / src / soft-trigger.c
index 27c71b611b4a82546c7c0cf35eda99a30fe40dab..0c5bb466da416100719f617c397badf7f4ca8d63 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <config.h>
 #include <string.h>
-#include "libsigrok.h"
+#include <libsigrok/libsigrok.h>
 #include "libsigrok-internal.h"
 
-/* @cond PRIVATE */
+/** @cond PRIVATE */
 #define LOG_PREFIX "soft-trigger"
-/* @endcond */
+/** @endcond */
+
+SR_PRIV int logic_channel_unitsize(GSList *channels)
+{
+       int number = 0;
+       struct sr_channel *channel;
+       GSList *l;
+
+       for (l = channels; l; l = l->next) {
+               channel = l->data;
+               if (channel->type == SR_CHANNEL_LOGIC)
+                       number++;
+       }
+
+       return (number + 7) / 8;
+}
 
 SR_PRIV struct soft_trigger_logic *soft_trigger_logic_new(
                const struct sr_dev_inst *sdi, struct sr_trigger *trigger,
@@ -34,13 +50,22 @@ SR_PRIV struct soft_trigger_logic *soft_trigger_logic_new(
        stl = g_malloc0(sizeof(struct soft_trigger_logic));
        stl->sdi = sdi;
        stl->trigger = trigger;
-       stl->unitsize = (g_slist_length(sdi->channels) + 7) / 8;
+       stl->unitsize = logic_channel_unitsize(sdi->channels);
        stl->prev_sample = g_malloc0(stl->unitsize);
        stl->pre_trigger_size = stl->unitsize * pre_trigger_samples;
-       stl->pre_trigger_buffer = g_malloc(stl->pre_trigger_size);
+       stl->pre_trigger_buffer = g_try_malloc(stl->pre_trigger_size);
+       if (pre_trigger_samples > 0 && !stl->pre_trigger_buffer) {
+               /*
+                * Error out if g_try_malloc() failed (or was invoked as
+                * g_try_malloc(0)) *and* more than 0 pretrigger samples
+                * were requested.
+                */
+               soft_trigger_logic_free(stl);
+               return NULL;
+       }
        stl->pre_trigger_head = stl->pre_trigger_buffer;
 
-       if (stl->pre_trigger_size > 0 && stl->pre_trigger_buffer == NULL) {
+       if (stl->pre_trigger_size > 0 && !stl->pre_trigger_buffer) {
                soft_trigger_logic_free(stl);
                return NULL;
        }