static char *logWriteString(char *dst, const char *value, size_t len) { *dst++ = EVENT_TYPE_STRING; len = len < 32 ? len : 32; set4LE((u1 *)dst, len); dst += 4; memcpy(dst, value, len); return dst + len; }
static char *logWriteInt(char *dst, int value) { *dst++ = EVENT_TYPE_INT; set4LE((u1 *)dst, value); return dst + 4; }
/* * Write the dependency info to "fd" at the current file position. */ static int writeDependencies(int fd, u4 modWhen, u4 crc) { u1* buf = NULL; int result = -1; ssize_t bufLen; ClassPathEntry* cpe; int numDeps; /* * Count up the number of completed entries in the bootclasspath. */ numDeps = 0; bufLen = 0; for (cpe = gDvm.bootClassPath; cpe->ptr != NULL; cpe++) { const char* cacheFileName = dvmPathToAbsolutePortion(getCacheFileName(cpe)); assert(cacheFileName != NULL); /* guaranteed by Class.c */ LOGV("+++ DexOpt: found dep '%s'\n", cacheFileName); numDeps++; bufLen += strlen(cacheFileName) +1; } bufLen += 4*4 + numDeps * (4+kSHA1DigestLen); buf = malloc(bufLen); set4LE(buf+0, modWhen); set4LE(buf+4, crc); set4LE(buf+8, DALVIK_VM_BUILD); set4LE(buf+12, numDeps); // TODO: do we want to add dvmGetInlineOpsTableLength() here? Won't // help us if somebody replaces an existing entry, but it'd catch // additions/removals. u1* ptr = buf + 4*4; for (cpe = gDvm.bootClassPath; cpe->ptr != NULL; cpe++) { const char* cacheFileName = dvmPathToAbsolutePortion(getCacheFileName(cpe)); assert(cacheFileName != NULL); /* guaranteed by Class.c */ const u1* signature = getSignature(cpe); int len = strlen(cacheFileName) +1; if (ptr + 4 + len + kSHA1DigestLen > buf + bufLen) { LOGE("DexOpt: overran buffer\n"); dvmAbort(); } set4LE(ptr, len); ptr += 4; memcpy(ptr, cacheFileName, len); ptr += len; memcpy(ptr, signature, kSHA1DigestLen); ptr += kSHA1DigestLen; } assert(ptr == buf + bufLen); result = sysWriteFully(fd, buf, bufLen, "DexOpt dep info"); free(buf); return result; }