summaryrefslogtreecommitdiffstats
path: root/pym/portage/util/_eventloop/global_event_loop.py
blob: 502dab8820aaa9c3689a7c972ab278bc68c9011c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# Copyright 2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

import os

from .EventLoop import EventLoop

_default_constructor = EventLoop
#from .GlibEventLoop import GlibEventLoop as _default_constructor

# If _default_constructor doesn't support multiprocessing,
# then _multiprocessing_constructor is used in subprocesses.
_multiprocessing_constructor = EventLoop

_MAIN_PID = os.getpid()
_instances = {}

def global_event_loop():
	"""
	Get a global EventLoop (or compatible object) instance which
	belongs exclusively to the current process.
	"""

	pid = os.getpid()
	instance = _instances.get(pid)
	if instance is not None:
		return instance

	constructor = _default_constructor
	if not constructor.supports_multiprocessing and pid != _MAIN_PID:
		constructor = _multiprocessing_constructor

	instance = constructor()
	_instances[pid] = instance
	return instance