FlushCommand.cpp revision 0175b0747a1f55329109e84c9a1322dcb95e2848
10175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn/* 20175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Copyright (C) 2012-2013 The Android Open Source Project 30175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * 40175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 50175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * you may not use this file except in compliance with the License. 60175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * You may obtain a copy of the License at 70175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * 80175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 90175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * 100175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 110175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 120175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * See the License for the specific language governing permissions and 140175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn * limitations under the License. 150175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn */ 160175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 170175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <stdlib.h> 180175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include <private/android_filesystem_config.h> 190175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "FlushCommand.h" 200175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "LogBufferElement.h" 210175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "LogTimes.h" 220175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "LogReader.h" 230175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 240175b0747a1f55329109e84c9a1322dcb95e2848Mark SalyzynFlushCommand::FlushCommand(LogReader &reader, 250175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn bool nonBlock, 260175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn unsigned long tail, 270175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn unsigned int logMask, 280175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn pid_t pid) 290175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn : mReader(reader) 300175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn , mNonBlock(nonBlock) 310175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn , mTail(tail) 320175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn , mLogMask(logMask) 330175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn , mPid(pid) 340175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn{ } 350175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 360175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// runSocketCommand is called once for every open client on the 370175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// log reader socket. Here we manage and associated the reader 380175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// client tracking and log region locks LastLogTimes list of 390175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// LogTimeEntrys, and spawn a transitory per-client thread to 400175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// work at filing data to the socket. 410175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// 420175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// global LogTimeEntry::lock() is used to protect access, 430175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// reference counts are used to ensure that individual 440175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// LogTimeEntry lifetime is managed when not protected. 450175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzynvoid FlushCommand::runSocketCommand(SocketClient *client) { 460175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry *entry = NULL; 470175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LastLogTimes × = mReader.logbuf().mTimes; 480175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 490175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry::lock(); 500175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LastLogTimes::iterator it = times.begin(); 510175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn while(it != times.end()) { 520175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn entry = (*it); 530175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (entry->mClient == client) { 540175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn entry->triggerReader_Locked(); 550175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (entry->runningReader_Locked()) { 560175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry::unlock(); 570175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return; 580175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 590175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn entry->incRef_Locked(); 600175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn break; 610175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 620175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn it++; 630175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 640175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 650175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (it == times.end()) { 660175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn /* Create LogTimeEntry in notifyNewLog() ? */ 670175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (mTail == (unsigned long) -1) { 680175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry::unlock(); 690175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return; 700175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 710175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn entry = new LogTimeEntry(mReader, client, mNonBlock, mTail, mLogMask, mPid); 720175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn times.push_back(entry); 730175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 740175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 750175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn client->incRef(); 760175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 770175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn /* release client and entry reference counts once done */ 780175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn entry->startReader_Locked(); 790175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry::unlock(); 800175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn} 810175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 820175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzynbool FlushCommand::hasReadLogs(SocketClient *client) { 830175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return (client->getUid() == AID_ROOT) 840175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn || (client->getGid() == AID_ROOT) 850175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn || (client->getGid() == AID_LOG); 860175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn} 87