Merge "Trace FUSE daemon opcodes"
diff --git a/jni/Android.bp b/jni/Android.bp
index efc9160..c940cbb 100644
--- a/jni/Android.bp
+++ b/jni/Android.bp
@@ -35,6 +35,7 @@
shared_libs: [
"liblog",
"libfuse",
+ "libandroid"
],
static_libs: [
diff --git a/jni/FuseDaemon.cpp b/jni/FuseDaemon.cpp
index 7dcf311..4608d66 100644
--- a/jni/FuseDaemon.cpp
+++ b/jni/FuseDaemon.cpp
@@ -12,12 +12,14 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+#define ATRACE_TAG ATRACE_TAG_APP
#define LOG_TAG "FuseDaemon"
#include "FuseDaemon.h"
#include <android-base/logging.h>
#include <android/log.h>
+#include <android/trace.h>
#include <ctype.h>
#include <dirent.h>
#include <errno.h>
@@ -66,6 +68,20 @@
#define TRACE LOG(DEBUG)
#define TRACE_FUSE(__fuse) TRACE << "[" << __fuse->path << "] "
+#define ATRACE_NAME(name) ScopedTrace ___tracer(name)
+#define ATRACE_CALL() ATRACE_NAME(__FUNCTION__)
+
+class ScopedTrace {
+ public:
+ inline ScopedTrace(const char *name) {
+ ATrace_beginSection(name);
+ }
+
+ inline ~ScopedTrace() {
+ ATrace_endSection();
+ }
+};
+
#define FUSE_UNKNOWN_INO 0xffffffff
constexpr size_t MAX_READ_SIZE = 128 * 1024;
@@ -516,6 +532,7 @@
}
static void pf_lookup(fuse_req_t req, fuse_ino_t parent, const char* name) {
+ ATRACE_CALL();
struct fuse_entry_param e;
if (do_lookup(req, parent, name, &e))
@@ -534,6 +551,7 @@
}
static void pf_forget(fuse_req_t req, fuse_ino_t ino, uint64_t nlookup) {
+ ATRACE_CALL();
struct node* node;
struct fuse* fuse = get_fuse(req);
@@ -546,6 +564,7 @@
static void pf_forget_multi(fuse_req_t req,
size_t count,
struct fuse_forget_data* forgets) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
pthread_mutex_lock(&fuse->lock);
@@ -560,6 +579,7 @@
static void pf_getattr(fuse_req_t req,
fuse_ino_t ino,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
struct node* node;
@@ -587,6 +607,7 @@
struct stat* attr,
int to_set,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
struct node* node;
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
@@ -661,6 +682,7 @@
const char* name,
mode_t mode,
dev_t rdev) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
struct node* parent_node;
@@ -696,6 +718,7 @@
fuse_ino_t parent,
const char* name,
mode_t mode) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
struct node* parent_node;
@@ -726,6 +749,7 @@
}
static void pf_unlink(fuse_req_t req, fuse_ino_t parent, const char* name) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
struct node* parent_node;
@@ -757,6 +781,7 @@
}
static void pf_rmdir(fuse_req_t req, fuse_ino_t parent, const char* name) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
struct node* child_node;
@@ -799,6 +824,7 @@
fuse_ino_t newparent,
const char* newname,
unsigned int flags) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
struct node* old_parent_node;
@@ -863,6 +889,7 @@
*/
static void pf_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info* fi) {
+ ATRACE_CALL();
struct node* node;
string path;
struct fuse* fuse = get_fuse(req);
@@ -1009,6 +1036,7 @@
static void pf_read(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
handle* h = reinterpret_cast<handle*>(fi->fh);
struct fuse* fuse = get_fuse(req);
TRACE_FUSE(fuse) << "READ";
@@ -1044,6 +1072,7 @@
struct fuse_bufvec* bufv,
off_t off,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
handle* h = reinterpret_cast<handle*>(fi->fh);
struct fuse_bufvec buf = FUSE_BUFVEC_INIT(fuse_buf_size(bufv));
ssize_t size;
@@ -1095,6 +1124,7 @@
static void pf_flush(fuse_req_t req,
fuse_ino_t ino,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
TRACE_FUSE(fuse) << "FLUSH is a noop";
fuse_reply_err(req, 0);
@@ -1103,6 +1133,7 @@
static void pf_release(fuse_req_t req,
fuse_ino_t ino,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
handle* h = reinterpret_cast<handle*>(fi->fh);
@@ -1129,6 +1160,7 @@
fuse_ino_t ino,
int datasync,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
handle* h = reinterpret_cast<handle*>(fi->fh);
int err = do_sync_common(h->fd, datasync);
@@ -1148,6 +1180,7 @@
static void pf_opendir(fuse_req_t req,
fuse_ino_t ino,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
struct node* node;
@@ -1262,6 +1295,7 @@
static void pf_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
do_readdir_common(req, ino, size, off, fi, false);
}
@@ -1270,12 +1304,14 @@
size_t size,
off_t off,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
do_readdir_common(req, ino, size, off, fi, true);
}
static void pf_releasedir(fuse_req_t req,
fuse_ino_t ino,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
struct dirhandle* h = reinterpret_cast<struct dirhandle*>(fi->fh);
@@ -1286,6 +1322,7 @@
}
static void pf_statfs(fuse_req_t req, fuse_ino_t ino) {
+ ATRACE_CALL();
struct statvfs st;
struct fuse* fuse = get_fuse(req);
@@ -1318,6 +1355,7 @@
}*/
static void pf_access(fuse_req_t req, fuse_ino_t ino, int mask) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
@@ -1336,6 +1374,7 @@
const char* name,
mode_t mode,
struct fuse_file_info* fi) {
+ ATRACE_CALL();
struct fuse* fuse = get_fuse(req);
const struct fuse_ctx* ctx = fuse_req_ctx(req);
struct node* parent_node;
diff --git a/jni/MediaProviderWrapper.cpp b/jni/MediaProviderWrapper.cpp
index 6a15b20..5f42b50 100644
--- a/jni/MediaProviderWrapper.cpp
+++ b/jni/MediaProviderWrapper.cpp
@@ -258,7 +258,6 @@
request_terminate_jni_thread_ = false;
jni_thread_ = std::thread(&MediaProviderWrapper::JniThreadLoop, this, jvm);
- pthread_setname_np(jni_thread_.native_handle(), "media_provider_jni_thr");
LOG(INFO) << "Successfully initialized MediaProviderWrapper";
}
@@ -470,6 +469,7 @@
void MediaProviderWrapper::JniThreadLoop(JavaVM* jvm) {
JNIEnv* env;
jvm->AttachCurrentThread(&env, NULL);
+ pthread_setname_np(pthread_self(), "jni_loop");
while (!request_terminate_jni_thread_) {
std::unique_lock<std::mutex> cond_lock(jni_task_lock_);