Exemplo n.º 1
0
void VRRegisterSceneGraph::unregisterNode(osg::Node *node, string parent)
{
    if (blocked)
        return;
    whole_message = "SCENEGRAPH: \t";
    // for stl
    createUnregisterMessage(node, parent);
    sendUnregisterMessage();
}
Exemplo n.º 2
0
void VRRegisterSceneGraph::createUnregisterMessage(osg::Node *node, string parent)
{
    if (node)
    {
        string message = node->getName();
        // check for vr-prepare's EndOfTree indicator
        bool doNotFollow = (message.find("_EOT") != string::npos) || (message.find("-EOT") != string::npos);
        //separate names with tabulators
        //separate node and parent with ;;
        message.append(";;");
        message.append(parent);
        message.append("\t");
        whole_message.append(message);

        osg::Group *group = dynamic_cast<osg::Group *>(node);
        if (group && !doNotFollow) // pfGroup, pfDCS
        {
            for (unsigned int i = 0; i < group->getNumChildren(); i++)
            {
                createUnregisterMessage(group->getChild(i), node->getName());
            }
        }
    }
}
Exemplo n.º 3
0
static c_bool
d_instanceInject(
   c_object o,
   c_voidp arg)
{
    d_instance instance;
    d_sample sample;
    v_message message, storeMessage, unregisterMsg;
    struct d_instanceInjectArg* inj;
    v_writeResult wr;
    os_time oneSec;
    c_iter unregisterMessagesToInject;
    c_bool success;

    assert(o != NULL);
    assert(C_TYPECHECK(o, d_instance));

    instance = d_instance(o);
    inj = (struct d_instanceInjectArg*)(arg);
    unregisterMessagesToInject = c_iterNew(NULL);

    sample = d_sample(instance->oldest);

    while ((sample != NULL) && (inj->result == D_STORE_RESULT_OK)) {
        storeMessage = d_sampleGetMessage(sample);

        /* copy message */
        c_cloneIn(inj->messageType, storeMessage, (c_voidp*)&(message));

        /* inject message */
        wr = v_groupWriteNoStream(inj->vgroup, message, NULL, V_NETWORKID_LOCAL);
        oneSec.tv_sec  = 1;
        oneSec.tv_nsec = 0;

        while(wr == V_WRITE_REJECTED){
            wr = v_groupWriteNoStream(inj->vgroup, message, NULL, V_NETWORKID_LOCAL);
            os_nanoSleep(oneSec);
        }

        if((wr != V_WRITE_SUCCESS) &&
           (wr != V_WRITE_REGISTERED) &&
           (wr != V_WRITE_UNREGISTERED)) {
            OS_REPORT_1(OS_ERROR, D_CONTEXT, 0,
                "Unable to write persistent data to group. (result: '%d')\n",
                wr);
            inj->result = D_STORE_RESULT_ERROR;
        } else {
            /* If a sample is written or registered, add unregister action */
            unregisterMsg = findUnregisterMessage(unregisterMessagesToInject, message);

            if(!unregisterMsg){
                unregisterMsg = createUnregisterMessage (inj->vgroup, message);

                /* Add the newly created unregister message to the list of extra messages to inject */
                unregisterMessagesToInject = c_iterAppend (
                        unregisterMessagesToInject, unregisterMsg);
            }
            /* Set valid sequence number */
            if (message->sequenceNumber >= unregisterMsg->sequenceNumber) {
                unregisterMsg->sequenceNumber = message->sequenceNumber + 1;
            }
        }
        sample = sample->newer;
    }
    if(inj->result == D_STORE_RESULT_OK){
        oneSec.tv_sec  = 1;
        oneSec.tv_nsec = 0;
        /* inject the extra unregister messages */
        unregisterMsg = v_message(c_iterTakeFirst(unregisterMessagesToInject));

        while (unregisterMsg) {
            wr = v_groupWriteNoStream(inj->vgroup, unregisterMsg, NULL, V_NETWORKID_LOCAL);

            while(wr == V_WRITE_REJECTED){
                wr = v_groupWriteNoStream(inj->vgroup, unregisterMsg, NULL, V_NETWORKID_LOCAL);
                os_nanoSleep(oneSec);
            }
            unregisterMsg = v_message(c_iterTakeFirst(unregisterMessagesToInject));
        }
        c_iterFree(unregisterMessagesToInject);
    }

    if(inj->result == D_STORE_RESULT_OK){
        success = TRUE;
    } else {
        success = FALSE;
    }
    return success;
}