[PD-dev] Proper way of storing a list in C

Giulio Moro giuliomoro at yahoo.it
Thu Dec 21 22:31:24 CET 2017


Apologies for that, this is the yahoo web client which sometimes switches back from plain text to HTML.
Below here I re-pasted the original email (hopefully will show up nicely now).

Anyhow, I rolled my own implementation of it, see lines 362-531 below:

https://github.com/giuliomoro/pure-data/blob/threaded-sigmund/extra/sigmund~/sigmund~.c#L362-L531

Feedback welcome!

Giulio

Original email:

Hello,
I am trying to implement a threaded equivalent of outlet_list(), which recursively copies the content of a list (symbol, argc, argv) into a ringbuffer at one end (worker thread) and retrieves them at the other end (audio thread). I have been looking through the Pd source code in and out but could not find a suitable function, except perhaps for those implemented in the [list] class, but they are not meant to be accessible from outside (static!).
What is the best way of doing this?
Thanks

For reference, here is some code:
----------------
a) this is the (working!) ringbuffer implementation I have for outlet_float:

  struct t_outletrb_float_msg {
      t_outlet* outlet;
      t_float f;
  };

// call this from the audio thread
  void outletrb_floatprocess(ring_buffer* rb)
  {
      while(rb_available_to_read(rb) > sizeof(struct t_outletrb_float_msg))
      {
          struct t_outletrb_float_msg msg;
          rb_read_from_buffer(rb, (char*)&msg, sizeof(msg));
          t_outlet* x = msg.outlet;
          t_float f = msg.f;
          outlet_float(x, f);
      }
  }

// call this from the worker thread
void outletrb_float(ring_buffer* rb, t_outlet *x, t_float f)
  {
      struct t_outletrb_float_msg msg;
      msg.outlet = x;
      msg.f = f;
      rb_write_to_buffer(rb, 1, (char*)&msg, sizeof(msg));
  }

-------------------
b) and this is the INCOMPLETE ringbuffer implementation of outlet_list:

  struct t_outletrb_list_msg {
      t_outlet* outlet;
      t_symbol* s;
      int argc;
      t_atom* argv;
  }
// call this from the audio thread
  void outletrb_listprocess(ring_buffer* rb)
  {
///// retrieve the data from rb and use them for outlet_list();
  }

// call this from the worker thread
  void outletrb_list(ring_buffer* rb, t_outlet *x, t_symbol *s, int argc, t_atom *argv)
  {
//??????? this is the function I am trying to figure out
  }



More information about the Pd-dev mailing list