1fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera/* 2fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * Copyright (C) 2010 The Android Open Source Project 3fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * 4fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * Licensed under the Apache License, Version 2.0 (the "License"); 5fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * you may not use this file except in compliance with the License. 6fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * You may obtain a copy of the License at 7fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * 8fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * http://www.apache.org/licenses/LICENSE-2.0 9fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * 10fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * Unless required by applicable law or agreed to in writing, software 11fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * distributed under the License is distributed on an "AS IS" BASIS, 12fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * See the License for the specific language governing permissions and 14fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera * limitations under the License. 15fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera */ 16fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#ifndef __SESSIONMAP_H__ 17fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#define __SESSIONMAP_H__ 18fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 19fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#include <utils/KeyedVector.h> 2090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson#include <utils/threads.h> 21fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 22fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeheranamespace android { 23fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 24fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera/** 2590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * A thread safe wrapper template class for session handlings for Drm Engines. It wraps a 2690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * pointer type over KeyedVector. It keeps pointer as data in the vector and free up memory 2790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * allocated pointer can be of any type of structure/class meant for keeping session data. 2890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * so session object here means pointer to the session data. 29fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera */ 3090855078eb989944bca1824058d7231cd68e5021Henrik B Anderssontemplate <typename TValue> 31fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeheraclass SessionMap { 32fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 33fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbeherapublic: 34fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera SessionMap() {} 35fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 36fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera virtual ~SessionMap() { 3790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson Mutex::Autolock lock(mLock); 38fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera destroyMap(); 39fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 40fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 4190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 4290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * Adds a new value in the session map table. It expects memory to be allocated already 4390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * for the session object 4490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 4590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @param key - key or Session ID 4690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @param value - session object to add 4790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 4890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @return boolean result of adding value. returns false if key is already exist. 4990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 5090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson bool addValue(int key, TValue value) { 5190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson Mutex::Autolock lock(mLock); 5290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson if (!isCreatedInternal(key)) { 5390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson map.add(key, value); 5490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson return true; 5590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 5690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson return false; 57fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 58fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 5990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 6090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * returns the session object by the key 6190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 6290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @param key - key or Session ID 6390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 6490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @return session object as per the key 6590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 6690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson TValue getValue(int key) { 6790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson Mutex::Autolock lock(mLock); 6890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson return getValueInternal(key); 69fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 70fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 7190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 7290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * returns the number of objects in the session map table 7390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 7490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @return count of number of session objects. 7590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 7690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson int getSize() { 7790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson Mutex::Autolock lock(mLock); 7890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson return map.size(); 7990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 80fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 8190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 8290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * returns the session object by the index in the session map table 8390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 8490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @param index - index of the value required 8590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 8690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @return session object as per the index 8790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 8890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson TValue getValueAt(unsigned int index) { 8990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson TValue value = NULL; 9090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson Mutex::Autolock lock(mLock); 9190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson 9290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson if (map.size() > index) { 9390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson value = map.valueAt(index); 9490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 9590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson return value; 96fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 97fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 9890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 9990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * deletes the object from session map. It also frees up memory for the session object. 10090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 10190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @param key - key of the value to be deleted 10290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 10390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 10490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson void removeValue(int key) { 10590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson Mutex::Autolock lock(mLock); 10690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson deleteValue(getValueInternal(key)); 10790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson map.removeItem(key); 10890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 109fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 11090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 11190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * decides if session is already created. 11290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 11390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @param key - key of the value for the session 11490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 11590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @return boolean result of whether session is created 11690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 11790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson bool isCreated(int key) { 11890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson Mutex::Autolock lock(mLock); 11990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson return isCreatedInternal(key); 12090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 121fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 12290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson SessionMap<TValue> & operator=(const SessionMap<TValue> & objectCopy) { 12390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson Mutex::Autolock lock(mLock); 124fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 12590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson destroyMap(); 12690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson map = objectCopy.map; 12790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson return *this; 12890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 129fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 13090855078eb989944bca1824058d7231cd68e5021Henrik B Anderssonprivate: 13190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson KeyedVector<int, TValue> map; 13290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson Mutex mLock; 13390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson 13490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 13590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * free up the memory for the session object. 13690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * Make sure if any reference to the session object anywhere, otherwise it will be a 13790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * dangle pointer after this call. 13890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 13990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @param value - session object to free 14090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 14190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 14290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson void deleteValue(TValue value) { 14390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson delete value; 144fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera } 145fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 14690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 14790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * free up the memory for the entire map. 14890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * free up any resources in the sessions before calling this funtion. 14990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 15090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 15190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson void destroyMap() { 15290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson int size = map.size(); 15390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson 15490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson for (int i = 0; i < size; i++) { 15590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson deleteValue(map.valueAt(i)); 15690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 15790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson map.clear(); 15890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 159fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 16090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 16190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * decides if session is already created. 16290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 16390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @param key - key of the value for the session 16490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 16590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @return boolean result of whether session is created 16690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 16790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson bool isCreatedInternal(int key) { 16890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson return(0 <= map.indexOfKey(key)); 16990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 170fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 17190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson /** 17290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * returns the session object by the key 17390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 17490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @param key - key or Session ID 17590855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * 17690855078eb989944bca1824058d7231cd68e5021Henrik B Andersson * @return session object as per the key 17790855078eb989944bca1824058d7231cd68e5021Henrik B Andersson */ 17890855078eb989944bca1824058d7231cd68e5021Henrik B Andersson TValue getValueInternal(int key) { 17990855078eb989944bca1824058d7231cd68e5021Henrik B Andersson TValue value = NULL; 18090855078eb989944bca1824058d7231cd68e5021Henrik B Andersson if (isCreatedInternal(key)) { 18190855078eb989944bca1824058d7231cd68e5021Henrik B Andersson value = (TValue) map.valueFor(key); 18290855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 18390855078eb989944bca1824058d7231cd68e5021Henrik B Andersson return value; 18490855078eb989944bca1824058d7231cd68e5021Henrik B Andersson } 185fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera}; 186fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 187fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera}; 188fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera 189fdd65a0fc7df2c878cc601e4c0f4021cb264f051Pravat Dalbehera#endif /* __SESSIONMAP_H__ */ 190