SystemSuspend পরিষেবা

Android 9 এবং তার আগের ভার্সনে libsuspend-এ একটি থ্রেড আছে যা সিস্টেম সাসপেন্ড করার জন্য দায়ী। Android 10 SystemSuspend HIDL পরিষেবায় একই ধরনের কার্যকারিতা নিয়ে আসে। এই পরিষেবা সিস্টেম ইমেজে থাকে এবং Android প্ল্যাটফর্মের মাধ্যমে পরিবেশন করা হয়। libsuspend-এর লজিক মূলত একই থাকে, তবে সিস্টেম সাসপেন্ড ব্লক করা প্রতিটি ইউজারস্পেস প্রসেসকে SystemSuspend-এর সাথে যোগাযোগ করতে হয়।

libsuspend ও libpower

Android 10-এ, SystemSuspend পরিষেবা libsuspend-কে প্রতিস্থাপন করে। C API পরিবর্তন না করেই /sys/power/wake[un]lock-এর পরিবর্তে SystemSuspend পরিষেবার উপর নির্ভর করার জন্য libpower আবার প্রয়োগ করা হয়েছে।

এই ছদ্মকোড থেকে acquire_wake_lock ও release_wake_lock কীভাবে প্রয়োগ করতে হয় তা জানতে পারবেন।


static std::unordered_map<std::string, sp<IWakeLock>> gWakeLockMap;

int acquire_wake_lock(int, const char* id) {
    ...
    if (!gWakeLockMap[id]) {
        gWakeLockMap[id] = suspendService->acquireWakeLock(WakeLockType::PARTIAL, id);
    }
    ...
    return 0;
}

int release_wake_lock(const char* id) {
    ...
    if (gWakeLockMap[id]) {
        auto ret = gWakeLockMap[id]->release();
        gWakeLockMap[id].clear();
        return 0;
    }
    ...
    return -1;
}

এক্সিকিউশন থ্রেড

SystemSuspend পরিষেবা, সাসপেন্ড কাউন্টার সহ ইস্যু করা ওয়েক লকগুলির সংখ্যা ট্র্যাক করে। এতে এক্সিকিউশনের দুটি থ্রেড আছে:

  • প্রধান থ্রেড বাইন্ডার কলের উত্তর দেয়।
  • সাসপেন্ড থ্রেড সিস্টেম সাসপেন্ড কন্ট্রোল করে।

আসল থ্রেড

মূল থ্রেড নতুন ওয়েক লক বরাদ্দ করার জন্য ক্লায়েন্টদের থেকে আসা অনুরোধের উত্তর দেয়, সাসপেন্ড কাউন্টার বাড়ায়/কমায়।

থ্রেড সাসপেন্ড করা

সাসপেন্ড থ্রেড লুপে নিম্নলিখিত কাজগুলি করে:

  1. /sys/power/wakeup_count থেকে পড়ুন।
  2. মিউটেক্স অ্যাকোয়ার করুন। এটি নিশ্চিত করে যে মূল থ্রেডটি সাসপেন্ড কাউন্টার বাড়ানো বা কমানোর চেষ্টা করার সময় সাসপেন্ড থ্রেডটি সেটি স্পর্শ করে না। সাসপেন্ড কাউন্টার শূন্যে পৌঁছালে এবং সাসপেন্ড থ্রেড রান করার চেষ্টা করলে, ওয়েক লক ইস্যু বা সরানোর সময় প্রধান থ্রেড ব্লক হয়ে যায়।
  3. কাউন্টার শূন্য না হওয়া পর্যন্ত অপেক্ষা করুন।
  4. /sys/power /wakeup_count থেকে (ধাপ ১ থেকে) পড়া ভ্যালু এই ফাইলে লিখুন। রাইট করা না গেলে, লুপের শুরুতে ফিরে যান
  5. /sys/power/state-এ mem লিখে সিস্টেম সাসপেন্ড করা শুরু করুন।
  6. মিউটেক্স রিলিজ করুন।

ওয়েক লক সংক্রান্ত অনুরোধ সফলভাবে রিটার্ন করলে, সাসপেন্ড থ্রেডটি ব্লক হয়ে যায়।

ছবি ১. থ্রেড লুপ সাসপেন্ড করা

SystemSuspend API

SystemSuspend API-তে দুটি ইন্টারফেস থাকে। HIDL ইন্টারফেস ব্যবহার করা হয় নেটিভ প্রসেস দ্বারা ওয়েক লক পাওয়ার জন্য এবং AIDL ইন্টারফেস ব্যবহার করা হয় SystemServer ও SystemSuspend-এর মধ্যে যোগাযোগ করার জন্য।

ISystemSuspend HIDL ইন্টারফেস


enum WakeLockType : uint32_t {
    PARTIAL,
    FULL
};

interface IWakeLock {
    oneway release();
};

interface ISystemSuspend {
    acquireWakeLock(WakeLockType type, string debugName)
        generates (IWakeLock lock);
};

ওয়েক লকের অনুরোধ করা প্রতিটি ক্লায়েন্ট একটি অনন্য IWakeLock ইনস্ট্যান্স পায়। এটি /sys/power/wake_lock-এর থেকে আলাদা, যা একাধিক ক্লায়েন্টকে একই নামে ওয়েক লক ব্যবহার করতে দেয়। IWakeLock ইনস্ট্যান্স হোল্ড করা কোনও ক্লায়েন্ট বন্ধ হয়ে গেলে, বাইন্ডার ড্রাইভার ও SystemSuspend পরিষেবা এটি ক্লিন-আপ করে।

ISuspendControlService AIDL ইন্টারফেস

ISuspendControlService শুধুমাত্র SystemServer-এর মাধ্যমে ব্যবহার করার জন্য তৈরি করা হয়েছে।


interface ISuspendCallback {
     void notifyWakeup(boolean success);
}

interface ISuspendControlService {
    boolean enableAutosuspend();
    boolean registerCallback(ISuspendCallback callback);
    boolean forceSuspend();
}

Android HIDL ব্যবহার করলে নিম্নলিখিত সুবিধাগুলি পাওয়া যায়:

  • সাসপেন্ড-ব্লকিং প্রসেস বন্ধ হয়ে গেলে, SystemSuspend-কে বিজ্ঞপ্তি পাঠানো যেতে পারে।
  • সিস্টেম সাসপেন্ড করার জন্য দায়ী থ্রেডকে কলব্যাক দেওয়া যেতে পারে।