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_);