示例#1
0
static void*
in_discoveryClientWriterMonitor(
    void* arg)
{
    c_bool result, sendTo, more;
    v_message message;
    c_ulong sequenceNumber, priority;
    v_gid sender, receiver;
    c_time sendBefore;
    v_networkReaderEntry entry;
    os_time sleepTime;
    in_writer writer;
    os_boolean proceed = TRUE;
    v_networkReaderWaitResult nrwr;

    if(vclientQueue){
        sleepTime.tv_sec = 0;
        sleepTime.tv_nsec = 50 * 1000 * 1000;

        while(!terminate && proceed){
            nrwr = v_networkReaderWait(vclientReader, queueId, &vclientQueue);

            if((nrwr & V_WAITRESULT_MSGWAITING) == V_WAITRESULT_MSGWAITING){
                more = TRUE;

                while(more){
                    result = v_networkQueueTakeFirst(
                        vclientQueue, &message, &entry, &sequenceNumber, &sender,
                        &sendTo, &receiver, &sendBefore, &priority, &more);

                    if(result){
		        os_mutexLock (&gluelock);
                        writer = in_writerLookup(&sender);

                        if(writer){
                            if(v_nodeState(message) == L_WRITE){
                                proceed = in_writerWrite(writer, message);
                            } else if(v_nodeState(message) == L_DISPOSED){
                                proceed = in_writerDispose(writer, message);
                            } else if(v_nodeState(message) == L_UNREGISTER){
                                proceed = in_writerUnregister(writer, message);
                            }
                        }
			os_mutexUnlock (&gluelock);
                    }
                }
            } else if((nrwr & V_WAITRESULT_TRIGGERED) == V_WAITRESULT_TRIGGERED){
                in_printf(IN_LEVEL_FINER, "clientReader triggered...\n");
                proceed = FALSE;
            }
        }
    }
    return NULL;
}
示例#2
0
static void*
in_discoveryClientWriterMonitor(
        UNUSED_ARG (void* arg))
{
    c_bool result, sendTo, more;
    v_message message;
    c_ulong sequenceNumber, priority;
    v_gid sender, receiver;
    c_time sendBefore;
    v_networkReaderEntry entry;
    os_time sleepTime;
    in_writer writer;
    os_boolean proceed = TRUE;
    v_networkReaderWaitResult nrwr;
    struct nn_xpack *xp;

    xp = nn_xpack_new ();
    if(vclientQueue){
        sleepTime.tv_sec = 0;
        sleepTime.tv_nsec = 50 * 1000 * 1000;

        while(!terminate && proceed){
            nrwr = v_networkReaderWait(vclientReader, queueId, &vclientQueue);

            if((nrwr & V_WAITRESULT_MSGWAITING) == V_WAITRESULT_MSGWAITING){
                more = TRUE;

                while(more){
                    result = v_networkQueueTakeFirst(
                        vclientQueue, &message, &entry, &sequenceNumber, &sender,
                        &sendTo, &receiver, &sendBefore, &priority, &more);

                    if(result){
                        os_mutexLock (&gluelock);
                        writer = in_writerLookup(&sender);
                        if (writer)
                          proceed = in_writerWrite(xp, writer, message);
                        os_mutexUnlock (&gluelock);
                        c_free (message);
                    }
                }
                nn_xpack_send (xp);
            } else if((nrwr & V_WAITRESULT_TRIGGERED) == V_WAITRESULT_TRIGGERED){
                nn_log (LC_TRACE, "clientReader triggered...\n");
                proceed = FALSE;
            }
        }
    }
    nn_xpack_free (xp);
    return NULL;
}