📄 libgist.cc~
字号:
if (bp->event == amdb_breakpoints::insertEvent) { if (strcmp(param1, "") != 0) { bp->param.updateParam.key = strcpy((char *) malloc(strlen(param1) + 1), param1); } else { bp->param.updateParam.key = NULL; } if (strcmp(param2, "") != 0) { bp->param.updateParam.data = strcpy((char *) malloc(strlen(param2) + 1), param2); } else { bp->param.updateParam.data = NULL; } //printf("insert: key=%s, data=%s\n", bp->param.updateParam.key, //bp->param.updateParam.data); } env->ReleaseStringUTFChars(param1String, param1); env->ReleaseStringUTFChars(param2String, param2);}// create new breakpoint and return its IDJNIEXPORT void JNICALLJava_Libgist_libCreateBp( JNIEnv* env, jclass cl, jobject jbp){ Gist_bpCounter++; amdb_breakpoints::Breakpoint *bp = new amdb_breakpoints::Breakpoint(); convertBreakpoint(bp, jbp, env); env->SetIntField(jbp, Gist_bpIdId, bp->id); if (bp->node == 0 || amdb_breakpoints::isEntryPoint(bp->event)) { // general breakpoint, for no particular node BpVect& vect = genBps[bp->event]; vect.push_back(bp); //printf("new vect bp (%d): %d, %d\n", bp, bp->event, bp->node); } else { // applies to node BpMap& map = nodeBps[bp->event]; map.insert(BpPair(bp->node, bp)); //printf("new map bp (%d): %d, %d\n", bp, bp->event, bp->node); }}// get rid of all breakpointsJNIEXPORT void JNICALLJava_Libgist_libDeleteBps( JNIEnv* env, jclass cl){ // empty all vectors/multimaps; also delete the Breakpoint objects int i; for (i = 0; i < amdb_breakpoints::numEvents; i++) { BpVect::iterator it; for (it = genBps[i].begin(); it != genBps[i].end(); it++) { amdb_breakpoints::Breakpoint* bp = *it; if (bp->event == amdb_breakpoints::insertEvent) { free(bp->param.updateParam.key); free(bp->param.updateParam.data); } delete bp; } BpMap::iterator mit; for (mit = nodeBps[i].begin(); mit != nodeBps[i].end(); mit++) { amdb_breakpoints::Breakpoint* bp = (*mit).second; if (bp->event == amdb_breakpoints::insertEvent) { free(bp->param.updateParam.key); free(bp->param.updateParam.data); } delete bp; } genBps[i].erase(genBps[i].begin(), genBps[i].end()); nodeBps[i].erase(nodeBps[i].begin(), nodeBps[i].end()); } Gist_bpCounter = 0; // start from 0 again}JNIEXPORT void JNICALLJava_Libgist_libSingleStep( JNIEnv *env, jclass cl){ Gist_whatNow = nowStep;}JNIEXPORT void JNICALLJava_Libgist_libDisableAll( JNIEnv *env, jclass cl, jboolean disable){ printf("all disabled: %d\n", (disable ? 1 : 0)); Gist_allDisabled = disable;}// initialize Gist_infoObj with an amdb_breakpoints::BreakInfo structurestatic jobjectcreateBreakInfo( amdb_breakpoints::BreakInfo* info, int id){ printf("new BreakInfo\n"); if (Gist_infoObj == NULL) { jobject infoObj = Gist_env->NewObject(Gist_breakInfoClass, Gist_breakInfoConstrId); Gist_infoObj = Gist_env->NewGlobalRef(infoObj); } jobject& result = Gist_infoObj; Gist_env->SetIntField(result, Gist_biIdId, id); Gist_env->SetIntField(result, Gist_biEventId, info->event); Gist_env->SetIntField(result, Gist_biNodeId, (int) info->node); if (info->event == amdb_breakpoints::locateLeafEvent) { Gist_env->SetDoubleField(result, Gist_biTargetPenaltyId, info->param.locateLeafParam.targetPenalty); Gist_env->SetDoubleField(result, Gist_biMinPenaltyId, info->param.locateLeafParam.minPenalty); Gist_env->SetIntField(result, Gist_biMinLeafId, info->param.locateLeafParam.minLeaf); } printf("id=%d, event=%d, node=%d\n", id, info->event, info->node); return result;}// Test whether the break info triggers the given breakpoint. If it does, call the // Java break handler and set whatNow. If no breakpoint is specified, the handler// is also called.static booltestBp( amdb_breakpoints::Breakpoint* bp, amdb_breakpoints::BreakInfo* info, WhatToDo& whatNow){ bool triggersBp = true; int bpId = 0; // set to ID of the breakpoint, if it was triggered if (bp != NULL) { // locateLeaf: check if insertion penalty deviates too much from minimum int maxDev = bp->param.penaltyParam.maxDeviation; bpId = bp->id; if (bp->event == amdb_breakpoints::locateLeafEvent && maxDev != -1) { triggersBp = (info->param.locateLeafParam.targetPenalty / info->param.locateLeafParam.minPenalty) > (1.0 + (double) maxDev / 100.0); } } if (triggersBp) { jobject infoObj = createBreakInfo(info, bpId); //HANDLEEXCR(Gist_env, false); whatNow = (WhatToDo) Gist_env->CallIntMethod(Gist_handler, Gist_handlerId, infoObj); //HANDLEEXCR(Gist_env, false); return true; } else { return false; }}// the C++ breakpoint handler, called from within libgist;// returns true if the currently executing libgist interface function should// be cancelled (because the user is tired of executing a script)static boolbreakHandler( amdb_breakpoints::BreakInfo* info){ // see if event signals a structure change if (amdb_breakpoints::isStructureUpdate(info->event)) { switch (info->event) { case amdb_breakpoints::newNodeEvent: { Gist_indexStruct->splitNode(info->param.newNodeParam.origNode, info->param.newNodeParam.rightSib, info->param.newNodeParam.rightChildren); break; } case amdb_breakpoints::newRootEvent: { Gist_indexStruct->splitRoot(info->param.newRootParam.leftNode, info->param.newRootParam.rightNode, info->param.newRootParam.rightChildren); break; } case amdb_breakpoints::relocateChildEvent: { Gist_indexStruct->splitRoot(info->param.newRootParam.leftNode, info->param.newRootParam.rightNode, info->param.newRootParam.rightChildren); break; } case amdb_breakpoints::itemInsertedEvent: case amdb_breakpoints::itemDeletedEvent: case amdb_breakpoints::bpUpdatedEvent: { // cout << "Node changed: " << info->param.updNodeParam << endl; Gist_indexStruct->updateNode(info->param.updNodeParam); break; } default: assert(0); } // structure has changed: this invalidates existing tree map delete _treeMap; _treeMap = NULL; // return false; } if (Gist_whatNow == nowStep) { // we're single-stepping (void) testBp(NULL, info, Gist_whatNow); HANDLEEXCR(Gist_env, false); return (Gist_whatNow == nowCancel); } if (Gist_allDisabled) { return false; } if (Gist_whatNow == nowNext && amdb_breakpoints::isEntryPoint(info->event)) { // we stop at the beginning of every interface function (void) testBp(NULL, info, Gist_whatNow); HANDLEEXCR(Gist_env, false); return (Gist_whatNow == nowCancel); } // see if we hit any breakpoints BpVect& vect = genBps[info->event]; // check the general breakpoint(s) int i; for (i = 0; i < 2; i++) { // two rounds: first with original event... BpVect::iterator it; for (it = vect.begin(); it != vect.end(); it++) { bool triggeredBp = testBp(vect.front(), info, Gist_whatNow); HANDLEEXCR(Gist_env, false); if (triggeredBp) { return Gist_whatNow == nowCancel; } } // .. the second with a traversalEvent instead of the locateLeafEvent if (info->event == amdb_breakpoints::locateLeafEvent) { // Locating an insertion target leaf implies a node traversal, therefore // all (more general) traversalEvent breakpoints also apply to (more specific) // locateLeafEvents vect = genBps[amdb_breakpoints::traversalEvent]; } else { // skip the 2nd round if no locateLeafEvent break; } } // check the node-specific breakpoints BpMap& map = nodeBps[info->event]; for (i = 0; i < 2; i++) { // two rounds again BpMap::iterator it; for (it = map.find(info->node); it != map.end(); it++) { bool triggeredBp = testBp((*it).second, info, Gist_whatNow); HANDLEEXCR(Gist_env, false); if (triggeredBp) { return Gist_whatNow == nowCancel; } } if (info->event == amdb_breakpoints::locateLeafEvent) { // Locating an insertion target leaf implies a node traversal, therefore // all (more general) traversalEvent breakpoints also apply to (more specific) // locateLeafEvents map = nodeBps[amdb_breakpoints::traversalEvent]; } else { // skip the 2nd round if no locateLeafEvent break; } } return false;}// determine class object and handler routine ID for later referenceJNIEXPORT void JNICALLJava_Libgist_libSetBreakHandler( JNIEnv *env, jclass cl, jobject handler){ Gist_handler = env->NewGlobalRef(handler); if (Gist_handler == NULL) { ERRORRETURN("out of memory"); } jclass handlerClass = env->GetObjectClass(handler); Gist_handlerClass = (jclass) env->NewGlobalRef(handlerClass); if (Gist_handlerClass == NULL) { ERRORRETURN("out of memory"); } Gist_handlerId = env->GetMethodID(Gist_handlerClass, "breakHandler", "(LBreakInfo;)I"); HANDLEEXC(env);}/* * Libgist interface functions */// precompute a couple of class and method IDsJNIEXPORT void JNICALLJava_Libgist_libInit( JNIEnv *env, jclass cl){ Gist_gist->setBreakHandler(breakHandler); // get global ref to StringBuffer method ID DBGPRINT(3, cout << "find StringBuffer" << endl); //DBGPRINT(3, cout << "find StringBuffer" << endl); jclass stringBufferClass = env->FindClass("java/lang/StringBuffer"); HANDLEEXC(env); DBGPRINT(3, cout << "found StringBuffer" << endl); Gist_stringBufferClass = (jclass) env->NewGlobalRef(stringBufferClass); Gist_sbAppendId = env->GetMethodID(Gist_stringBufferClass, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;"); HANDLEEXC(env); // get global ref to JTextArea method ID DBGPRINT(3, cout << "find JTextArea" << endl); jclass jTextAreaClass = env->FindClass("javax/swing/JTextArea"); HANDLEEXC(env); DBGPRINT(3, cout << "found JTextArea" << endl); Gist_jTextAreaClass = (jclass) env->NewGlobalRef(jTextAreaClass); Gist_taAppendId = env->GetMethodID(Gist_jTextAreaClass, "append", "(Ljava/lang/String;)V"); HANDLEEXC(env); // get global ref to File class and constructor DBGPRINT(3, cout << "find File" << endl); jclass fileClass = env->FindClass("java/io/File"); HANDLEEXC(env); DBGPRINT(3, cout << "found File" << endl); Gist_fileClass = (jclass) env->NewGlobalRef(fileClass); Gist_fInitId = env->GetMethodID(Gist_fileClass, "<init>", "(Ljava/lang/String;)V"); HANDLEEXC(env); // get global ref to Breakpoint class and field IDs jclass bpClass = env->FindClass("Breakpoint"); HANDLEEXC(env); Gist_breakpointClass = (jclass) env->NewGlobalRef(bpClass); //Gist_breakpointConstrId = env->GetMethodID(Gist_breakpointClass, "<init>", "()V"); //HANDLEEXC(env); Gist_bpIdId = env->GetFieldID(Gist_breakpointClass, "id", "I"); HANDLEEXC(env); Gist_bpEventId = env->GetFieldID(Gist_breakpointClass, "event", "I"); HANDLEEXC(env); Gist_bpNodeId = env->GetFieldID(Gist_breakpointClass, "nodeId", "I"); HANDLEEXC(env); Gist_bpParam1Id = env->GetFieldID(Gist_breakpointClass, "param1", "Ljava/lang/String;"); HANDLEEXC(env); Gist_bpParam2Id = env->GetFieldID(Gist_breakpointClass, "param1", "Ljava/lang/String;"); HANDLEEXC(env); // get global ref to BreakInfo class and field IDs jclass biClass = env->FindClass("BreakInfo"); HANDLEEXC(env); Gist_breakInfoClass = (jclass) env->NewGlobalRef(biClass); Gist_breakInfoConstrId = env->GetMethodID(Gist_breakInfoClass, "<init>", "()V"); HANDLEEXC(env); Gist_biIdId = env->GetFieldID(Gist_breakInfoClass, "id", "I"); HANDLEEXC(env); Gist_biEventId = env->GetFieldID(Gist_breakInfoClass, "event", "I"); HANDLEEXC(env); Gist_biNodeId = env->GetFieldID(Gist_breakInfoClass, "nodeId", "I"); HANDLEEXC(env); Gist_biTargetPenaltyId = env->GetFieldID(Gist_breakInfoClass, "targetPenalty", "D"); HANDLEEXC(env); Gist_biMinPenaltyId = env->GetFieldID(Gist_breakInfoClass, "minPenalty", "D"); HANDLEEXC(env); Gist_biMinLeafId = env->GetFieldID(Gist_breakInfoClass, "minLeaf", "I"); HANDLEEXC(env); //jobject infoObj = Gist_env->NewObject(Gist_breakInfoClass, Gist_breakInfoConstrId); //Gist_infoObj = env->NewGlobalRef(infoObj); // get global ref to QueryStats class jclass queryStatsClass = env->FindClass("QueryStats"); HANDLEEXC(env); Gist_queryStatsClass = (jclass) env->NewGlobalRef(queryStatsClass); Gist_qsResultSetLimitId = env->GetFieldID(Gist_queryStatsClass, "resultSetLimit", "I"); HANDLEEXC(env); Gist_qsQualId = env->GetFieldID(Gist_queryStatsClass, "qual", "Ljava/lang/StringBuffer;"); HANDLEEXC(env); Gist_qsResultSetSizeId = env->GetFieldID(Gist_queryStatsClass, "resultSetSize", "I"); HANDLEEXC(env); Gist_qsAvgUtilId = env->GetFieldID(Gist_queryStatsClass, "avgUtil", "F"); HANDLEEXC(env); Gist_qsRetrievalVolId = env->GetFieldID(Gist_queryStatsClass, "retrievalVol", "I"); HANDLEEXC(env); Gist_qsTotalLeafIosId = env->GetFieldID(Gist_queryStatsClass, "totalLeafIos", "I"); HANDLEEXC(env); Gist_qsMinIosId = env->GetFieldID(Gist_queryStatsClass, "minIos", "I"); HANDLEEXC(env); Gist_qsOptimalIosId = env->GetFieldID(Gist_queryStatsClass, "optimalIos", "I"); HANDLEEXC(env); Gist_qsOptimalOhId = env->GetFieldID(Gist_queryStatsClass, "optimalOh", "F"); HANDLEEXC(env); Gist_qsOptLeafOhId = env->GetFieldID(Gist_queryStatsClass, "optLeafOh", "F"); HANDLEEXC(env); Gist_qsMinLeafOhId = env->GetFieldID(Gist_queryStatsClass, "minLeafOh", "F"); HANDLEEXC(env); Gist_qsRandomIosId = env->GetFieldID(Gist_queryStatsClass, "randomIos", "F"); HANDLEEXC(env); Gist_qsRandomStdDevId = env->GetFieldID(Gist_queryStatsClass, "randomStdDev", "F"); HANDLEEXC(env); Gist_qsOptRandomOhId = env->GetFieldID(Gist_queryStatsClass, "optRandomOh", "F"); HANDLEEXC(env); Gist_qsMinRandomOhId = env->GetFieldID(Gist_queryStatsClass, "minRandomOh", "F"); HANDLEEXC(env); Gist_qsOptClusterLossId = env->GetFieldID(Gist_queryStatsClass, "optClusterLoss", "F"); HANDLEEXC(env); Gist_qsMinClusterLossId = env->GetFieldID(Gist_queryStatsClass, "minClusterLoss", "F"); HANDLEEXC(env); Gist_qsOptClusterOhId = env->GetFieldID(Gist_queryStatsClass, "optClusterOh", "F"); HANDLEEXC(env); Gist_qsMinClusterOhId = env->GetFieldID(Gist_queryStatsClass, "minClusterOh", "F"); HANDLEEXC(env); Gist_qsLeafUtilLossId = env->GetFieldID(Gist_queryStatsClass, "leafUtilLoss", "F"); HANDLEEXC(env); Gist_qsUtilOhId = env->GetFieldID(Gist_queryStatsClass, "utilOh", "F"); HANDLEEXC(env); Gist_qsLeafExcCovLossId = env->GetFieldID(Gist_queryStatsClass, "leafExcCovLoss", "F"); HANDLEEXC(env); Gist_qsExcCovOhId = env->GetFieldID(Gist_queryStatsClass, "excCovOh", "F");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -