10175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn/* 21114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn * Copyright (C) 2012-2014 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> 181114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn 190175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "FlushCommand.h" 200175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "LogBufferElement.h" 211114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn#include "LogCommand.h" 220175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn#include "LogReader.h" 231114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn#include "LogTimes.h" 240175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 250175b0747a1f55329109e84c9a1322dcb95e2848Mark SalyzynFlushCommand::FlushCommand(LogReader &reader, 260175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn bool nonBlock, 270175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn unsigned long tail, 280175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn unsigned int logMask, 29fa3716b2501ccddc8e0cd30f6343692b8deb7639Mark Salyzyn pid_t pid, 30fa3716b2501ccddc8e0cd30f6343692b8deb7639Mark Salyzyn log_time start) 310175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn : mReader(reader) 320175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn , mNonBlock(nonBlock) 330175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn , mTail(tail) 340175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn , mLogMask(logMask) 350175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn , mPid(pid) 36fa3716b2501ccddc8e0cd30f6343692b8deb7639Mark Salyzyn , mStart(start) 370175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn{ } 380175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 390175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// runSocketCommand is called once for every open client on the 400175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// log reader socket. Here we manage and associated the reader 410175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// client tracking and log region locks LastLogTimes list of 420175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// LogTimeEntrys, and spawn a transitory per-client thread to 430175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// work at filing data to the socket. 440175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// 450175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// global LogTimeEntry::lock() is used to protect access, 460175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// reference counts are used to ensure that individual 470175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn// LogTimeEntry lifetime is managed when not protected. 480175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzynvoid FlushCommand::runSocketCommand(SocketClient *client) { 490175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry *entry = NULL; 500175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LastLogTimes × = mReader.logbuf().mTimes; 510175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 520175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry::lock(); 530175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LastLogTimes::iterator it = times.begin(); 540175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn while(it != times.end()) { 550175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn entry = (*it); 560175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (entry->mClient == client) { 570175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn entry->triggerReader_Locked(); 580175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (entry->runningReader_Locked()) { 590175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry::unlock(); 600175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return; 610175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 620175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn entry->incRef_Locked(); 630175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn break; 640175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 650175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn it++; 660175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 670175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 680175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (it == times.end()) { 69c03e72cc1c155ff668df8df1caec363b07347d0dMark Salyzyn // Create LogTimeEntry in notifyNewLog() ? 700175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn if (mTail == (unsigned long) -1) { 710175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry::unlock(); 720175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn return; 730175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 74fa3716b2501ccddc8e0cd30f6343692b8deb7639Mark Salyzyn entry = new LogTimeEntry(mReader, client, mNonBlock, mTail, mLogMask, mPid, mStart); 750175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn times.push_back(entry); 760175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn } 770175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 780175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn client->incRef(); 790175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 80c03e72cc1c155ff668df8df1caec363b07347d0dMark Salyzyn // release client and entry reference counts once done 810175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn entry->startReader_Locked(); 820175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn LogTimeEntry::unlock(); 830175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn} 840175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn 850175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzynbool FlushCommand::hasReadLogs(SocketClient *client) { 861114f1806521b2a6447b7c68934e4f3c29b60cb5Mark Salyzyn return clientHasLogCredentials(client); 870175b0747a1f55329109e84c9a1322dcb95e2848Mark Salyzyn} 88