File: FooCallback.cpp

package info (click to toggle)
android-platform-system-tools-hidl 10.0.0%2Br36-3.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,936 kB
  • sloc: cpp: 21,933; yacc: 1,416; java: 1,239; lex: 496; sh: 360; python: 44; xml: 20; makefile: 12
file content (134 lines) | stat: -rw-r--r-- 4,454 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

#define LOG_TAG "hidl_test"

#include "FooCallback.h"
#include <hidl-test/FooHelper.h>
#include <inttypes.h>
#include <log/log.h>
#include <utils/Timers.h>

namespace android {
namespace hardware {
namespace tests {
namespace foo {
namespace V1_0 {
namespace implementation {

enum {
    NOT_REPORTED = -1LL
};

FooCallback::FooCallback()
        : mLock{}, mCond{} {
    for (size_t i = 0; i < invokeInfo.size(); i++) {
        invokeInfo[i].invoked = false;
        invokeInfo[i].timeNs = NOT_REPORTED;
        invokeInfo[i].callerBlockedNs = NOT_REPORTED;
    }
}

Return<void> FooCallback::heyItsYou(
        const sp<IFooCallback> &_cb) {
    nsecs_t start = systemTime();
    ALOGI("SERVER(FooCallback) 1: heyItsYou cb = %p", _cb.get());
    nsecs_t end = systemTime();
    {
        Mutex::Autolock lock(mLock);
        invokeInfo[0].invoked = true;
        invokeInfo[0].timeNs = end - start;
        mCond.signal();
    }
    ALOGI("SERVER(FooCallback) 2: heyItsYou returned");
    return Void();
}

Return<bool> FooCallback::heyItsYouIsntIt(const sp<IFooCallback> &_cb) {
    nsecs_t start = systemTime();
    ALOGI("SERVER(FooCallback) 3: heyItsYouIsntIt cb = %p sleeping for %" PRId64 " seconds", _cb.get(), DELAY_S);
    sleep(DELAY_S);
    ALOGI("SERVER(FooCallback) 4: heyItsYouIsntIt cb = %p responding", _cb.get());
    nsecs_t end = systemTime();
    {
        Mutex::Autolock lock(mLock);
        invokeInfo[1].invoked = true;
        invokeInfo[1].timeNs = end - start;
        mCond.signal();
    }
    ALOGI("SERVER(FooCallback) 5: heyItsYouIsntIt cb = %p responding", _cb.get());
    return true;
}

Return<void> FooCallback::heyItsTheMeaningOfLife(uint8_t tmol) {
    nsecs_t start = systemTime();
    ALOGI("SERVER(FooCallback) 6.1: heyItsTheMeaningOfLife = %d sleeping for %" PRId64 " seconds", tmol, DELAY_S);
    sleep(DELAY_S);
    ALOGI("SERVER(FooCallback) 6.2: heyItsTheMeaningOfLife = %d done sleeping", tmol);
    nsecs_t end = systemTime();
    {
        Mutex::Autolock lock(mLock);
        invokeInfo[2].invoked = true;
        invokeInfo[2].timeNs = end - start;
        mCond.signal();
    }
    ALOGI("SERVER(FooCallback) 6.3: heyItsTheMeaningOfLife returned");
    return Void();
}

Return<void> FooCallback::reportResults(int64_t ns, reportResults_cb cb) {
    ALOGI("SERVER(FooCallback) 8.1: reportResults(%" PRId64 " seconds)", nanoseconds_to_seconds(ns));
    nsecs_t leftToWaitNs = ns;
    bool cond;
    {
        Mutex::Autolock lock(mLock);
        while ((cond = ((!invokeInfo[0].invoked ||
                !invokeInfo[1].invoked ||
                !invokeInfo[2].invoked ||
                invokeInfo[0].callerBlockedNs == NOT_REPORTED ||
                invokeInfo[1].callerBlockedNs == NOT_REPORTED ||
                invokeInfo[2].callerBlockedNs == NOT_REPORTED)   &&
               leftToWaitNs > 0))) {
            nsecs_t start = systemTime();
            ::android::status_t rc = mCond.waitRelative(mLock, leftToWaitNs);
            if (rc != ::android::OK) {
                ALOGW("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative(%" PRId64 ") returned error (%d)", ns, leftToWaitNs, rc);
                if (rc == -ETIMEDOUT) {
                    // time's up
                    leftToWaitNs = -INT32_MAX;
                }
                break;
            }
            ALOGI("SERVER(FooCallback)::reportResults(%" PRId64 " ns) Condition::waitRelative was signalled", ns);
            leftToWaitNs -= systemTime() - start;
        }
    }
    ALOGI("SERVER(FooCallback) 8.2: reportResults returned;"
            "invoked? %d, %d, %d; leftToWaitNs = %" PRId64 "; cond = %d",
            invokeInfo[0].invoked, invokeInfo[1].invoked, invokeInfo[2].invoked,
            leftToWaitNs, cond);
    cb(leftToWaitNs, invokeInfo);
    return Void();
}

Return<void> FooCallback::youBlockedMeFor(const hidl_array<int64_t, 3> &ns) {
    ALOGI("SERVER(FooCallback) 7.1: youBlockedMeFor");
    {
        Mutex::Autolock lock(mLock);
        for (size_t i = 0; i < 3; i++) {
            invokeInfo[i].callerBlockedNs = ns[i];
        }
        mCond.signal();
    }
    ALOGI("SERVER(FooCallback) 7.2: returned");
    return Void();
}

IFooCallback* HIDL_FETCH_IFooCallback(const char* /* name */) {
    return new FooCallback();
}

} // namespace implementation
}  // namespace V1_0
}  // namespace foo
}  // namespace tests
}  // namespace hardware
}  // namespace android