Found the problem, of course, bad pointer handling. But any feeback on how
my code looks would still be welcome.

Thanks
Iain

On Fri, Dec 30, 2011 at 11:16 AM, Iain Duncan <[email protected]>wrote:

> Hi folks, wondering if anyone might be able to point me at the way to sort
> this out, my latest queue is segfaulting when written to or read from,
> while the rest ( which are supposed to be identical except for message type
> ) are working great, and have been tested with full stack runs fine. I'm
> banging my head on the desk at this point trying to find the difference,
> but perhaps others have seen similar behaviour?
>
> I've made a template class for a queue, that internally uses a jack
> ringbuffer. I have four of them, some of my data message struct, one for a
> csound note message struct, and a new one for my raw midi message struct
> which looks this this:
>
> struct MidiMessage {
>    char status;
>    char data_1;
>    char data_2;
>    int time; // time in samples when midi message arrived
> };
>
> I instantiate them before anything else and pass them into the components
> that need them in their constructors
>
> MessageQueue<DataMessage> *toEngineDataQueue = new
> MessageQueue<DataMessage>();
> MessageQueue<DataMessage> *fromEngineDataQueue = new
> MessageQueue<DataMessage>();
> MessageQueue<NoteMessage> *toEngineNoteQueue = new
> MessageQueue<NoteMessage>();
> MessageQueue<MidiMessage> *fromEngineMidiQueue = new
> MessageQueue<MidiMessage>();
>
> All instantiation is working fine, app starts up, and the first three
> queues are working. As soon as I either write to or read from the midi
> queue, I segfault. Not sure how to debug this, hints welcome! Below is the
> cue code in case anyone wants to look at it. I can't see anything wrong,
> but maybe I've been doing something wrong and just gotten lucky so far??
>
> thanks
> Iain
>
> template <class Type>
> class MessageQueue {
>
>    private:
>    // pointer to the ring buffer the ring buffer
>    jack_ringbuffer_t *mRingBuffer;
>    int mQueueLength;
>
>    public:
>     MessageQueue();
>     ~MessageQueue();
>
>    // put a msg on the queue, returns 0 or error code
>    void push( Type msg );
>    // store message in msg, returns true if message
>    bool tryPop( Type *msg );
> };
>
> template <class Type>
> MessageQueue<Type>::MessageQueue(){
>
>    mQueueLength = DEFAULT_QUEUE_LENGTH;
>    // create our ringbuffer, sized by Type
>    mRingBuffer = jack_ringbuffer_create( mQueueLength * sizeof(Type) );
>
>    // lock the buffer into memory, this is *NOT* realtime safe
>    int errorLocking = jack_ringbuffer_mlock(mRingBuffer);
>    if( errorLocking ){
>      std::cout << "MessageQueue - Error locking memory when creating
> ringbuffer\n";
>    // XXX raise an exception or something?? how do we fail here??
>    }
>
> }
>
> template <class Type>
> MessageQueue<Type>::~MessageQueue(){
>    cout << "MessageQueue destructor\n";
>    // free the memory allocated for the ring buffer
>    ack_ringbuffer_free( mRingBuffer );
> }
>
> template <class Type>
> void MessageQueue<Type>::push( Type msg ){
>    // write to the ring buffer, converting Type to a string
>    unsigned int written = jack_ringbuffer_write( mRingBuffer, (const char
> *) &msg , sizeof(Type) );
>
>    // XXX: what to do if it fails anyway??
>    if( written < sizeof(Type) ){
>      cout << "Error, unable to write full message to ring buffer\n";
>      // do something else here yo!
>    }
> }
>
> // if a message is on the queue, get it
> // returns True if it got a message
> template <class Type>
> bool MessageQueue<Type>::tryPop( Type *msgBuf ){
>
>    // if there is a message on the ring buffer, copy contents into msg
>    if( jack_ringbuffer_read_space( mRingBuffer) >= sizeof(Type) ){
>       jack_ringbuffer_read( mRingBuffer, (char *)msgBuf, sizeof(Type) );
>       // return True because a msg was read
>       return 1;
>    }else{
>       // return False, no msg read
>       return 0;
>    }
> }
>
>
_______________________________________________
Linux-audio-dev mailing list
[email protected]
http://lists.linuxaudio.org/listinfo/linux-audio-dev

Reply via email to