Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 171acc67 authored by Tej Singh's avatar Tej Singh Committed by Automerger Merge Worker
Browse files

Native API feedback for puller API am: c06f1475

Change-Id: I2d0e0ebe215fa13e784d1cd4b15503b0b9a572de
parents c422da86 c06f1475
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -65,3 +65,25 @@ cc_library_static {
        "//frameworks/base/apex/statsd/tests/libstatspull",
    ],
}

// Note: These unit tests only test PullAtomMetadata.
// For full E2E tests of libstatspull, use LibStatsPullTests
cc_test {
    name: "libstatspull_test",
    srcs: [
        "tests/pull_atom_metadata_test.cpp",
    ],
    shared_libs: [
        "libstatspull",
        "libstatssocket",
    ],
    test_suites: ["general-tests"],
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-missing-field-initializers",
        "-Wno-unused-variable",
        "-Wno-unused-function",
        "-Wno-unused-parameter",
    ],
}
 No newline at end of file
+7 −0
Original line number Diff line number Diff line
{
  "presubmit" : [
    {
      "name" : "libstatspull_test"
    }
  ]
}
 No newline at end of file
+40 −13
Original line number Diff line number Diff line
@@ -45,17 +45,27 @@ AStatsManager_PullAtomMetadata* AStatsManager_PullAtomMetadata_obtain();
void AStatsManager_PullAtomMetadata_release(AStatsManager_PullAtomMetadata* metadata);

/**
 * Set the cool down time of the pull in nanoseconds. If two successive pulls are issued
 * Set the cool down time of the pull in milliseconds. If two successive pulls are issued
 * within the cool down, a cached version of the first will be used for the second.
 */
void AStatsManager_PullAtomMetadata_setCoolDownNs(AStatsManager_PullAtomMetadata* metadata,
                                                  int64_t cool_down_ns);
void AStatsManager_PullAtomMetadata_setCoolDownMillis(AStatsManager_PullAtomMetadata* metadata,
                                                      int64_t cool_down_millis);

/**
 * Set the maximum time the pull can take in nanoseconds.
 * Get the cool down time of the pull in milliseconds.
 */
void AStatsManager_PullAtomMetadata_setTimeoutNs(AStatsManager_PullAtomMetadata* metadata,
                                                 int64_t timeout_ns);
int64_t AStatsManager_PullAtomMetadata_getCoolDownMillis(AStatsManager_PullAtomMetadata* metadata);

/**
 * Set the maximum time the pull can take in milliseconds.
 */
void AStatsManager_PullAtomMetadata_setTimeoutMillis(AStatsManager_PullAtomMetadata* metadata,
                                                     int64_t timeout_millis);

/**
 * Get the maximum time the pull can take in milliseconds.
 */
int64_t AStatsManager_PullAtomMetadata_getTimeoutMillis(AStatsManager_PullAtomMetadata* metadata);

/**
 * Set the additive fields of this pulled atom.
@@ -65,7 +75,25 @@ void AStatsManager_PullAtomMetadata_setTimeoutNs(AStatsManager_PullAtomMetadata*
 * will be combined when the non-additive fields are the same.
 */
void AStatsManager_PullAtomMetadata_setAdditiveFields(AStatsManager_PullAtomMetadata* metadata,
                                                      int* additive_fields, int num_fields);
                                                      int32_t* additive_fields, int32_t num_fields);

/**
 * Get the number the additive fields of this pulled atom. This is intended to be called before
 * AStatsManager_PullAtomMetadata_getAdditiveFields to determine the size of the array.
 */
int32_t AStatsManager_PullAtomMetadata_getNumAdditiveFields(
        AStatsManager_PullAtomMetadata* metadata);

/**
 * Get the additive fields of this pulled atom.
 *
 * \param fields an output parameter containing the additive fields for this PullAtomMetadata.
 *               Fields is an array and it is assumed that it is at least as large as the number of
 *               additive fields, which can be obtained by calling
 *               AStatsManager_PullAtomMetadata_getNumAdditiveFields.
 */
void AStatsManager_PullAtomMetadata_getAdditiveFields(AStatsManager_PullAtomMetadata* metadata,
                                                      int32_t* fields);

/**
 * Return codes for the result of a pull.
@@ -108,7 +136,7 @@ AStatsEvent* AStatsEventList_addStatsEvent(AStatsEventList* pull_data);
typedef AStatsManager_PullAtomCallbackReturn (*AStatsManager_PullAtomCallback)(
        int32_t atom_tag, AStatsEventList* data, void* cookie);
/**
 * Registers a callback for an atom when that atom is to be pulled. The stats service will
 * Sets a callback for an atom when that atom is to be pulled. The stats service will
 * invoke the callback when the stats service determines that this atom needs to be
 * pulled.
 *
@@ -122,19 +150,18 @@ typedef AStatsManager_PullAtomCallbackReturn (*AStatsManager_PullAtomCallback)(
 * \param cookie            A pointer that will be passed back to the callback.
 *                          It has no meaning to statsd.
 */
void AStatsManager_registerPullAtomCallback(int32_t atom_tag,
                                            AStatsManager_PullAtomCallback callback,
                                            AStatsManager_PullAtomMetadata* metadata, void* cookie);
void AStatsManager_setPullAtomCallback(int32_t atom_tag, AStatsManager_PullAtomMetadata* metadata,
                                       AStatsManager_PullAtomCallback callback, void* cookie);

/**
 * Unregisters a callback for an atom when that atom is to be pulled. Note that any ongoing
 * Clears a callback for an atom when that atom is to be pulled. Note that any ongoing
 * pulls will still occur.
 *
 * Requires the REGISTER_STATS_PULL_ATOM permission.
 *
 * \param atomTag           The tag of the atom of which to unregister
 */
void AStatsManager_unregisterPullAtomCallback(int32_t atom_tag);
void AStatsManager_clearPullAtomCallback(int32_t atom_tag);

#ifdef __cplusplus
}
+8 −4
Original line number Diff line number Diff line
@@ -2,12 +2,16 @@ LIBSTATSPULL {
    global:
        AStatsManager_PullAtomMetadata_obtain; # apex # introduced=30
        AStatsManager_PullAtomMetadata_release; # apex # introduced=30
        AStatsManager_PullAtomMetadata_setCoolDownNs; # apex # introduced=30
        AStatsManager_PullAtomMetadata_setTimeoutNs; # apex # introduced=30
        AStatsManager_PullAtomMetadata_setCoolDownMillis; # apex # introduced=30
        AStatsManager_PullAtomMetadata_getCoolDownMillis; # apex # introduced=30
        AStatsManager_PullAtomMetadata_setTimeoutMillis; # apex # introduced=30
        AStatsManager_PullAtomMetadata_getTimeoutMillis; # apex # introduced=30
        AStatsManager_PullAtomMetadata_setAdditiveFields; # apex # introduced=30
        AStatsManager_PullAtomMetadata_getNumAdditiveFields; # apex # introduced=30
        AStatsManager_PullAtomMetadata_getAdditiveFields; # apex # introduced=30
        AStatsEventList_addStatsEvent; # apex # introduced=30
        AStatsManager_registerPullAtomCallback; # apex # introduced=30
        AStatsManager_unregisterPullAtomCallback; # apex # introduced=30
        AStatsManager_setPullAtomCallback; # apex # introduced=30
        AStatsManager_clearPullAtomCallback; # apex # introduced=30
    local:
        *;
};
+52 −33
Original line number Diff line number Diff line
@@ -46,19 +46,19 @@ AStatsEvent* AStatsEventList_addStatsEvent(AStatsEventList* pull_data) {
    return event;
}

static const int64_t DEFAULT_COOL_DOWN_NS = 1000000000LL;  // 1 second.
static const int64_t DEFAULT_TIMEOUT_NS = 10000000000LL;   // 10 seconds.
static const int64_t DEFAULT_COOL_DOWN_MILLIS = 1000LL;  // 1 second.
static const int64_t DEFAULT_TIMEOUT_MILLIS = 10000LL;   // 10 seconds.

struct AStatsManager_PullAtomMetadata {
    int64_t cool_down_ns;
    int64_t timeout_ns;
    int64_t cool_down_millis;
    int64_t timeout_millis;
    std::vector<int32_t> additive_fields;
};

AStatsManager_PullAtomMetadata* AStatsManager_PullAtomMetadata_obtain() {
    AStatsManager_PullAtomMetadata* metadata = new AStatsManager_PullAtomMetadata();
    metadata->cool_down_ns = DEFAULT_COOL_DOWN_NS;
    metadata->timeout_ns = DEFAULT_TIMEOUT_NS;
    metadata->cool_down_millis = DEFAULT_COOL_DOWN_MILLIS;
    metadata->timeout_millis = DEFAULT_TIMEOUT_MILLIS;
    metadata->additive_fields = std::vector<int32_t>();
    return metadata;
}
@@ -67,30 +67,50 @@ void AStatsManager_PullAtomMetadata_release(AStatsManager_PullAtomMetadata* meta
    delete metadata;
}

void AStatsManager_PullAtomMetadata_setCoolDownNs(AStatsManager_PullAtomMetadata* metadata,
                                                  int64_t cool_down_ns) {
    metadata->cool_down_ns = cool_down_ns;
void AStatsManager_PullAtomMetadata_setCoolDownMillis(AStatsManager_PullAtomMetadata* metadata,
                                                      int64_t cool_down_millis) {
    metadata->cool_down_millis = cool_down_millis;
}

void AStatsManager_PullAtomMetadata_setTimeoutNs(AStatsManager_PullAtomMetadata* metadata,
                                                 int64_t timeout_ns) {
    metadata->timeout_ns = timeout_ns;
int64_t AStatsManager_PullAtomMetadata_getCoolDownMillis(AStatsManager_PullAtomMetadata* metadata) {
    return metadata->cool_down_millis;
}

void AStatsManager_PullAtomMetadata_setTimeoutMillis(AStatsManager_PullAtomMetadata* metadata,
                                                     int64_t timeout_millis) {
    metadata->timeout_millis = timeout_millis;
}

int64_t AStatsManager_PullAtomMetadata_getTimeoutMillis(AStatsManager_PullAtomMetadata* metadata) {
    return metadata->timeout_millis;
}

void AStatsManager_PullAtomMetadata_setAdditiveFields(AStatsManager_PullAtomMetadata* metadata,
                                                      int* additive_fields, int num_fields) {
                                                      int32_t* additive_fields,
                                                      int32_t num_fields) {
    metadata->additive_fields.assign(additive_fields, additive_fields + num_fields);
}

int32_t AStatsManager_PullAtomMetadata_getNumAdditiveFields(
        AStatsManager_PullAtomMetadata* metadata) {
    return metadata->additive_fields.size();
}

void AStatsManager_PullAtomMetadata_getAdditiveFields(AStatsManager_PullAtomMetadata* metadata,
                                                      int32_t* fields) {
    std::copy(metadata->additive_fields.begin(), metadata->additive_fields.end(), fields);
    return;
}

class StatsPullAtomCallbackInternal : public BnPullAtomCallback {
  public:
    StatsPullAtomCallbackInternal(const AStatsManager_PullAtomCallback callback, void* cookie,
                                  const int64_t coolDownNs, const int64_t timeoutNs,
                                  const int64_t coolDownMillis, const int64_t timeoutMillis,
                                  const std::vector<int32_t> additiveFields)
        : mCallback(callback),
          mCookie(cookie),
          mCoolDownNs(coolDownNs),
          mTimeoutNs(timeoutNs),
          mCoolDownMillis(coolDownMillis),
          mTimeoutMillis(timeoutMillis),
          mAdditiveFields(additiveFields) {}

    Status onPullAtom(int32_t atomTag,
@@ -119,15 +139,15 @@ class StatsPullAtomCallbackInternal : public BnPullAtomCallback {
        return Status::ok();
    }

    const int64_t& getCoolDownNs() const { return mCoolDownNs; }
    const int64_t& getTimeoutNs() const { return mTimeoutNs; }
    int64_t getCoolDownMillis() const { return mCoolDownMillis; }
    int64_t getTimeoutMillis() const { return mTimeoutMillis; }
    const std::vector<int32_t>& getAdditiveFields() const { return mAdditiveFields; }

  private:
    const AStatsManager_PullAtomCallback mCallback;
    void* mCookie;
    const int64_t mCoolDownNs;
    const int64_t mTimeoutNs;
    const int64_t mCoolDownMillis;
    const int64_t mTimeoutMillis;
    const std::vector<int32_t> mAdditiveFields;
};

@@ -156,8 +176,8 @@ static void binderDied(void* /*cookie*/) {
        pullersCopy = mPullers;
    }
    for (const auto& it : pullersCopy) {
        statsService->registerNativePullAtomCallback(it.first, it.second->getCoolDownNs(),
                                                     it.second->getTimeoutNs(),
        statsService->registerNativePullAtomCallback(it.first, it.second->getCoolDownMillis(),
                                                     it.second->getTimeoutMillis(),
                                                     it.second->getAdditiveFields(), it.second);
    }
}
@@ -186,8 +206,8 @@ void registerStatsPullAtomCallbackBlocking(int32_t atomTag,
        return;
    }

    statsService->registerNativePullAtomCallback(atomTag, cb->getCoolDownNs(), cb->getTimeoutNs(),
                                                 cb->getAdditiveFields(), cb);
    statsService->registerNativePullAtomCallback(
            atomTag, cb->getCoolDownMillis(), cb->getTimeoutMillis(), cb->getAdditiveFields(), cb);
}

void unregisterStatsPullAtomCallbackBlocking(int32_t atomTag) {
@@ -200,12 +220,11 @@ void unregisterStatsPullAtomCallbackBlocking(int32_t atomTag) {
    statsService->unregisterNativePullAtomCallback(atomTag);
}

void AStatsManager_registerPullAtomCallback(int32_t atom_tag,
                                            AStatsManager_PullAtomCallback callback,
                                            AStatsManager_PullAtomMetadata* metadata,
                                            void* cookie) {
    int64_t coolDownNs = metadata == nullptr ? DEFAULT_COOL_DOWN_NS : metadata->cool_down_ns;
    int64_t timeoutNs = metadata == nullptr ? DEFAULT_TIMEOUT_NS : metadata->timeout_ns;
void AStatsManager_setPullAtomCallback(int32_t atom_tag, AStatsManager_PullAtomMetadata* metadata,
                                       AStatsManager_PullAtomCallback callback, void* cookie) {
    int64_t coolDownMillis =
            metadata == nullptr ? DEFAULT_COOL_DOWN_MILLIS : metadata->cool_down_millis;
    int64_t timeoutMillis = metadata == nullptr ? DEFAULT_TIMEOUT_MILLIS : metadata->timeout_millis;

    std::vector<int32_t> additiveFields;
    if (metadata != nullptr) {
@@ -213,8 +232,8 @@ void AStatsManager_registerPullAtomCallback(int32_t atom_tag,
    }

    std::shared_ptr<StatsPullAtomCallbackInternal> callbackBinder =
            SharedRefBase::make<StatsPullAtomCallbackInternal>(callback, cookie, coolDownNs,
                                                               timeoutNs, additiveFields);
            SharedRefBase::make<StatsPullAtomCallbackInternal>(callback, cookie, coolDownMillis,
                                                               timeoutMillis, additiveFields);

    {
        std::lock_guard<std::mutex> lg(pullAtomMutex);
@@ -226,7 +245,7 @@ void AStatsManager_registerPullAtomCallback(int32_t atom_tag,
    registerThread.detach();
}

void AStatsManager_unregisterPullAtomCallback(int32_t atom_tag) {
void AStatsManager_clearPullAtomCallback(int32_t atom_tag) {
    {
        std::lock_guard<std::mutex> lg(pullAtomMutex);
        // Always remove the puller from our map.
Loading