text:
local rtShader
local rt
local lastUpdateTime = 0

addEventHandler( "onClientResourceStart", resourceRoot,
	function ( resource )
		rtShader = dxCreateShader ( "rt_blend.fx" )
	end
)

-- drawScoreboard
--		Do things depending on things
function drawScoreboard()
	cursorCache = {}
	if #savedRowsNext > 0 then
		savedRows = savedRowsNext
		savedRowsNext = {}
	end

	if not scoreboardDrawn then
		doDrawScoreboard ( false--[[rtPass]], true--[[onlyAnim]], guiGetScreenSize() )
		bForceUpdate = true
		return
	end

	-- Update once every 1000ms
	local bUpdate = false
	if getTickCount() - lastUpdateTime > 1000 or bForceUpdate then
		bUpdate = true
		bForceUpdate = false
		lastUpdateTime = getTickCount()
	end

	-- Determine if new rt is needed
	local sX, sY = getRequiredRtSize()
	if rt then
		local rX, rY = dxGetMaterialSize( rt )
		if sX ~= rX or sY ~= rY then
			destroyElement( rt )
			rt = nil
		end
	end

	-- Try to create rt if needed
	if not rt then
		rt = dxCreateRenderTarget( sX, sY, true )
		bUpdate = true
	end

	-- No rt then use standard drawing (hold num_9 to test)
	if not rt or getKeyState("num_9") then
		doDrawScoreboard ( false --[[rtPass]], false --[[onlyAnim]], guiGetScreenSize() )
		return
	end

	-- See if highlighted row will change
	local newRowIdx = getCursorOverRow(true)
	if newRowIdx ~= lastRowIdx then
		-- Force rt update if highlighted row will change
		lastRowIdx = newRowIdx
		bUpdate = true
	end

	-- Draw background to screen
	doDrawScoreboard ( true --[[rtPass]], true --[[onlyAnim]], guiGetScreenSize() )

	-- Update to rt
	if bUpdate then
		dxSetRenderTarget ( rt, true )

		-- Save drawOverGUI settings
		local drawOverGUISaved = drawOverGUI
		drawOverGUI = false

		-- Draw all text to rt
		doDrawScoreboard ( true --[[rtPass]], false --[[onlyAnim]], getRequiredRtSize() )

		-- Restore drawOverGUI settings
		drawOverGUI = drawOverGUISaved

		dxSetRenderTarget ()
	end

    -- If no text drawn then we are done
	if not scoreboardDrawn then
		return
	end

	-- Draw rt
	local x, y = scoreboardGetTopCornerPosition()

	dxSetShaderValue( rtShader, "sTexture0", rt );
	dxDrawImage( x, y, sX, sY, rtShader, 0, 0, 0, tocolor(255,255,255), drawOverGUI )
end

-- Calc required render target size
--		Includes extra 15 pixels top and bottom for the scroll buttons
function getRequiredRtSize()
	local sX, sY = calculateWidth(), calculateHeight()
	if not sX then
		sX, sY = guiGetScreenSize()
	else
		sY = sY + 30
	end
	return math.floor(sX), math.floor(sY)
end

-- Adjust cursor position if using rt
cursorCache = {}
function getCursorScoreboardPosition(rtPass)
	if #cursorCache == 0 then
		local cX, cY = getCursorPosition()
		local sX, sY = guiGetScreenSize()
		cX, cY = cX*sX, cY*sY
		if rtPass then
			local x, y = scoreboardGetTopCornerPosition()
			cX, cY = cX-x, cY-y
		end
		cursorCache = { cX, cY }
	end
	return unpack(cursorCache)
end

savedRowsNext = {}
savedRows = {}
-- Return true is cursor is inside bounds
--		Also saves row data to check if highlighted row is changing between rt updates
function checkCursorOverRow( rtPass, xl,xh,yl,yh )
	if isCursorShowing() then
		savedRowsNext[#savedRowsNext + 1] = { xl,xh,yl,yh }
		local cX, cY = getCursorScoreboardPosition( rtPass )
		if cX >= xl and cX <= xh and cY >= yl and cY <= yh then
			return true
		end
	end
	return false
end

-- Return index of the row the cursor is hovering over
function getCursorOverRow(rtPass)
	if isCursorShowing() then
		local cX, cY = getCursorScoreboardPosition( rtPass )
		for idx,row in ipairs(savedRows) do
			if cX >= row[1] and cX <= row[2] and cY >= row[3] and cY <= row[4] then
				return idx
			end
		end
	end
	return false
end

--------------------------------------------------------------------
--
-- Fake player data for debugging scoreboard
--		Set bAddFakePlayers to true to create some test data
--
--------------------------------------------------------------------
local bAddFakePlayers = false

if bAddFakePlayers then

    local numberOfTeams = 4
    local numberOfPlayersPerTeam = 6

	_getElementsByType = getElementsByType
	function getElementsByType(type)
		local results = _getElementsByType( type )
		if ( type == "player" ) then
			results = {}
			for t=1,numberOfTeams do
				for p=1,numberOfPlayersPerTeam do
					results[#results + 1] = string.format( "player %d %d", t, p )
				end
			end
		elseif ( type == "team" ) then
			results = {}
			for t=1,numberOfTeams do
				results[#results + 1] = string.format( "team %d", t )
			end
		end
		return results
	end

	_getLocalPlayer = getLocalPlayer
	function getLocalPlayer(type)
		return nil
	end

	_getPlayerTeam = getPlayerTeam
	function getPlayerTeam(player)
		return nil
	end

	_getPlayerName = getPlayerName
	function getPlayerName(player)
		return tostring(player)
	end

	_getPlayerPing = getPlayerPing
	function getPlayerPing(player)
		return math.random(10,100)
	end

	_getElementData = getElementData
	function getElementData(player, name)
		return _getElementData(localPlayer, name)
	end

	_isElement = isElement
	function isElement(elem)
		return _isElement(elem) or type(elem) == "string"
	end

	_getElementType = getElementType
	function getElementType(elem)
		if ( type(elem) == "string" ) then
			local parts = split( elem, string.byte(' ') )
			if parts[1] == "player" then
				return "player"
			elseif parts[1] == "team" then
				return "team"
			end
		end
		return _getElementType(elem)
	end

	_getPlayerNametagColor = getPlayerNametagColor
	function getPlayerNametagColor(plr)
		if ( type(plr) == "string" ) then
			local parts = split( plr, string.byte(' ') )
			if parts[2] == "1" then
				return 255,0,0,255
			elseif parts[2] == "2" then
				return 0,255,0,255
			elseif parts[2] == "3" then
				return 0,0,255,255
			else
				return 255,0,255,255
			end
		end
		return _getPlayerNametagColor(plr)
	end

	_getTeamColor = getTeamColor
	function getTeamColor(team)
		if ( type(team) == "string" ) then
			local parts = split( team, string.byte(' ') )
			if parts[2] == "1" then
				return 255,90,90,255
			elseif parts[2] == "2" then
				return 90,255,90,255
			elseif parts[2] == "3" then
				return 90,90,255,255
			else
				return 255,90,255,255
			end
		end
		return _getTeamColor(team)
	end

	_getTeamName = getTeamName
	function getTeamName(team)
		return tostring(team)
	end

	_getPlayersInTeam = getPlayersInTeam
	function getPlayersInTeam(team)
		if ( type(team) == "string" ) then
			local parts = split( team, string.byte(' ') )
			results = {}
			local t=tonumber(parts[2])
				for p=1,numberOfPlayersPerTeam do
					results[#results + 1] = string.format( "player %d %d", t, p )
				end
			return results
		end
		return _getPlayersInTeam(team)
	end
end


text:
module GraphqlDoc
  extend ActiveSupport::Concern

  included do
    swagger_controller :graphql, 'GraphQL'

    swagger_api :create do
      summary 'GraphQL interface'
      notes 'Use this method in order to send queries to the GraphQL server'
      param :query, :query, :string, :required, 'GraphQL query'
      # response(code, message, exampleRequest)
      # "exampleRequest" should be: { query: {}, headers: {}, body: {} }
      authed = { CONFIG['authorization_header'] => 'test' }
      response :ok, 'GraphQL result', { query: { query: 'query Query { about { name, version } }' }, headers: authed }
      response 401, 'Access denied', { query: { query: 'query Query { about { name, version } }' } }
    end
  end
end
# :nocov:

redpajama_set_name: RedPajamaGithub


text:
//	File name: ImportManagerComponent.cpp
//	Description: Import manager component implementation.

#include "StdAfx.h"
#include "ImportManagerComponent.h"

#include "Interface_idds.h"

CImportManagerComponent::CImportManagerComponent()
	: bIsInitialized(false)
	, csNetworkImportLib(_T("NetworkImport.dll"))
	, hLibrary(NULL)
	, pfnGetComponentName(NULL)
	, pfnGetComponentVersion(NULL)
	, pfnCreateImportManager(NULL)
	, pfnReleaseImportManager(NULL)
{
	GetModuleFileName(GetModuleHandle(NULL), csAppFolder.GetBuffer(MAX_PATH), MAX_PATH);
	csAppFolder.ReleaseBuffer();
	int tmPos = csAppFolder.ReverseFind('\\');
	csAppFolder	= csAppFolder.Left(tmPos);
}

CImportManagerComponent::~CImportManagerComponent()
{
	UnloadComponent();
}

IImportManager* CImportManagerComponent::GetImportManager()
{
	if (!bIsInitialized)
		return NULL;

	IImportManager* pImportManager = (*pfnCreateImportManager)();
	pImportManager->InitializeManager();

	return pImportManager;
}

void CImportManagerComponent::ReleaseImportManager(IImportManager* pManager)
{
	if (pManager)
	{
		(*pfnReleaseImportManager)(pManager);
	}
}

bool CImportManagerComponent::IsLoaded()
{
	return bIsInitialized;
}

CString CImportManagerComponent::GetAppFolder()
{
	return csAppFolder;
}

// IComponent implementations section
bool CImportManagerComponent::LoadComponent()
{
	if (!VerifyWhetherExists())
		return false;

	CString tmLibFile =
		csAppFolder +
		CString(_T("\\Exports\\")) +
		csNetworkImportLib;

	hLibrary = LoadLibrary(tmLibFile);
	if (!hLibrary)
		return false;

	(FARPROC &)pfnGetComponentName = GetProcAddress(hLibrary, "GetComponentName");
	(FARPROC &)pfnGetComponentVersion = GetProcAddress(hLibrary, "GetComponentVersion");

	if (!pfnGetComponentName || !pfnGetComponentVersion)
	{
		UnloadComponent();
		return false;
	}

	(FARPROC &)pfnCreateImportManager = GetProcAddress(hLibrary, "CreateImportManager");
	(FARPROC &)pfnReleaseImportManager = GetProcAddress(hLibrary, "ReleaseImportManager");

	if (!pfnCreateImportManager || !pfnReleaseImportManager)
	{
		UnloadComponent();
		return false;
	}

	IImportManager* pImportManager = (*pfnCreateImportManager)();
	if (!pImportManager)
	{
		UnloadComponent();
		return false;
	} else
		(*pfnReleaseImportManager)(pImportManager);

	bIsInitialized = true;
	return bIsInitialized;
}

bool CImportManagerComponent::UnloadComponent()
{
	bool bRet = true;
	bIsInitialized = false;

	if (hLibrary)
	{
		FreeLibrary(hLibrary);
		hLibrary = NULL;
	}

	return bRet;
}

bool CImportManagerComponent::VerifyWhetherExists()
{
	// Tis method is not implemented because you can locate BuilderElements.dll and
	//  NetworkImport.dll in folder that differs from your application default folder.
	// You must make them accessible for LoadLibrary call.

	return true;
}

CString CImportManagerComponent::GetComponentName()
{
	CString csComponentName = _T("");
	if (bIsInitialized && pfnGetComponentName)
	{
		csComponentName = (*pfnGetComponentName)();
	}
	return csComponentName;
}

CString CImportManagerComponent::GetComponentVersion()
{
	CString csComponentVirsion = _T("");
	if (bIsInitialized && pfnGetComponentVersion)
	{
		csComponentVirsion = (*pfnGetComponentVersion)();
	}
	return csComponentVirsion;
}

// IObject declarations section
CString CImportManagerComponent::GetClassString()
{
	return _T("CImportManagerComponent");
}

void CImportManagerComponent::QueryInterface(int iIDD, void** ppvObject)
{
	*ppvObject = NULL;

	switch (iIDD)
	{
	case IDD_IComponent:
		*ppvObject = (IComponent*)this;
		break;
	}
}


text:
#include "ecma-builtins.h"
#include "ecma-exceptions.h"
#include "ecma-gc.h"
#include "ecma-globals.h"
#include "ecma-helpers.h"
#include "ecma-typedarray-object.h"
#include "ecma-try-catch-macro.h"
#include "ecma-function-object.h"
#include "jrt.h"

#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN

#define ECMA_BUILTINS_INTERNAL
#include "ecma-builtins-internal.h"

#define BUILTIN_INC_HEADER_NAME "ecma-builtin-typedarray.inc.h"
#define BUILTIN_UNDERSCORED_ID typedarray
#include "ecma-builtin-internal-routines-template.inc.h"

/** \addtogroup ecma ECMA
 * @{
 *
 * \addtogroup ecmabuiltins
 * @{
 *
 * \addtogroup typedarray ECMA %TypedArray% object built-in
 * @{
 */

/**
 * The %TypedArray%.from routine
 *
 * See also:
 *         ES2015 22.2.2.1
 *
 * @return ecma value
 *         Returned value must be freed with ecma_free_value.
 */
static ecma_value_t
ecma_builtin_typedarray_from (ecma_value_t this_arg, /**< 'this' argument */
                              const ecma_value_t *arguments_list_p, /**< arguments list */
                              ecma_length_t arguments_list_len) /**< number of arguments */
{
  JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);

  if (!ecma_is_constructor (this_arg))
  {
    return ecma_raise_type_error (ECMA_ERR_MSG ("'this' is not a constructor."));
  }

  ecma_value_t source;
  ecma_value_t map_fn = ECMA_VALUE_UNDEFINED;
  ecma_value_t this_in_fn = ECMA_VALUE_UNDEFINED;

  if (arguments_list_len == 0)
  {
    return ecma_raise_type_error (ECMA_ERR_MSG ("no source argument"));
  }

  source = arguments_list_p[0];

  if (arguments_list_len > 1)
  {
    map_fn = arguments_list_p[1];

    if (!ecma_op_is_callable (map_fn))
    {
      return ecma_raise_type_error (ECMA_ERR_MSG ("mapfn argument is not callable"));
    }

    if (arguments_list_len > 2)
    {
      this_in_fn = arguments_list_p[2];
    }
  }

  ecma_object_t *obj_p = ecma_get_object_from_value (this_arg);

  uint8_t builtin_id = ecma_get_object_builtin_id (obj_p);
  ecma_object_t *proto_p;
  uint8_t element_size_shift;
  lit_magic_string_id_t class_id;

  switch (builtin_id)
  {
    case ECMA_BUILTIN_ID_INT8ARRAY:
    {
      proto_p = ecma_builtin_get (ECMA_BUILTIN_ID_INT8ARRAY_PROTOTYPE);
      element_size_shift = 0;
      class_id = LIT_MAGIC_STRING_INT8_ARRAY_UL;
      break;
    }
    case ECMA_BUILTIN_ID_UINT8ARRAY:
    {
      proto_p = ecma_builtin_get (ECMA_BUILTIN_ID_UINT8ARRAY_PROTOTYPE);
      element_size_shift = 0;
      class_id = LIT_MAGIC_STRING_UINT8_ARRAY_UL;
      break;
    }
    case ECMA_BUILTIN_ID_UINT8CLAMPEDARRAY:
    {
      proto_p = ecma_builtin_get (ECMA_BUILTIN_ID_UINT8CLAMPEDARRAY_PROTOTYPE);
      element_size_shift = 0;
      class_id = LIT_MAGIC_STRING_UINT8_CLAMPED_ARRAY_UL;
      break;
    }
    case ECMA_BUILTIN_ID_INT16ARRAY:
    {
      proto_p = ecma_builtin_get (ECMA_BUILTIN_ID_INT16ARRAY_PROTOTYPE);
      element_size_shift = 1;
      class_id = LIT_MAGIC_STRING_INT16_ARRAY_UL;
      break;
    }
    case ECMA_BUILTIN_ID_UINT16ARRAY:
    {
      proto_p = ecma_builtin_get (ECMA_BUILTIN_ID_UINT16ARRAY_PROTOTYPE);
      element_size_shift = 1;
      class_id = LIT_MAGIC_STRING_UINT16_ARRAY_UL;
      break;
    }
    case ECMA_BUILTIN_ID_INT32ARRAY:
    {
      proto_p = ecma_builtin_get (ECMA_BUILTIN_ID_INT32ARRAY_PROTOTYPE);
      element_size_shift = 2;
      class_id = LIT_MAGIC_STRING_INT32_ARRAY_UL;
      break;
    }
    case ECMA_BUILTIN_ID_UINT32ARRAY:
    {
      proto_p = ecma_builtin_get (ECMA_BUILTIN_ID_UINT32ARRAY_PROTOTYPE);
      element_size_shift = 2;
      class_id = LIT_MAGIC_STRING_UINT32_ARRAY_UL;
      break;
    }
    case ECMA_BUILTIN_ID_FLOAT32ARRAY:
    {
      proto_p = ecma_builtin_get (ECMA_BUILTIN_ID_FLOAT32ARRAY_PROTOTYPE);
      element_size_shift = 2;
      class_id = LIT_MAGIC_STRING_FLOAT32_ARRAY_UL;
      break;
    }
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64
    case ECMA_BUILTIN_ID_FLOAT64ARRAY:
    {
      proto_p = ecma_builtin_get (ECMA_BUILTIN_ID_FLOAT64ARRAY_PROTOTYPE);
      element_size_shift = 3;
      class_id = LIT_MAGIC_STRING_FLOAT64_ARRAY_UL;
      break;
    }
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64 */
    default:
    {
      return ecma_raise_type_error (ECMA_ERR_MSG ("'this' is not a typedarray constructor"));
    }
  }

  ecma_deref_object (proto_p);

  return ecma_op_typedarray_from (source,
                                  map_fn,
                                  this_in_fn,
                                  proto_p,
                                  element_size_shift,
                                  class_id);

} /* ecma_builtin_typedarray_from */

/**
 * The %TypedArray%.of routine
 *
 * See also:
 *         ES2015 22.2.2.2
 *
 * @return ecma value
 *         Returned value must be freed with ecma_free_value.
 */
static ecma_value_t
ecma_builtin_typedarray_of (ecma_value_t this_arg, /**< 'this' argument */
                            const ecma_value_t *arguments_list_p, /**< arguments list */
                            ecma_length_t arguments_list_len) /**< number of arguments */
{
  JERRY_UNUSED (this_arg);
  JERRY_UNUSED (arguments_list_p);
  JERRY_UNUSED (arguments_list_len);

  /* TODO: implement 'of' */

  return ECMA_VALUE_UNDEFINED;
} /* ecma_builtin_typedarray_of */

/**
 * Handle calling [[Call]] of built-in %TypedArray% object
 *
 * ES2015 22.2.1 If %TypedArray% is directly called or
 * called as part of a new expression an exception is thrown
 *
 * @return ecma value
 */
ecma_value_t
ecma_builtin_typedarray_dispatch_call (const ecma_value_t *arguments_list_p, /**< arguments list */
                                       ecma_length_t arguments_list_len) /**< number of arguments */
{
  JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);

  return ecma_raise_type_error (ECMA_ERR_MSG ("TypedArray intrinstic cannot be directly called"));
} /* ecma_builtin_typedarray_dispatch_call */

/**
 * Handle calling [[Construct]] of built-in %TypedArray% object
 *
 * ES2015 22.2.1 If %TypedArray% is directly called or
 * called as part of a new expression an exception is thrown
 *
 * @return ecma value
 */
ecma_value_t
ecma_builtin_typedarray_dispatch_construct (const ecma_value_t *arguments_list_p, /**< arguments list */
                                            ecma_length_t arguments_list_len) /**< number of arguments */
{
  JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL);

  return ecma_raise_type_error (ECMA_ERR_MSG ("TypedArray intrinstic cannot be called by a 'new' expression"));
} /* ecma_builtin_typedarray_dispatch_construct */

/**
 * @}
 * @}
 * @}
 */

#endif /* !CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */


text:
package com.junichi11.netbeans.modules.editorconfig.editor.csl;

import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.swing.ImageIcon;
import org.netbeans.modules.csl.api.ElementHandle;
import org.netbeans.modules.csl.api.ElementKind;
import org.netbeans.modules.csl.api.HtmlFormatter;
import org.netbeans.modules.csl.api.Modifier;
import org.netbeans.modules.csl.api.StructureItem;

/**
 *
 * @author junichi11
 */
public class EditorConfigPropertyStructureItem implements StructureItem {

    private final String key;
    private final String value;
    private final int startPosition;
    private final int endPosition;

    public EditorConfigPropertyStructureItem(String key, String value, int startPosition, int endPosition) {
        this.key = key;
        this.value = value;
        this.startPosition = startPosition;
        this.endPosition = endPosition;
    }

    @Override
    public String getName() {
        return key;
    }

    @Override
    public String getSortText() {
        return key;
    }

    @Override
    public String getHtml(HtmlFormatter formatter) {
        return String.format("%s : %s", key, value); // NOI18N
    }

    @Override
    public ElementHandle getElementHandle() {
        return new EditorConfigElementHandle(key, startPosition, endPosition, ElementKind.PROPERTY);
    }

    @Override
    public ElementKind getKind() {
        return ElementKind.PROPERTY;
    }

    @Override
    public Set<Modifier> getModifiers() {
        return Collections.emptySet();
    }

    @Override
    public boolean isLeaf() {
        return true;
    }

    @Override
    public List<? extends StructureItem> getNestedItems() {
        return Collections.emptyList();
    }

    @Override
    public long getPosition() {
        return startPosition;
    }

    @Override
    public long getEndPosition() {
        return endPosition;
    }

    @Override
    public ImageIcon getCustomIcon() {
        return null;
    }

}


text:
#include <linux/export.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/pagemap.h>
#include <linux/threads.h>
#include <linux/smp.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/fs.h>
#include <linux/seq_file.h>
#include <linux/cache.h>
#include <linux/jiffies.h>
#include <linux/profile.h>
#include <linux/bootmem.h>
#include <linux/vmalloc.h>
#include <linux/ftrace.h>
#include <linux/cpu.h>
#include <linux/slab.h>
#include <linux/kgdb.h>

#include <asm/head.h>
#include <asm/ptrace.h>
#include <linux/atomic.h>
#include <asm/tlbflush.h>
#include <asm/mmu_context.h>
#include <asm/cpudata.h>
#include <asm/hvtramp.h>
#include <asm/io.h>
#include <asm/timer.h>
#include <asm/setup.h>

#include <asm/irq.h>
#include <asm/irq_regs.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/oplib.h>
#include <asm/uaccess.h>
#include <asm/starfire.h>
#include <asm/tlb.h>
#include <asm/sections.h>
#include <asm/prom.h>
#include <asm/mdesc.h>
#include <asm/ldc.h>
#include <asm/hypervisor.h>
#include <asm/pcr.h>

#include "cpumap.h"
#include "kernel.h"

DEFINE_PER_CPU(cpumask_t, cpu_sibling_map) = CPU_MASK_NONE;
cpumask_t cpu_core_map[NR_CPUS] __read_mostly =
	{ [0 ... NR_CPUS-1] = CPU_MASK_NONE };

cpumask_t cpu_core_sib_map[NR_CPUS] __read_mostly = {
	[0 ... NR_CPUS-1] = CPU_MASK_NONE };

EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);
EXPORT_SYMBOL(cpu_core_map);
EXPORT_SYMBOL(cpu_core_sib_map);

static cpumask_t smp_commenced_mask;

void smp_info(struct seq_file *m)
{
	int i;

	seq_printf(m, "State:\n");
	for_each_online_cpu(i)
		seq_printf(m, "CPU%d:\t\tonline\n", i);
}

void smp_bogo(struct seq_file *m)
{
	int i;

	for_each_online_cpu(i)
		seq_printf(m,
			   "Cpu%dClkTck\t: %016lx\n",
			   i, cpu_data(i).clock_tick);
}

extern void setup_sparc64_timer(void);

static volatile unsigned long callin_flag = 0;

void smp_callin(void)
{
	int cpuid = hard_smp_processor_id();

	__local_per_cpu_offset = __per_cpu_offset(cpuid);

	if (tlb_type == hypervisor)
		sun4v_ktsb_register();

	__flush_tlb_all();

	setup_sparc64_timer();

	if (cheetah_pcache_forced_on)
		cheetah_enable_pcache();

	callin_flag = 1;
	__asm__ __volatile__("membar #Sync\n\t"
			     "flush  %%g6" : : : "memory");

	/* Clear this or we will die instantly when we
	 * schedule back to this idler...
	 */
	current_thread_info()->new_child = 0;

	/* Attach to the address space of init_task. */
	atomic_inc(&init_mm.mm_count);
	current->active_mm = &init_mm;

	/* inform the notifiers about the new cpu */
	notify_cpu_starting(cpuid);

	while (!cpumask_test_cpu(cpuid, &smp_commenced_mask))
		rmb();

	set_cpu_online(cpuid, true);

	/* idle thread is expected to have preempt disabled */
	preempt_disable();

	local_irq_enable();

	cpu_startup_entry(CPUHP_ONLINE);
}

void cpu_panic(void)
{
	printk("CPU[%d]: Returns from cpu_idle!\n", smp_processor_id());
	panic("SMP bolixed\n");
}

/* This tick register synchronization scheme is taken entirely from
 * the ia64 port, see arch/ia64/kernel/smpboot.c for details and credit.
 *
 * The only change I've made is to rework it so that the master
 * initiates the synchonization instead of the slave. -DaveM
 */

#define MASTER	0
#define SLAVE	(SMP_CACHE_BYTES/sizeof(unsigned long))

#define NUM_ROUNDS	64	/* magic value */
#define NUM_ITERS	5	/* likewise */

static DEFINE_RAW_SPINLOCK(itc_sync_lock);
static unsigned long go[SLAVE + 1];

#define DEBUG_TICK_SYNC	0

static inline long get_delta (long *rt, long *master)
{
	unsigned long best_t0 = 0, best_t1 = ~0UL, best_tm = 0;
	unsigned long tcenter, t0, t1, tm;
	unsigned long i;

	for (i = 0; i < NUM_ITERS; i++) {
		t0 = tick_ops->get_tick();
		go[MASTER] = 1;
		membar_safe("#StoreLoad");
		while (!(tm = go[SLAVE]))
			rmb();
		go[SLAVE] = 0;
		wmb();
		t1 = tick_ops->get_tick();

		if (t1 - t0 < best_t1 - best_t0)
			best_t0 = t0, best_t1 = t1, best_tm = tm;
	}

	*rt = best_t1 - best_t0;
	*master = best_tm - best_t0;

	/* average best_t0 and best_t1 without overflow: */
	tcenter = (best_t0/2 + best_t1/2);
	if (best_t0 % 2 + best_t1 % 2 == 2)
		tcenter++;
	return tcenter - best_tm;
}

void smp_synchronize_tick_client(void)
{
	long i, delta, adj, adjust_latency = 0, done = 0;
	unsigned long flags, rt, master_time_stamp;
#if DEBUG_TICK_SYNC
	struct {
		long rt;	/* roundtrip time */
		long master;	/* master's timestamp */
		long diff;	/* difference between midpoint and master's timestamp */
		long lat;	/* estimate of itc adjustment latency */
	} t[NUM_ROUNDS];
#endif

	go[MASTER] = 1;

	while (go[MASTER])
		rmb();

	local_irq_save(flags);
	{
		for (i = 0; i < NUM_ROUNDS; i++) {
			delta = get_delta(&rt, &master_time_stamp);
			if (delta == 0)
				done = 1;	/* let's lock on to this... */

			if (!done) {
				if (i > 0) {
					adjust_latency += -delta;
					adj = -delta + adjust_latency/4;
				} else
					adj = -delta;

				tick_ops->add_tick(adj);
			}
#if DEBUG_TICK_SYNC
			t[i].rt = rt;
			t[i].master = master_time_stamp;
			t[i].diff = delta;
			t[i].lat = adjust_latency/4;
#endif
		}
	}
	local_irq_restore(flags);

#if DEBUG_TICK_SYNC
	for (i = 0; i < NUM_ROUNDS; i++)
		printk("rt=%5ld master=%5ld diff=%5ld adjlat=%5ld\n",
		       t[i].rt, t[i].master, t[i].diff, t[i].lat);
#endif

	printk(KERN_INFO "CPU %d: synchronized TICK with master CPU "
	       "(last diff %ld cycles, maxerr %lu cycles)\n",
	       smp_processor_id(), delta, rt);
}

static void smp_start_sync_tick_client(int cpu);

static void smp_synchronize_one_tick(int cpu)
{
	unsigned long flags, i;

	go[MASTER] = 0;

	smp_start_sync_tick_client(cpu);

	/* wait for client to be ready */
	while (!go[MASTER])
		rmb();

	/* now let the client proceed into his loop */
	go[MASTER] = 0;
	membar_safe("#StoreLoad");

	raw_spin_lock_irqsave(&itc_sync_lock, flags);
	{
		for (i = 0; i < NUM_ROUNDS*NUM_ITERS; i++) {
			while (!go[MASTER])
				rmb();
			go[MASTER] = 0;
			wmb();
			go[SLAVE] = tick_ops->get_tick();
			membar_safe("#StoreLoad");
		}
	}
	raw_spin_unlock_irqrestore(&itc_sync_lock, flags);
}

#if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU)
static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg,
				void **descrp)
{
	extern unsigned long sparc64_ttable_tl0;
	extern unsigned long kern_locked_tte_data;
	struct hvtramp_descr *hdesc;
	unsigned long trampoline_ra;
	struct trap_per_cpu *tb;
	u64 tte_vaddr, tte_data;
	unsigned long hv_err;
	int i;

	hdesc = kzalloc(sizeof(*hdesc) +
			(sizeof(struct hvtramp_mapping) *
			 num_kernel_image_mappings - 1),
			GFP_KERNEL);
	if (!hdesc) {
		printk(KERN_ERR "ldom_startcpu_cpuid: Cannot allocate "
		       "hvtramp_descr.\n");
		return;
	}
	*descrp = hdesc;

	hdesc->cpu = cpu;
	hdesc->num_mappings = num_kernel_image_mappings;

	tb = &trap_block[cpu];

	hdesc->fault_info_va = (unsigned long) &tb->fault_info;
	hdesc->fault_info_pa = kimage_addr_to_ra(&tb->fault_info);

	hdesc->thread_reg = thread_reg;

	tte_vaddr = (unsigned long) KERNBASE;
	tte_data = kern_locked_tte_data;

	for (i = 0; i < hdesc->num_mappings; i++) {
		hdesc->maps[i].vaddr = tte_vaddr;
		hdesc->maps[i].tte   = tte_data;
		tte_vaddr += 0x400000;
		tte_data  += 0x400000;
	}

	trampoline_ra = kimage_addr_to_ra(hv_cpu_startup);

	hv_err = sun4v_cpu_start(cpu, trampoline_ra,
				 kimage_addr_to_ra(&sparc64_ttable_tl0),
				 __pa(hdesc));
	if (hv_err)
		printk(KERN_ERR "ldom_startcpu_cpuid: sun4v_cpu_start() "
		       "gives error %lu\n", hv_err);
}
#endif

extern unsigned long sparc64_cpu_startup;

/* The OBP cpu startup callback truncates the 3rd arg cookie to
 * 32-bits (I think) so to be safe we have it read the pointer
 * contained here so we work on >4GB machines. -DaveM
 */
static struct thread_info *cpu_new_thread = NULL;

static int smp_boot_one_cpu(unsigned int cpu, struct task_struct *idle)
{
	unsigned long entry =
		(unsigned long)(&sparc64_cpu_startup);
	unsigned long cookie =
		(unsigned long)(&cpu_new_thread);
	void *descr = NULL;
	int timeout, ret;

	callin_flag = 0;
	cpu_new_thread = task_thread_info(idle);

	if (tlb_type == hypervisor) {
#if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU)
		if (ldom_domaining_enabled)
			ldom_startcpu_cpuid(cpu,
					    (unsigned long) cpu_new_thread,
					    &descr);
		else
#endif
			prom_startcpu_cpuid(cpu, entry, cookie);
	} else {
		struct device_node *dp = of_find_node_by_cpuid(cpu);

		prom_startcpu(dp->phandle, entry, cookie);
	}

	for (timeout = 0; timeout < 50000; timeout++) {
		if (callin_flag)
			break;
		udelay(100);
	}

	if (callin_flag) {
		ret = 0;
	} else {
		printk("Processor %d is stuck.\n", cpu);
		ret = -ENODEV;
	}
	cpu_new_thread = NULL;

	kfree(descr);

	return ret;
}

static void spitfire_xcall_helper(u64 data0, u64 data1, u64 data2, u64 pstate, unsigned long cpu)
{
	u64 result, target;
	int stuck, tmp;

	if (this_is_starfire) {
		/* map to real upaid */
		cpu = (((cpu & 0x3c) << 1) |
			((cpu & 0x40) >> 4) |
			(cpu & 0x3));
	}

	target = (cpu << 14) | 0x70;
again:
	/* Ok, this is the real Spitfire Errata #54.
	 * One must read back from a UDB internal register
	 * after writes to the UDB interrupt dispatch, but
	 * before the membar Sync for that write.
	 * So we use the high UDB control register (ASI 0x7f,
	 * ADDR 0x20) for the dummy read. -DaveM
	 */
	tmp = 0x40;
	__asm__ __volatile__(
	"wrpr	%1, %2, %%pstate\n\t"
	"stxa	%4, [%0] %3\n\t"
	"stxa	%5, [%0+%8] %3\n\t"
	"add	%0, %8, %0\n\t"
	"stxa	%6, [%0+%8] %3\n\t"
	"membar	#Sync\n\t"
	"stxa	%%g0, [%7] %3\n\t"
	"membar	#Sync\n\t"
	"mov	0x20, %%g1\n\t"
	"ldxa	[%%g1] 0x7f, %%g0\n\t"
	"membar	#Sync"
	: "=r" (tmp)
	: "r" (pstate), "i" (PSTATE_IE), "i" (ASI_INTR_W),
	  "r" (data0), "r" (data1), "r" (data2), "r" (target),
	  "r" (0x10), "0" (tmp)
        : "g1");

	/* NOTE: PSTATE_IE is still clear. */
	stuck = 100000;
	do {
		__asm__ __volatile__("ldxa [%%g0] %1, %0"
			: "=r" (result)
			: "i" (ASI_INTR_DISPATCH_STAT));
		if (result == 0) {
			__asm__ __volatile__("wrpr %0, 0x0, %%pstate"
					     : : "r" (pstate));
			return;
		}
		stuck -= 1;
		if (stuck == 0)
			break;
	} while (result & 0x1);
	__asm__ __volatile__("wrpr %0, 0x0, %%pstate"
			     : : "r" (pstate));
	if (stuck == 0) {
		printk("CPU[%d]: mondo stuckage result[%016llx]\n",
		       smp_processor_id(), result);
	} else {
		udelay(2);
		goto again;
	}
}

static void spitfire_xcall_deliver(struct trap_per_cpu *tb, int cnt)
{
	u64 *mondo, data0, data1, data2;
	u16 *cpu_list;
	u64 pstate;
	int i;

	__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
	cpu_list = __va(tb->cpu_list_pa);
	mondo = __va(tb->cpu_mondo_block_pa);
	data0 = mondo[0];
	data1 = mondo[1];
	data2 = mondo[2];
	for (i = 0; i < cnt; i++)
		spitfire_xcall_helper(data0, data1, data2, pstate, cpu_list[i]);
}

/* Cheetah now allows to send the whole 64-bytes of data in the interrupt
 * packet, but we have no use for that.  However we do take advantage of
 * the new pipelining feature (ie. dispatch to multiple cpus simultaneously).
 */
static void cheetah_xcall_deliver(struct trap_per_cpu *tb, int cnt)
{
	int nack_busy_id, is_jbus, need_more;
	u64 *mondo, pstate, ver, busy_mask;
	u16 *cpu_list;

	cpu_list = __va(tb->cpu_list_pa);
	mondo = __va(tb->cpu_mondo_block_pa);

	/* Unfortunately, someone at Sun had the brilliant idea to make the
	 * busy/nack fields hard-coded by ITID number for this Ultra-III
	 * derivative processor.
	 */
	__asm__ ("rdpr %%ver, %0" : "=r" (ver));
	is_jbus = ((ver >> 32) == __JALAPENO_ID ||
		   (ver >> 32) == __SERRANO_ID);

	__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));

retry:
	need_more = 0;
	__asm__ __volatile__("wrpr %0, %1, %%pstate\n\t"
			     : : "r" (pstate), "i" (PSTATE_IE));

	/* Setup the dispatch data registers. */
	__asm__ __volatile__("stxa	%0, [%3] %6\n\t"
			     "stxa	%1, [%4] %6\n\t"
			     "stxa	%2, [%5] %6\n\t"
			     "membar	#Sync\n\t"
			     : /* no outputs */
			     : "r" (mondo[0]), "r" (mondo[1]), "r" (mondo[2]),
			       "r" (0x40), "r" (0x50), "r" (0x60),
			       "i" (ASI_INTR_W));

	nack_busy_id = 0;
	busy_mask = 0;
	{
		int i;

		for (i = 0; i < cnt; i++) {
			u64 target, nr;

			nr = cpu_list[i];
			if (nr == 0xffff)
				continue;

			target = (nr << 14) | 0x70;
			if (is_jbus) {
				busy_mask |= (0x1UL << (nr * 2));
			} else {
				target |= (nack_busy_id << 24);
				busy_mask |= (0x1UL <<
					      (nack_busy_id * 2));
			}
			__asm__ __volatile__(
				"stxa	%%g0, [%0] %1\n\t"
				"membar	#Sync\n\t"
				: /* no outputs */
				: "r" (target), "i" (ASI_INTR_W));
			nack_busy_id++;
			if (nack_busy_id == 32) {
				need_more = 1;
				break;
			}
		}
	}

	/* Now, poll for completion. */
	{
		u64 dispatch_stat, nack_mask;
		long stuck;

		stuck = 100000 * nack_busy_id;
		nack_mask = busy_mask << 1;
		do {
			__asm__ __volatile__("ldxa	[%%g0] %1, %0"
					     : "=r" (dispatch_stat)
					     : "i" (ASI_INTR_DISPATCH_STAT));
			if (!(dispatch_stat & (busy_mask | nack_mask))) {
				__asm__ __volatile__("wrpr %0, 0x0, %%pstate"
						     : : "r" (pstate));
				if (unlikely(need_more)) {
					int i, this_cnt = 0;
					for (i = 0; i < cnt; i++) {
						if (cpu_list[i] == 0xffff)
							continue;
						cpu_list[i] = 0xffff;
						this_cnt++;
						if (this_cnt == 32)
							break;
					}
					goto retry;
				}
				return;
			}
			if (!--stuck)
				break;
		} while (dispatch_stat & busy_mask);

		__asm__ __volatile__("wrpr %0, 0x0, %%pstate"
				     : : "r" (pstate));

		if (dispatch_stat & busy_mask) {
			/* Busy bits will not clear, continue instead
			 * of freezing up on this cpu.
			 */
			printk("CPU[%d]: mondo stuckage result[%016llx]\n",
			       smp_processor_id(), dispatch_stat);
		} else {
			int i, this_busy_nack = 0;

			/* Delay some random time with interrupts enabled
			 * to prevent deadlock.
			 */
			udelay(2 * nack_busy_id);

			/* Clear out the mask bits for cpus which did not
			 * NACK us.
			 */
			for (i = 0; i < cnt; i++) {
				u64 check_mask, nr;

				nr = cpu_list[i];
				if (nr == 0xffff)
					continue;

				if (is_jbus)
					check_mask = (0x2UL << (2*nr));
				else
					check_mask = (0x2UL <<
						      this_busy_nack);
				if ((dispatch_stat & check_mask) == 0)
					cpu_list[i] = 0xffff;
				this_busy_nack += 2;
				if (this_busy_nack == 64)
					break;
			}

			goto retry;
		}
	}
}

/* Multi-cpu list version.  */
static void hypervisor_xcall_deliver(struct trap_per_cpu *tb, int cnt)
{
	int retries, this_cpu, prev_sent, i, saw_cpu_error;
	unsigned long status;
	u16 *cpu_list;

	this_cpu = smp_processor_id();

	cpu_list = __va(tb->cpu_list_pa);

	saw_cpu_error = 0;
	retries = 0;
	prev_sent = 0;
	do {
		int forward_progress, n_sent;

		status = sun4v_cpu_mondo_send(cnt,
					      tb->cpu_list_pa,
					      tb->cpu_mondo_block_pa);

		/* HV_EOK means all cpus received the xcall, we're done.  */
		if (likely(status == HV_EOK))
			break;

		/* First, see if we made any forward progress.
		 *
		 * The hypervisor indicates successful sends by setting
		 * cpu list entries to the value 0xffff.
		 */
		n_sent = 0;
		for (i = 0; i < cnt; i++) {
			if (likely(cpu_list[i] == 0xffff))
				n_sent++;
		}

		forward_progress = 0;
		if (n_sent > prev_sent)
			forward_progress = 1;

		prev_sent = n_sent;

		/* If we get a HV_ECPUERROR, then one or more of the cpus
		 * in the list are in error state.  Use the cpu_state()
		 * hypervisor call to find out which cpus are in error state.
		 */
		if (unlikely(status == HV_ECPUERROR)) {
			for (i = 0; i < cnt; i++) {
				long err;
				u16 cpu;

				cpu = cpu_list[i];
				if (cpu == 0xffff)
					continue;

				err = sun4v_cpu_state(cpu);
				if (err == HV_CPU_STATE_ERROR) {
					saw_cpu_error = (cpu + 1);
					cpu_list[i] = 0xffff;
				}
			}
		} else if (unlikely(status != HV_EWOULDBLOCK))
			goto fatal_mondo_error;

		/* Don't bother rewriting the CPU list, just leave the
		 * 0xffff and non-0xffff entries in there and the
		 * hypervisor will do the right thing.
		 *
		 * Only advance timeout state if we didn't make any
		 * forward progress.
		 */
		if (unlikely(!forward_progress)) {
			if (unlikely(++retries > 10000))
				goto fatal_mondo_timeout;

			/* Delay a little bit to let other cpus catch up
			 * on their cpu mondo queue work.
			 */
			udelay(2 * cnt);
		}
	} while (1);

	if (unlikely(saw_cpu_error))
		goto fatal_mondo_cpu_error;

	return;

fatal_mondo_cpu_error:
	printk(KERN_CRIT "CPU[%d]: SUN4V mondo cpu error, some target cpus "
	       "(including %d) were in error state\n",
	       this_cpu, saw_cpu_error - 1);
	return;

fatal_mondo_timeout:
	printk(KERN_CRIT "CPU[%d]: SUN4V mondo timeout, no forward "
	       " progress after %d retries.\n",
	       this_cpu, retries);
	goto dump_cpu_list_and_out;

fatal_mondo_error:
	printk(KERN_CRIT "CPU[%d]: Unexpected SUN4V mondo error %lu\n",
	       this_cpu, status);
	printk(KERN_CRIT "CPU[%d]: Args were cnt(%d) cpulist_pa(%lx) "
	       "mondo_block_pa(%lx)\n",
	       this_cpu, cnt, tb->cpu_list_pa, tb->cpu_mondo_block_pa);

dump_cpu_list_and_out:
	printk(KERN_CRIT "CPU[%d]: CPU list [ ", this_cpu);
	for (i = 0; i < cnt; i++)
		printk("%u ", cpu_list[i]);
	printk("]\n");
}

static void (*xcall_deliver_impl)(struct trap_per_cpu *, int);

static void xcall_deliver(u64 data0, u64 data1, u64 data2, const cpumask_t *mask)
{
	struct trap_per_cpu *tb;
	int this_cpu, i, cnt;
	unsigned long flags;
	u16 *cpu_list;
	u64 *mondo;

	/* We have to do this whole thing with interrupts fully disabled.
	 * Otherwise if we send an xcall from interrupt context it will
	 * corrupt both our mondo block and cpu list state.
	 *
	 * One consequence of this is that we cannot use timeout mechanisms
	 * that depend upon interrupts being delivered locally.  So, for
	 * example, we cannot sample jiffies and expect it to advance.
	 *
	 * Fortunately, udelay() uses %stick/%tick so we can use that.
	 */
	local_irq_save(flags);

	this_cpu = smp_processor_id();
	tb = &trap_block[this_cpu];

	mondo = __va(tb->cpu_mondo_block_pa);
	mondo[0] = data0;
	mondo[1] = data1;
	mondo[2] = data2;
	wmb();

	cpu_list = __va(tb->cpu_list_pa);

	/* Setup the initial cpu list.  */
	cnt = 0;
	for_each_cpu(i, mask) {
		if (i == this_cpu || !cpu_online(i))
			continue;
		cpu_list[cnt++] = i;
	}

	if (cnt)
		xcall_deliver_impl(tb, cnt);

	local_irq_restore(flags);
}

/* Send cross call to all processors mentioned in MASK_P
 * except self.  Really, there are only two cases currently,
 * "cpu_online_mask" and "mm_cpumask(mm)".
 */
static void smp_cross_call_masked(unsigned long *func, u32 ctx, u64 data1, u64 data2, const cpumask_t *mask)
{
	u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff));

	xcall_deliver(data0, data1, data2, mask);
}

/* Send cross call to all processors except self. */
static void smp_cross_call(unsigned long *func, u32 ctx, u64 data1, u64 data2)
{
	smp_cross_call_masked(func, ctx, data1, data2, cpu_online_mask);
}

extern unsigned long xcall_sync_tick;

static void smp_start_sync_tick_client(int cpu)
{
	xcall_deliver((u64) &xcall_sync_tick, 0, 0,
		      cpumask_of(cpu));
}

extern unsigned long xcall_call_function;

void arch_send_call_function_ipi_mask(const struct cpumask *mask)
{
	xcall_deliver((u64) &xcall_call_function, 0, 0, mask);
}

extern unsigned long xcall_call_function_single;

void arch_send_call_function_single_ipi(int cpu)
{
	xcall_deliver((u64) &xcall_call_function_single, 0, 0,
		      cpumask_of(cpu));
}

void __irq_entry smp_call_function_client(int irq, struct pt_regs *regs)
{
	clear_softint(1 << irq);
	irq_enter();
	generic_smp_call_function_interrupt();
	irq_exit();
}

void __irq_entry smp_call_function_single_client(int irq, struct pt_regs *regs)
{
	clear_softint(1 << irq);
	irq_enter();
	generic_smp_call_function_single_interrupt();
	irq_exit();
}

static void tsb_sync(void *info)
{
	struct trap_per_cpu *tp = &trap_block[raw_smp_processor_id()];
	struct mm_struct *mm = info;

	/* It is not valid to test "current->active_mm == mm" here.
	 *
	 * The value of "current" is not changed atomically with
	 * switch_mm().  But that's OK, we just need to check the
	 * current cpu's trap block PGD physical address.
	 */
	if (tp->pgd_paddr == __pa(mm->pgd))
		tsb_context_switch(mm);
}

void smp_tsb_sync(struct mm_struct *mm)
{
	smp_call_function_many(mm_cpumask(mm), tsb_sync, mm, 1);
}

extern unsigned long xcall_flush_tlb_mm;
extern unsigned long xcall_flush_tlb_page;
extern unsigned long xcall_flush_tlb_kernel_range;
extern unsigned long xcall_fetch_glob_regs;
extern unsigned long xcall_fetch_glob_pmu;
extern unsigned long xcall_fetch_glob_pmu_n4;
extern unsigned long xcall_receive_signal;
extern unsigned long xcall_new_mmu_context_version;
#ifdef CONFIG_KGDB
extern unsigned long xcall_kgdb_capture;
#endif

#ifdef DCACHE_ALIASING_POSSIBLE
extern unsigned long xcall_flush_dcache_page_cheetah;
#endif
extern unsigned long xcall_flush_dcache_page_spitfire;

static inline void __local_flush_dcache_page(struct page *page)
{
#ifdef DCACHE_ALIASING_POSSIBLE
	__flush_dcache_page(page_address(page),
			    ((tlb_type == spitfire) &&
			     page_mapping(page) != NULL));
#else
	if (page_mapping(page) != NULL &&
	    tlb_type == spitfire)
		__flush_icache_page(__pa(page_address(page)));
#endif
}

void smp_flush_dcache_page_impl(struct page *page, int cpu)
{
	int this_cpu;

	if (tlb_type == hypervisor)
		return;

#ifdef CONFIG_DEBUG_DCFLUSH
	atomic_inc(&dcpage_flushes);
#endif

	this_cpu = get_cpu();

	if (cpu == this_cpu) {
		__local_flush_dcache_page(page);
	} else if (cpu_online(cpu)) {
		void *pg_addr = page_address(page);
		u64 data0 = 0;

		if (tlb_type == spitfire) {
			data0 = ((u64)&xcall_flush_dcache_page_spitfire);
			if (page_mapping(page) != NULL)
				data0 |= ((u64)1 << 32);
		} else if (tlb_type == cheetah || tlb_type == cheetah_plus) {
#ifdef DCACHE_ALIASING_POSSIBLE
			data0 =	((u64)&xcall_flush_dcache_page_cheetah);
#endif
		}
		if (data0) {
			xcall_deliver(data0, __pa(pg_addr),
				      (u64) pg_addr, cpumask_of(cpu));
#ifdef CONFIG_DEBUG_DCFLUSH
			atomic_inc(&dcpage_flushes_xcall);
#endif
		}
	}

	put_cpu();
}

void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
{
	void *pg_addr;
	u64 data0;

	if (tlb_type == hypervisor)
		return;

	preempt_disable();

#ifdef CONFIG_DEBUG_DCFLUSH
	atomic_inc(&dcpage_flushes);
#endif
	data0 = 0;
	pg_addr = page_address(page);
	if (tlb_type == spitfire) {
		data0 = ((u64)&xcall_flush_dcache_page_spitfire);
		if (page_mapping(page) != NULL)
			data0 |= ((u64)1 << 32);
	} else if (tlb_type == cheetah || tlb_type == cheetah_plus) {
#ifdef DCACHE_ALIASING_POSSIBLE
		data0 = ((u64)&xcall_flush_dcache_page_cheetah);
#endif
	}
	if (data0) {
		xcall_deliver(data0, __pa(pg_addr),
			      (u64) pg_addr, cpu_online_mask);
#ifdef CONFIG_DEBUG_DCFLUSH
		atomic_inc(&dcpage_flushes_xcall);
#endif
	}
	__local_flush_dcache_page(page);

	preempt_enable();
}

void __irq_entry smp_new_mmu_context_version_client(int irq, struct pt_regs *regs)
{
	struct mm_struct *mm;
	unsigned long flags;

	clear_softint(1 << irq);

	/* See if we need to allocate a new TLB context because
	 * the version of the one we are using is now out of date.
	 */
	mm = current->active_mm;
	if (unlikely(!mm || (mm == &init_mm)))
		return;

	spin_lock_irqsave(&mm->context.lock, flags);

	if (unlikely(!CTX_VALID(mm->context)))
		get_new_mmu_context(mm);

	spin_unlock_irqrestore(&mm->context.lock, flags);

	load_secondary_context(mm);
	__flush_tlb_mm(CTX_HWBITS(mm->context),
		       SECONDARY_CONTEXT);
}

void smp_new_mmu_context_version(void)
{
	smp_cross_call(&xcall_new_mmu_context_version, 0, 0, 0);
}

#ifdef CONFIG_KGDB
void kgdb_roundup_cpus(unsigned long flags)
{
	smp_cross_call(&xcall_kgdb_capture, 0, 0, 0);
}
#endif

void smp_fetch_global_regs(void)
{
	smp_cross_call(&xcall_fetch_glob_regs, 0, 0, 0);
}

void smp_fetch_global_pmu(void)
{
	if (tlb_type == hypervisor &&
	    sun4v_chip_type >= SUN4V_CHIP_NIAGARA4)
		smp_cross_call(&xcall_fetch_glob_pmu_n4, 0, 0, 0);
	else
		smp_cross_call(&xcall_fetch_glob_pmu, 0, 0, 0);
}

/* We know that the window frames of the user have been flushed
 * to the stack before we get here because all callers of us
 * are flush_tlb_*() routines, and these run after flush_cache_*()
 * which performs the flushw.
 *
 * The SMP TLB coherency scheme we use works as follows:
 *
 * 1) mm->cpu_vm_mask is a bit mask of which cpus an address
 *    space has (potentially) executed on, this is the heuristic
 *    we use to avoid doing cross calls.
 *
 *    Also, for flushing from kswapd and also for clones, we
 *    use cpu_vm_mask as the list of cpus to make run the TLB.
 *
 * 2) TLB context numbers are shared globally across all processors
 *    in the system, this allows us to play several games to avoid
 *    cross calls.
 *
 *    One invariant is that when a cpu switches to a process, and
 *    that processes tsk->active_mm->cpu_vm_mask does not have the
 *    current cpu's bit set, that tlb context is flushed locally.
 *
 *    If the address space is non-shared (ie. mm->count == 1) we avoid
 *    cross calls when we want to flush the currently running process's
 *    tlb state.  This is done by clearing all cpu bits except the current
 *    processor's in current->mm->cpu_vm_mask and performing the
 *    flush locally only.  This will force any subsequent cpus which run
 *    this task to flush the context from the local tlb if the process
 *    migrates to another cpu (again).
 *
 * 3) For shared address spaces (threads) and swapping we bite the
 *    bullet for most cases and perform the cross call (but only to
 *    the cpus listed in cpu_vm_mask).
 *
 *    The performance gain from "optimizing" away the cross call for threads is
 *    questionable (in theory the big win for threads is the massive sharing of
 *    address space state across processors).
 */

/* This currently is only used by the hugetlb arch pre-fault
 * hook on UltraSPARC-III+ and later when changing the pagesize
 * bits of the context register for an address space.
 */
void smp_flush_tlb_mm(struct mm_struct *mm)
{
	u32 ctx = CTX_HWBITS(mm->context);
	int cpu = get_cpu();

	if (atomic_read(&mm->mm_users) == 1) {
		cpumask_copy(mm_cpumask(mm), cpumask_of(cpu));
		goto local_flush_and_out;
	}

	smp_cross_call_masked(&xcall_flush_tlb_mm,
			      ctx, 0, 0,
			      mm_cpumask(mm));

local_flush_and_out:
	__flush_tlb_mm(ctx, SECONDARY_CONTEXT);

	put_cpu();
}

struct tlb_pending_info {
	unsigned long ctx;
	unsigned long nr;
	unsigned long *vaddrs;
};

static void tlb_pending_func(void *info)
{
	struct tlb_pending_info *t = info;

	__flush_tlb_pending(t->ctx, t->nr, t->vaddrs);
}

void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long *vaddrs)
{
	u32 ctx = CTX_HWBITS(mm->context);
	struct tlb_pending_info info;
	int cpu = get_cpu();

	info.ctx = ctx;
	info.nr = nr;
	info.vaddrs = vaddrs;

	if (mm == current->mm && atomic_read(&mm->mm_users) == 1)
		cpumask_copy(mm_cpumask(mm), cpumask_of(cpu));
	else
		smp_call_function_many(mm_cpumask(mm), tlb_pending_func,
				       &info, 1);

	__flush_tlb_pending(ctx, nr, vaddrs);

	put_cpu();
}

void smp_flush_tlb_page(struct mm_struct *mm, unsigned long vaddr)
{
	unsigned long context = CTX_HWBITS(mm->context);
	int cpu = get_cpu();

	if (mm == current->mm && atomic_read(&mm->mm_users) == 1)
		cpumask_copy(mm_cpumask(mm), cpumask_of(cpu));
	else
		smp_cross_call_masked(&xcall_flush_tlb_page,
				      context, vaddr, 0,
				      mm_cpumask(mm));
	__flush_tlb_page(context, vaddr);

	put_cpu();
}

void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end)
{
	start &= PAGE_MASK;
	end    = PAGE_ALIGN(end);
	if (start != end) {
		smp_cross_call(&xcall_flush_tlb_kernel_range,
			       0, start, end);

		__flush_tlb_kernel_range(start, end);
	}
}

/* CPU capture. */
/* #define CAPTURE_DEBUG */
extern unsigned long xcall_capture;

static atomic_t smp_capture_depth = ATOMIC_INIT(0);
static atomic_t smp_capture_registry = ATOMIC_INIT(0);
static unsigned long penguins_are_doing_time;

void smp_capture(void)
{
	int result = atomic_add_return(1, &smp_capture_depth);

	if (result == 1) {
		int ncpus = num_online_cpus();

#ifdef CAPTURE_DEBUG
		printk("CPU[%d]: Sending penguins to jail...",
		       smp_processor_id());
#endif
		penguins_are_doing_time = 1;
		atomic_inc(&smp_capture_registry);
		smp_cross_call(&xcall_capture, 0, 0, 0);
		while (atomic_read(&smp_capture_registry) != ncpus)
			rmb();
#ifdef CAPTURE_DEBUG
		printk("done\n");
#endif
	}
}

void smp_release(void)
{
	if (atomic_dec_and_test(&smp_capture_depth)) {
#ifdef CAPTURE_DEBUG
		printk("CPU[%d]: Giving pardon to "
		       "imprisoned penguins\n",
		       smp_processor_id());
#endif
		penguins_are_doing_time = 0;
		membar_safe("#StoreLoad");
		atomic_dec(&smp_capture_registry);
	}
}

/* Imprisoned penguins run with %pil == PIL_NORMAL_MAX, but PSTATE_IE
 * set, so they can service tlb flush xcalls...
 */
extern void prom_world(int);

void __irq_entry smp_penguin_jailcell(int irq, struct pt_regs *regs)
{
	clear_softint(1 << irq);

	preempt_disable();

	__asm__ __volatile__("flushw");
	prom_world(1);
	atomic_inc(&smp_capture_registry);
	membar_safe("#StoreLoad");
	while (penguins_are_doing_time)
		rmb();
	atomic_dec(&smp_capture_registry);
	prom_world(0);

	preempt_enable();
}

/* /proc/profile writes can call this, don't __init it please. */
int setup_profiling_timer(unsigned int multiplier)
{
	return -EINVAL;
}

void __init smp_prepare_cpus(unsigned int max_cpus)
{
}

void smp_prepare_boot_cpu(void)
{
}

void __init smp_setup_processor_id(void)
{
	if (tlb_type == spitfire)
		xcall_deliver_impl = spitfire_xcall_deliver;
	else if (tlb_type == cheetah || tlb_type == cheetah_plus)
		xcall_deliver_impl = cheetah_xcall_deliver;
	else
		xcall_deliver_impl = hypervisor_xcall_deliver;
}

void smp_fill_in_sib_core_maps(void)
{
	unsigned int i;

	for_each_present_cpu(i) {
		unsigned int j;

		cpumask_clear(&cpu_core_map[i]);
		if (cpu_data(i).core_id == 0) {
			cpumask_set_cpu(i, &cpu_core_map[i]);
			continue;
		}

		for_each_present_cpu(j) {
			if (cpu_data(i).core_id ==
			    cpu_data(j).core_id)
				cpumask_set_cpu(j, &cpu_core_map[i]);
		}
	}

	for_each_present_cpu(i)  {
		unsigned int j;

		for_each_present_cpu(j)  {
			if (cpu_data(i).sock_id == cpu_data(j).sock_id)
				cpumask_set_cpu(j, &cpu_core_sib_map[i]);
		}
	}

	for_each_present_cpu(i) {
		unsigned int j;

		cpumask_clear(&per_cpu(cpu_sibling_map, i));
		if (cpu_data(i).proc_id == -1) {
			cpumask_set_cpu(i, &per_cpu(cpu_sibling_map, i));
			continue;
		}

		for_each_present_cpu(j) {
			if (cpu_data(i).proc_id ==
			    cpu_data(j).proc_id)
				cpumask_set_cpu(j, &per_cpu(cpu_sibling_map, i));
		}
	}
}

int __cpu_up(unsigned int cpu, struct task_struct *tidle)
{
	int ret = smp_boot_one_cpu(cpu, tidle);

	if (!ret) {
		cpumask_set_cpu(cpu, &smp_commenced_mask);
		while (!cpu_online(cpu))
			mb();
		if (!cpu_online(cpu)) {
			ret = -ENODEV;
		} else {
			/* On SUN4V, writes to %tick and %stick are
			 * not allowed.
			 */
			if (tlb_type != hypervisor)
				smp_synchronize_one_tick(cpu);
		}
	}
	return ret;
}

#ifdef CONFIG_HOTPLUG_CPU
void cpu_play_dead(void)
{
	int cpu = smp_processor_id();
	unsigned long pstate;

	idle_task_exit();

	if (tlb_type == hypervisor) {
		struct trap_per_cpu *tb = &trap_block[cpu];

		sun4v_cpu_qconf(HV_CPU_QUEUE_CPU_MONDO,
				tb->cpu_mondo_pa, 0);
		sun4v_cpu_qconf(HV_CPU_QUEUE_DEVICE_MONDO,
				tb->dev_mondo_pa, 0);
		sun4v_cpu_qconf(HV_CPU_QUEUE_RES_ERROR,
				tb->resum_mondo_pa, 0);
		sun4v_cpu_qconf(HV_CPU_QUEUE_NONRES_ERROR,
				tb->nonresum_mondo_pa, 0);
	}

	cpumask_clear_cpu(cpu, &smp_commenced_mask);
	membar_safe("#Sync");

	local_irq_disable();

	__asm__ __volatile__(
		"rdpr	%%pstate, %0\n\t"
		"wrpr	%0, %1, %%pstate"
		: "=r" (pstate)
		: "i" (PSTATE_IE));

	while (1)
		barrier();
}

int __cpu_disable(void)
{
	int cpu = smp_processor_id();
	cpuinfo_sparc *c;
	int i;

	for_each_cpu(i, &cpu_core_map[cpu])
		cpumask_clear_cpu(cpu, &cpu_core_map[i]);
	cpumask_clear(&cpu_core_map[cpu]);

	for_each_cpu(i, &per_cpu(cpu_sibling_map, cpu))
		cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map, i));
	cpumask_clear(&per_cpu(cpu_sibling_map, cpu));

	c = &cpu_data(cpu);

	c->core_id = 0;
	c->proc_id = -1;

	smp_wmb();

	/* Make sure no interrupts point to this cpu.  */
	fixup_irqs();

	local_irq_enable();
	mdelay(1);
	local_irq_disable();

	set_cpu_online(cpu, false);

	cpu_map_rebuild();

	return 0;
}

void __cpu_die(unsigned int cpu)
{
	int i;

	for (i = 0; i < 100; i++) {
		smp_rmb();
		if (!cpumask_test_cpu(cpu, &smp_commenced_mask))
			break;
		msleep(100);
	}
	if (cpumask_test_cpu(cpu, &smp_commenced_mask)) {
		printk(KERN_ERR "CPU %u didn't die...\n", cpu);
	} else {
#if defined(CONFIG_SUN_LDOMS)
		unsigned long hv_err;
		int limit = 100;

		do {
			hv_err = sun4v_cpu_stop(cpu);
			if (hv_err == HV_EOK) {
				set_cpu_present(cpu, false);
				break;
			}
		} while (--limit > 0);
		if (limit <= 0) {
			printk(KERN_ERR "sun4v_cpu_stop() fails err=%lu\n",
			       hv_err);
		}
#endif
	}
}
#endif

void __init smp_cpus_done(unsigned int max_cpus)
{
}

void smp_send_reschedule(int cpu)
{
	if (cpu == smp_processor_id()) {
		WARN_ON_ONCE(preemptible());
		set_softint(1 << PIL_SMP_RECEIVE_SIGNAL);
	} else {
		xcall_deliver((u64) &xcall_receive_signal,
			      0, 0, cpumask_of(cpu));
	}
}

void __irq_entry smp_receive_signal_client(int irq, struct pt_regs *regs)
{
	clear_softint(1 << irq);
	scheduler_ipi();
}

static void stop_this_cpu(void *dummy)
{
	prom_stopself();
}

void smp_send_stop(void)
{
	int cpu;

	if (tlb_type == hypervisor) {
		for_each_online_cpu(cpu) {
			if (cpu == smp_processor_id())
				continue;
#ifdef CONFIG_SUN_LDOMS
			if (ldom_domaining_enabled) {
				unsigned long hv_err;
				hv_err = sun4v_cpu_stop(cpu);
				if (hv_err)
					printk(KERN_ERR "sun4v_cpu_stop() "
					       "failed err=%lu\n", hv_err);
			} else
#endif
				prom_stopcpu_cpuid(cpu);
		}
	} else
		smp_call_function(stop_this_cpu, NULL, 0);
}

/**
 * pcpu_alloc_bootmem - NUMA friendly alloc_bootmem wrapper for percpu
 * @cpu: cpu to allocate for
 * @size: size allocation in bytes
 * @align: alignment
 *
 * Allocate @size bytes aligned at @align for cpu @cpu.  This wrapper
 * does the right thing for NUMA regardless of the current
 * configuration.
 *
 * RETURNS:
 * Pointer to the allocated area on success, NULL on failure.
 */
static void * __init pcpu_alloc_bootmem(unsigned int cpu, size_t size,
					size_t align)
{
	const unsigned long goal = __pa(MAX_DMA_ADDRESS);
#ifdef CONFIG_NEED_MULTIPLE_NODES
	int node = cpu_to_node(cpu);
	void *ptr;

	if (!node_online(node) || !NODE_DATA(node)) {
		ptr = __alloc_bootmem(size, align, goal);
		pr_info("cpu %d has no node %d or node-local memory\n",
			cpu, node);
		pr_debug("per cpu data for cpu%d %lu bytes at %016lx\n",
			 cpu, size, __pa(ptr));
	} else {
		ptr = __alloc_bootmem_node(NODE_DATA(node),
					   size, align, goal);
		pr_debug("per cpu data for cpu%d %lu bytes on node%d at "
			 "%016lx\n", cpu, size, node, __pa(ptr));
	}
	return ptr;
#else
	return __alloc_bootmem(size, align, goal);
#endif
}

static void __init pcpu_free_bootmem(void *ptr, size_t size)
{
	free_bootmem(__pa(ptr), size);
}

static int __init pcpu_cpu_distance(unsigned int from, unsigned int to)
{
	if (cpu_to_node(from) == cpu_to_node(to))
		return LOCAL_DISTANCE;
	else
		return REMOTE_DISTANCE;
}

static void __init pcpu_populate_pte(unsigned long addr)
{
	pgd_t *pgd = pgd_offset_k(addr);
	pud_t *pud;
	pmd_t *pmd;

	if (pgd_none(*pgd)) {
		pud_t *new;

		new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
		pgd_populate(&init_mm, pgd, new);
	}

	pud = pud_offset(pgd, addr);
	if (pud_none(*pud)) {
		pmd_t *new;

		new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
		pud_populate(&init_mm, pud, new);
	}

	pmd = pmd_offset(pud, addr);
	if (!pmd_present(*pmd)) {
		pte_t *new;

		new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE);
		pmd_populate_kernel(&init_mm, pmd, new);
	}
}

void __init setup_per_cpu_areas(void)
{
	unsigned long delta;
	unsigned int cpu;
	int rc = -EINVAL;

	if (pcpu_chosen_fc != PCPU_FC_PAGE) {
		rc = pcpu_embed_first_chunk(PERCPU_MODULE_RESERVE,
					    PERCPU_DYNAMIC_RESERVE, 4 << 20,
					    pcpu_cpu_distance,
					    pcpu_alloc_bootmem,
					    pcpu_free_bootmem);
		if (rc)
			pr_warning("PERCPU: %s allocator failed (%d), "
				   "falling back to page size\n",
				   pcpu_fc_names[pcpu_chosen_fc], rc);
	}
	if (rc < 0)
		rc = pcpu_page_first_chunk(PERCPU_MODULE_RESERVE,
					   pcpu_alloc_bootmem,
					   pcpu_free_bootmem,
					   pcpu_populate_pte);
	if (rc < 0)
		panic("cannot initialize percpu area (err=%d)", rc);

	delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start;
	for_each_possible_cpu(cpu)
		__per_cpu_offset(cpu) = delta + pcpu_unit_offsets[cpu];

	/* Setup %g5 for the boot cpu.  */
	__local_per_cpu_offset = __per_cpu_offset(smp_processor_id());

	of_fill_in_cpu_data();
	if (tlb_type == hypervisor)
		mdesc_fill_in_cpu_data(cpu_all_mask);
}


text:
{!! Form::model($model, ['url' => 'FileList/'.$model->id, 'class' => 'form-horizontal', 'data-submit' => $model->id ?'put': 'post']) !!}

  <fieldset>

    @include('admin.pageblock')

    <div class="form-group">
      {!! Form::text('directory', null, ['class' => 'form-control', 'placeholder' => 'Files in this directory will be listed', 'required' => true, 'id' => 'directory']) !!}
      {!! Form::label('directory', 'Directory:', ['class' => 'control-label']) !!}
    </div>

    @include('admin.buttons')

  </fieldset>

{!! Form::close()  !!}


text:
/*************************************************************************/
/* spdlog - an extremely fast and easy to use c++11 logging library.     */
/* Copyright (c) 2014 Gabi Melman.                                       */
/*                                                                       */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the       */
/* "Software"), to deal in the Software without restriction, including   */
/* without limitation the rights to use, copy, modify, merge, publish,   */
/* distribute, sublicense, and/or sell copies of the Software, and to    */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions:                                             */
/*                                                                       */
/* The above copyright notice and this permission notice shall be        */
/* included in all copies or substantial portions of the Software.       */
/*                                                                       */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
/*************************************************************************/

#pragma once
// Loggers registy of unique name->logger pointer
// An attempt to create a logger with an alreasy existing name will be ignored
// If user requests a non existing logger, nullptr will be returned
// This class is thread safe

#include <string>
#include <mutex>
#include <unordered_map>
#include <functional>

#include "../logger.h"
#include "../async_logger.h"
#include "../common.h"

namespace spdlog
{
namespace details
{
class registry
{
public:

    void register_logger(std::shared_ptr<logger> logger)
    {
        std::lock_guard<std::mutex> lock(_mutex);
        register_logger_impl(logger);
    }

    std::shared_ptr<logger> get(const std::string& logger_name)
    {
        std::lock_guard<std::mutex> lock(_mutex);
        auto found = _loggers.find(logger_name);
        return found == _loggers.end() ? nullptr : found->second;
    }

    template<class It>
    std::shared_ptr<logger> create(const std::string& logger_name, const It& sinks_begin, const It& sinks_end)
    {

        std::shared_ptr<logger> new_logger;

        std::lock_guard<std::mutex> lock(_mutex);

        if (_async_mode)
            new_logger = std::make_shared<async_logger>(logger_name, sinks_begin, sinks_end, _async_q_size, _overflow_policy, _worker_warmup_cb);
        else
            new_logger = std::make_shared<logger>(logger_name, sinks_begin, sinks_end);

        if (_formatter)
            new_logger->set_formatter(_formatter);

        new_logger->set_sinks_level(_level);
        register_logger_impl(new_logger);
        return new_logger;
    }

    void drop(const std::string& logger_name)
    {
        std::lock_guard<std::mutex> lock(_mutex);
        _loggers.erase(logger_name);
    }

    void drop_all()
    {
        std::lock_guard<std::mutex> lock(_mutex);
        _loggers.clear();
    }
    std::shared_ptr<logger> create(const std::string& logger_name, sinks_init_list sinks)
    {
        return create(logger_name, sinks.begin(), sinks.end());
    }

    std::shared_ptr<logger> create(const std::string& logger_name, sink_ptr sink)
    {
        return create(logger_name, { sink });
    }

    void formatter(formatter_ptr f)
    {
        std::lock_guard<std::mutex> lock(_mutex);
        _formatter = f;
        for (auto& l : _loggers)
            l.second->set_formatter(_formatter);
    }

    void set_pattern(const std::string& pattern)
    {
        std::lock_guard<std::mutex> lock(_mutex);
        _formatter = std::make_shared<pattern_formatter>(pattern);
        for (auto& l : _loggers)
            l.second->set_formatter(_formatter);
    }

    void set_level(level::level_enum log_level)
    {
        std::lock_guard<std::mutex> lock(_mutex);
        for (auto& l : _loggers)
            l.second->set_sinks_level(log_level);
        _level = log_level;
    }

    void set_async_mode(size_t q_size, const async_overflow_policy overflow_policy, const std::function<void()>& worker_warmup_cb)
    {
        std::lock_guard<std::mutex> lock(_mutex);
        _async_mode = true;
        _async_q_size = q_size;
        _overflow_policy = overflow_policy;
        _worker_warmup_cb = worker_warmup_cb;
    }

    void set_sync_mode()
    {
        std::lock_guard<std::mutex> lock(_mutex);
        _async_mode = false;
    }

    static registry& instance()
    {
        static registry s_instance;
        return s_instance;
    }

private:
    void register_logger_impl(std::shared_ptr<logger> logger)
    {
        auto logger_name = logger->name();
        if (_loggers.find(logger_name) != std::end(_loggers))
            throw spdlog_ex("logger with name " + logger_name + " already exists");
        _loggers[logger->name()] = logger;
    }
    registry() = default;
    registry(const registry&) = delete;
    registry& operator=(const registry&) = delete;
    std::mutex _mutex;
    std::unordered_map <std::string, std::shared_ptr<logger>> _loggers;
    formatter_ptr _formatter;
    level::level_enum _level = level::info;
    bool _async_mode = false;
    size_t _async_q_size = 0;
    async_overflow_policy _overflow_policy = async_overflow_policy::block_retry;
    std::function<void()> _worker_warmup_cb = nullptr;
};
}
}


text:
// see https://www.npmjs.com/package/github-client
// and http://getbootstrap.com/css/ (styles for prettiness)
// and http://codemirror.net/ (text editor with syntax highlighting)
// and https://github.com/RubenVerborgh/N3.js (Turtle parser)

define(['jquery', 'github', 'N3', 'lib/codemirror',
  'addon/hint/show-hint', 'mode/turtle/turtle', 'hint/turtle-hint',
  'logger'
],

  function($, Github, N3, CodeMirror, ShowHint, ModeTurtle, HintTurtle,
    logger) {

    // HTML elements
------------------------------------------------------------

    var menu = $("#menu");

    var inputElements = {
      username: $("#input-username"),
      password: $("#input-password"),
      owner: $("#input-owner"),
      repo: $("#input-repo"),
      branch: $("#input-branch"),
      file: $("#input-file"),
      contents: $("#input-contents"),
      message: $("#input-message"),
      load: $("#button-load"),
      save: $("#button-save"),
      fileDisp: $(".current-filename"),
      vowlLink: $("#webvowl-link"),
      ghLink: $("#github-link"),
      sparqlURL: $("#sparql-link")
    };

    var syntaxCheckElements = {
      checker: $("#syntax-check"),
      working: $("#syntax-check-working"),
      pending: $("#syntax-check-pending"),
      passed: $("#syntax-check-passed"),
      failed: $("#syntax-check-failed"),
      off: $("#syntax-check-off")
    };

    // Editor state
-------------------------------------------------------------

    var isBinary = false;

    var gh,
      repo,
      branch,
      user;
    var currentFile;

    var state = {
      syntaxCheck: "pending",
      fileIsLoaded: false,
      gh: undefined,
      repo: undefined,
      branch: undefined,
      user: undefined,
      currentFile: undefined
    };

    var editor = CodeMirror.fromTextArea(inputElements.contents[0], {
      mode: "turtle",
      autofocus: false,
      lineNumbers: true,
      gutters: ["CodeMirror-linenumbers", "breakpoints"],
      extraKeys: {
        "Ctrl-Space": "autocomplete"
      }
    });

    // Initialization
-----------------------------------------------------------

    editor.custom = {}; // to pass list of prefixes and names
    editor.custom.dynamicNames = {};
    editor.custom.prefixed = {};
    var dynamicNames = {};

    CodeMirror.commands.autocomplete = function(cm) {
      cm.showHint(cm, CodeMirror.hint.turtle, {
        test: "test"
      });
    };

    // Reenable input element (necessary for Firefox)
    for (var key in inputElements) {
      inputElements[key].prop("disabled", false);
    }

    // Prefill some fields for a quick example
    inputElements.owner.val("i40-Tools");
    inputElements.repo.val("StandardOntology");
    inputElements.branch.val("semantic_lab");

    // Github Interaction
-------------------------------------------------------

    var loadFromGitHub = function() {
      var username = inputElements.username.val().trim();
      var ownername = inputElements.owner.val().trim();
      var password = inputElements.password.val().trim();
      var reponame = inputElements.repo.val().trim();
      var branchname = inputElements.branch.val().trim();

      if (state.fileIsLoaded) {
        logger.info("File already loaded.");
      } else {
        if (username != "") {
          gh = new Github({
            username: username,
            password: password
          });
        } else {
          gh = new Github({
            token: password
          });
        }

        user = gh.getUser();
        logger.debug("user", user);

        if (!user) {
          logger.warning("Not logged in.", username);
        }

        repo = gh.getRepo(ownername, reponame);
        branch = repo.getBranch(branchname);

        // TODO:
        // the next call is redundant: branch already contains list of
files,
        // and this should not be "master" but the selected branch:
        var tree = repo.git.getTree(branchname, null)
          .done(function(tree) {
            for (var i = 0; i < tree.length; i++) {
              if (tree[i].path.endsWith(".ttl")) {
                var opt = tree[i].path;
                var el = document.createElement("option");
                el.textContent = opt;
                el.value = opt;
                inputElements.file.append(el);
              }
            }
            readFile();
          });

        inputElements.username.prop("disabled", true);
        inputElements.password.prop("disabled", true);
        inputElements.owner.prop("disabled", true);
        inputElements.repo.prop("disabled", true);
        inputElements.branch.prop("disabled", true);

        disableLoadButton();

        changeSyntaxCheckState("pending");
      }
    };

    var readFile = function() {
      var filename = inputElements.file.val()

      branch.read(filename, isBinary)
        .done(function(contents) {
          editor.setValue(contents.content);
          state.fileIsLoaded = true;
          displayCurrentFilename(filename);

          if (user) {
            enableSaveButton();
          }
        })
        .fail(function(err) {
          logger.error("Read from GitHub failed", err);
        });
      changeSyntaxCheckState("pending");
    };

    var storeToGitHub = function() {
      var filename = inputElements.file.val();
      var content = editor.getValue().trim();
      var message = inputElements.message.val().trim();
      if (message) {
        if (state.fileIsLoaded) {
          branch.write(filename, content, message, isBinary)
            .done(function() {
              logger.success("Saving to GitHub completed.")
            })
            .fail(function(err) {
              logger.error("Saving to GitHub failed.", err);
            });
        } else {
          logger.info("Nothing to save.");
        }
      } else {
        alert(
          "Please, fill-in the commit message box, it cannot be
empty..."
        );
      }

    };

    // Display current filename
-------------------------------------------------

    var displayCurrentFilename = function(filename) {
      var baseUri =
"http://vowl.visualdataweb.org/webvowl/index.html#iri=https://raw.githubusercontent.com/";
      var ownername = inputElements.owner.val().trim();
      var reponame = inputElements.repo.val().trim();
      var branchname = inputElements.branch.val().trim();
      var specific = ownername + "/" + reponame + "/" + branchname;
      inputElements.fileDisp.html(filename)
      inputElements.vowlLink.removeAttr("href");
      inputElements.vowlLink.attr("href", baseUri + specific + "/" +
        filename);

      // external links //////////////////////////
      var githubURI = "https://github.com";
      inputElements.ghLink.attr("href", githubURI + "/" + ownername +
"/" +
        reponame + "/");
      var sparqlProcessorURI =
"../SparqlProcessor/sparql-processor.html";

      inputElements.sparqlURL.attr("href", sparqlProcessorURI + "#" +
        ownername + "/" + reponame + "/" + filename);
      $("#menu").show();
    };

    //
"http://vowl.visualdataweb.org/webvowl/index.html#iri=https://raw.githubusercontent.com/mobivoc/mobivoc/master/"

    // Syntax Check
-------------------------------------------------------------

    var toggleChecking = function() {
      console.log("toggleChecking");
      if (state.syntaxCheck === "off") {
        console.log("-> pending");
        changeSyntaxCheckState("pending", undefined, true);
      } else {
        changeSyntaxCheckState("off");
        console.log("-> off");
      }
    };

    syntaxCheckElements.checker.on("click", toggleChecking);

    var makeMarker = function(errorMessage) {
      var marker = document.createElement("div");
      marker.style.color = "#822";
      marker.innerHTML = "●";
      marker.title = errorMessage;
      return marker;
    };

    var splitIntoNamespaceAndName = function(s) {
      var lastHash = s.lastIndexOf("#");
      var lastSlash = s.lastIndexOf("/");
      var pos = Math.max(lastHash, lastSlash) + 1;

      return {
        namespace: s.substring(0, pos),
        name: s.substring(pos)
      };
    };

    var parserHandler = function(error, triple, prefixes) {
      if (error) {

        /* extract line Number, only consider the end of the string
after "line" */
        var errorSubString = error.message.substr(error.message.indexOf(
            "line") + 4);
        var errorLineNumber = parseInt(errorSubString) - 1;

        /* add background color, gutter + tooltip */

////////////////////////////////////////////////////////////////////////////

        editor.getDoc().addLineClass(errorLineNumber, "wrap",
          "ErrorLine-background");

        //debugger;
        editor.getDoc().markText({
          line: 1,
          ch: 1
        }, {
          line: 2,
          ch: 2
        }, {
          readOnly: false
        });
        // editor.defineMode( "turtle", function() {
        //
        //   return {
        //     token: function(stream, state) {
        //
        //       if (stream.match("prefix")) {
        //         return { color: red};
        //       } else if (stream.match("bbb")) {
        //         return "style2";
        //       } else {
        //         stream.next();
        //         return null;
        //       }
        //     }
        //   };
        //
        // });
        // editor = CodeMirror.fromTextArea(inputElements.contents[0], {
        //   mode: "turtle",
        //   autofocus: false,
        //   lineNumbers: true,
        //   gutters: ["CodeMirror-linenumbers", "breakpoints"],
        //   extraKeys: {
        //     "Ctrl-Space": "autocomplete"
        //   }
        // });

        // var editor =
CodeMirror.fromTextArea(document.getElementById('input-contents'), {
        //   mode: "mymode",
        //   lineNumbers: true
        // });

//////////////////////////////////////////////////////////////////////////////
        console.log("I am here");
        editor.setGutterMarker(errorLineNumber, "breakpoints",
makeMarker(
          error.message));

        changeSyntaxCheckState("failed", error.message);
      } else if (triple) {
        var subjectSplit = splitIntoNamespaceAndName(triple.subject);
        var predicateSplit =
splitIntoNamespaceAndName(triple.predicate);
        var objectSplit = splitIntoNamespaceAndName(triple.object);

        dynamicNames[subjectSplit.namespace] =
dynamicNames[subjectSplit.namespace] || {};
        dynamicNames[subjectSplit.namespace][subjectSplit.name] = true;

        dynamicNames[predicateSplit.namespace] = dynamicNames[
          predicateSplit.namespace] || {};
        dynamicNames[predicateSplit.namespace][predicateSplit.name] =
true;

        dynamicNames[objectSplit.namespace] =
dynamicNames[objectSplit.namespace] || {};
        dynamicNames[objectSplit.namespace][objectSplit.name] = true;
      } else if (!triple) {
        changeSyntaxCheckState("passed");
      //        editor.custom.dynamicNames = dynamicNames;
      }

      if (prefixes) {
        editor.custom.prefixes = prefixes;
      }
    };

    var changeSyntaxCheckState = function(newState, error, force) {
      if (newState !== state.syntaxCheck && (state.syntaxCheck !== "off"
||
        force === true)) {
        console.log("changeSyntaxCheckState", newState, error, force);
        syntaxCheckElements[state.syntaxCheck].hide();
        state.syntaxCheck = newState;

        if (newState === "failed") {
          var status = syntaxCheckElements[newState].find(".status")
          if (error) {
            if (error.startsWith("Syntax error:")) {
              status.html(" " + error);
            } else {
              status.html(" Syntax error: " + error);
            }
          } else {
            status.html(" Syntax check failed.")
          }
        }
        syntaxCheckElements[newState].show();
      }
    };

    var checkSyntax = function() {
      /* remove all previous errors  */
      /* TODO: IMPROVE EFFICIENCY */
      editor.eachLine(function(line) {
        editor.getDoc().removeLineClass(line, "wrap");
        editor.clearGutter("breakpoints");
      });

      var parser,
        content;
      if (state.fileIsLoaded) {
        content = editor.getValue();
        parser = N3.Parser();
        parser.parse(content, parserHandler);
      }
    };

    var checkForUpdates = function() {
      if (state.syntaxCheck === "pending" && state.fileIsLoaded) {
        changeSyntaxCheckState("working");
        checkSyntax();
      }
    };

    // Event listeners
----------------------------------------------------------

    inputElements.load.on("click", loadFromGitHub);
    inputElements.save.on("click", storeToGitHub);
    inputElements.file.on("change", readFile);

    editor.on("change", function() {
      changeSyntaxCheckState("pending");
    });

    // Repeated actions
---------------------------------------------------------

    window.setInterval(checkForUpdates, 1000);

    // Utility
------------------------------------------------------------------

    var disableLoadButton = function() {
      inputElements.load.removeClass("btn-primary");
      inputElements.load.addClass("btn-default");
      inputElements.load.prop("disabled", true);
    };

    var enableSaveButton = function() {
      inputElements.save.removeClass("btn-default");
      inputElements.save.addClass("btn-primary");
      inputElements.save.prop("disabled", false);
    };

    var disableSaveButton = function() {
      inputElements.save.addClass("btn-default");
      inputElements.save.removeClass("btn-primary");
      inputElements.save.prop("disabled", true);
    };

    // do it
    disableSaveButton();

    if (!String.prototype.endsWith) {
      String.prototype.endsWith = function(searchString, position) {
        var subjectString = this.toString();
        if (position === undefined || position > subjectString.length) {
          position = subjectString.length;
        }
        position -= searchString.length;
        var lastIndex = subjectString.indexOf(searchString, position);
        return lastIndex !== -1 && lastIndex === position;
      };
    }

    if (!String.prototype.startsWith) {
      String.prototype.startsWith = function(searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
      };
    }
  });


text:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        tools:context=".gui.MainActivity">

    <item
        android:id="@+id/action_sort"
        android:title="@string/action_sort"
        android:icon="@drawable/ic_sort_variant"
        app:showAsAction="ifRoom">
        <menu>
            <group android:checkableBehavior="single">
                <item
                    android:id="@+id/action_sort_by_state"
                    android:title="@string/action_sort_by_state"
                    android:onClick="onSortMenuItemSelected" />
                <item
                    android:id="@+id/action_sort_by_party"
                    android:title="@string/action_sort_by_party"
                    android:onClick="onSortMenuItemSelected"/>
                <item
                    android:id="@+id/action_sort_by_name"
                    android:title="@string/action_sort_by_name"
                    android:checked="true"
                    android:onClick="onSortMenuItemSelected"/>
                <item
                    android:id="@+id/action_sort_by_approved_first"
                    android:title="@string/action_sort_by_approved_first"
                    android:onClick="onSortMenuItemSelected"/>
                <item
                    android:id="@+id/action_sort_by_neutral_first"
                    android:title="@string/action_sort_by_neutral_first"
                    android:onClick="onSortMenuItemSelected"/>
                <item
                    android:id="@+id/action_sort_by_reproved_first"
                    android:title="@string/action_sort_by_reproved_first"
                    android:onClick="onSortMenuItemSelected"/>
            </group>
        </menu>
    </item>
</menu>


text:
using System;
using System.Linq;
using Rothko.UI.Interfaces.Services;
using Rothko.UI.Model;
using Rothko.Interfaces.Services;
using System.Collections.Generic;
using Rothko.Enumerators;
using Rothko.UI.Interfaces.Components;

namespace Rothko.UI.Services
{
	public class UISetupService : IUISetupService
	{
		ICommandManagerService _CommandManagerService;
		RothkoUIBaseDatabase _RothkoUIBaseDatabase;

		public void Setup(IUIUnitable uiUnit)
		{
			uiUnit.SetupAnimations(_RothkoUIBaseDatabase);

			uiUnit.DestinationReached += (sender, e) => _CommandManagerService.Execute();

			uiUnit.AnimationFinished += (sender, e) =>
			{
				switch (uiUnit.Base.State)
				{
					case UnitState.Attacking:
						_CommandManagerService.Execute();
					break;

					case UnitState.BeingDestroyed:
						uiUnit.Base.State = UnitState.Destroyed;
					break;
				}
			};
		}

		public void Setup<T>(IList<T> uiUnits)
			where T : IUIUnitable
		{
			foreach (var item in uiUnits)
				Setup(item);
		}

		public UISetupService (ICommandManagerService commandManagerService,
		                       RothkoUIBaseDatabase rothkoUIBaseDatabase)
		{
			_CommandManagerService = commandManagerService;

			_RothkoUIBaseDatabase = rothkoUIBaseDatabase;
		}
	}
}


text:
class CacheItem(object):
    def __init__(self, key, value):
        self.key = key
        self.hash = hash(key)
        self.value = value

class Cache(object):
    size = 100
    def __init__(self):
        self.items = []

    def __contains__(self, key):
        try:
            self.index(key)
        except KeyError:
            return False
        return True

    def __delitem__(self, key):
        self.items.pop(self.index(key))

    def __getitem__(self, key):
        i = self.index(key)
        item = self.items.pop(i)
        self.items.insert(0, item)
        return item.value

    def __len__(self):
        return len(self.items)

    def __setitem__(self, key, value):
        try:
            i = self.index(key)
        except KeyError:
            pass
        else:
            self.items.pop(i)
        self.items.insert(0, CacheItem(key, value))
        if len(self.items) > self.size:
            self.items.pop()

    def index(self, key):
        h = hash(key)
        for i, item in enumerate(self.items):
            if item.hash == h and item.key == key:
                return i
        raise KeyError(key)

    def flush(self):
        self.items = []

    def get(self, key, default=None):
        try:
            return self[key]
        except KeyError:
            return default

    def peek(self, key):
        i = self.index(key)
        return self.items[i].value


text:
ResourceManager::ResourceManager()
{
}

ResourceManager::~ResourceManager()
{
}

std::shared_ptr<sf::Texture> ResourceManager::accessTexture(const std::string &iTextureName)
{
    auto it = _textures.find(iTextureName);
    if (it == _textures.end())
    {
        auto ret = _textures.insert(std::make_pair(iTextureName, std::make_shared<sf::Texture>()));
        if (ret.first->second->loadFromFile(RESOURCES_FOLDER + iTextureName))
            return ret.first->second;
        else
            return nullptr;
    }
    else
    {
        return (*it).second;
    }
}

std::shared_ptr<sf::Font> ResourceManager::accessFont(const std::string &iFontName)
{
    auto it = _fonts.find(iFontName);
    if (it == _fonts.end())
    {
        auto ret = _fonts.insert(std::make_pair(iFontName, std::make_shared<sf::Font>()));
        if (ret.first->second->loadFromFile(RESOURCES_FOLDER + iFontName))
            return ret.first->second;
        else
            return nullptr;
    }
    else
    {
        return (*it).second;
    }
}

void ResourceManager::loadSpriteSheet(const std::string& iSpriteSheet, const std::string& iMapFile)
{
    std::ifstream file(RESOURCES_FOLDER + iMapFile);
    std::string name;
    char eq;
    int x, y, w, h;
    while(file >> name >> eq >> x >> y >> w >> h)
    {
        LOG_INFO("ResourceManager", name << " " << eq << " " << x << " " << y << " " << w << " " << h);
        _spritesDescriptions[name] = std::make_pair(iSpriteSheet, sf::IntRect(x, y, w, h));
    }
}

std::shared_ptr<sf::Sprite> ResourceManager::createSprite(const std::string& iImageName)
{
    SpriteDesc_t aSpriteDesciption = _spritesDescriptions[iImageName];
    return std::make_shared<sf::Sprite>(*accessTexture(aSpriteDesciption.first), aSpriteDesciption.second);
}