Statistics
| Branch: | Tag: | Revision:

root / lib / utils / cfunc.py @ 6915fe26

History | View | Annotate | Download (2.6 kB)

1 36a4acd4 Michael Hanselmann
#
2 36a4acd4 Michael Hanselmann
#
3 36a4acd4 Michael Hanselmann
4 36a4acd4 Michael Hanselmann
# Copyright (C) 2009, 2010, 2011 Google Inc.
5 36a4acd4 Michael Hanselmann
#
6 36a4acd4 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 36a4acd4 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 36a4acd4 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 36a4acd4 Michael Hanselmann
# (at your option) any later version.
10 36a4acd4 Michael Hanselmann
#
11 36a4acd4 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 36a4acd4 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 36a4acd4 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 36a4acd4 Michael Hanselmann
# General Public License for more details.
15 36a4acd4 Michael Hanselmann
#
16 36a4acd4 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 36a4acd4 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 36a4acd4 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 36a4acd4 Michael Hanselmann
# 02110-1301, USA.
20 36a4acd4 Michael Hanselmann
21 36a4acd4 Michael Hanselmann
"""Wrapper around mlockall(2).
22 36a4acd4 Michael Hanselmann

23 36a4acd4 Michael Hanselmann
"""
24 36a4acd4 Michael Hanselmann
25 36a4acd4 Michael Hanselmann
import os
26 36a4acd4 Michael Hanselmann
import logging
27 36a4acd4 Michael Hanselmann
28 36a4acd4 Michael Hanselmann
from ganeti import errors
29 36a4acd4 Michael Hanselmann
30 36a4acd4 Michael Hanselmann
try:
31 b459a848 Andrea Spadaccini
  # pylint: disable=F0401
32 36a4acd4 Michael Hanselmann
  import ctypes
33 36a4acd4 Michael Hanselmann
except ImportError:
34 36a4acd4 Michael Hanselmann
  ctypes = None
35 36a4acd4 Michael Hanselmann
36 36a4acd4 Michael Hanselmann
37 6915fe26 Michael Hanselmann
# Flags for mlockall(2) (from bits/mman.h)
38 36a4acd4 Michael Hanselmann
_MCL_CURRENT = 1
39 36a4acd4 Michael Hanselmann
_MCL_FUTURE = 2
40 36a4acd4 Michael Hanselmann
41 36a4acd4 Michael Hanselmann
42 6915fe26 Michael Hanselmann
class _FuncWrapper:
43 6915fe26 Michael Hanselmann
  def __init__(self, ct):
44 6915fe26 Michael Hanselmann
    """Initializes this class.
45 6915fe26 Michael Hanselmann

46 6915fe26 Michael Hanselmann
    """
47 6915fe26 Michael Hanselmann
    # Make use of a dlopen(3) feature whereby giving a NULL handle returns the
48 6915fe26 Michael Hanselmann
    # main program. Functions from all previously loaded libraries can then be
49 6915fe26 Michael Hanselmann
    # used.
50 6915fe26 Michael Hanselmann
    mainprog = ct.CDLL(None)
51 6915fe26 Michael Hanselmann
52 6915fe26 Michael Hanselmann
    # The ctypes module before Python 2.6 does not have built-in functionality
53 6915fe26 Michael Hanselmann
    # to access the global errno global (which, depending on the libc and build
54 6915fe26 Michael Hanselmann
    # options, is per-thread), where function error codes are stored. Use GNU
55 6915fe26 Michael Hanselmann
    # libc's way to retrieve errno(3) instead.
56 6915fe26 Michael Hanselmann
    try:
57 6915fe26 Michael Hanselmann
      errno_loc = getattr(mainprog, "__errno_location")
58 6915fe26 Michael Hanselmann
    except AttributeError, err:
59 6915fe26 Michael Hanselmann
      logging.debug("Unable to find errno location: %s", err)
60 6915fe26 Michael Hanselmann
      errno_fn = None
61 6915fe26 Michael Hanselmann
    else:
62 6915fe26 Michael Hanselmann
      errno_loc.restype = ct.POINTER(ct.c_int)
63 6915fe26 Michael Hanselmann
      errno_fn = lambda: errno_loc().contents.value
64 6915fe26 Michael Hanselmann
65 6915fe26 Michael Hanselmann
    self.errno_fn = errno_fn
66 6915fe26 Michael Hanselmann
67 6915fe26 Michael Hanselmann
    # Try to get mlockall(2)
68 6915fe26 Michael Hanselmann
    self.mlockall_fn = getattr(mainprog, "mlockall", None)
69 6915fe26 Michael Hanselmann
70 6915fe26 Michael Hanselmann
71 36a4acd4 Michael Hanselmann
def Mlockall(_ctypes=ctypes):
72 36a4acd4 Michael Hanselmann
  """Lock current process' virtual address space into RAM.
73 36a4acd4 Michael Hanselmann

74 6915fe26 Michael Hanselmann
  This is equivalent to the C call C{mlockall(MCL_CURRENT | MCL_FUTURE)}. See
75 6915fe26 Michael Hanselmann
  mlockall(2) for more details. This function requires the C{ctypes} module.
76 36a4acd4 Michael Hanselmann

77 6915fe26 Michael Hanselmann
  @raises errors.NoCtypesError: If the C{ctypes} module is not found
78 36a4acd4 Michael Hanselmann

79 36a4acd4 Michael Hanselmann
  """
80 36a4acd4 Michael Hanselmann
  if _ctypes is None:
81 36a4acd4 Michael Hanselmann
    raise errors.NoCtypesError()
82 36a4acd4 Michael Hanselmann
83 6915fe26 Michael Hanselmann
  funcs = _FuncWrapper(_ctypes)
84 6915fe26 Michael Hanselmann
85 6915fe26 Michael Hanselmann
  if funcs.mlockall_fn is None:
86 6915fe26 Michael Hanselmann
    logging.debug("libc doesn't support mlockall(2)")
87 6915fe26 Michael Hanselmann
  else:
88 6915fe26 Michael Hanselmann
    if funcs.mlockall_fn(_MCL_CURRENT | _MCL_FUTURE) == 0:
89 6915fe26 Michael Hanselmann
      logging.debug("Memory lock set")
90 6915fe26 Michael Hanselmann
      return True
91 6915fe26 Michael Hanselmann
92 6915fe26 Michael Hanselmann
    logging.error("Cannot set memory lock: %s", os.strerror(funcs.errno_fn()))
93 6915fe26 Michael Hanselmann
94 6915fe26 Michael Hanselmann
  return False