##// END OF EJS Templates
runtests: add a function to test if IPv6 is available...
runtests: add a function to test if IPv6 is available Previously, checkportisavailable returns True if the port is free either on IPv4 or IPv6, but the hg server only uses IPv4 by default. That leads to issues when IPv4 port is not free but the IPv6 one is. To address that, run-tests should stick with either IPv4 or IPv6. This patch adds a function similar to checkportisavailable to test if IPv6 is available, and assigns the result to a variable. The new function was tested in a Linux system script with the following steps: 1. Run "ip addr del ::1/128 dev lo" to delete lo's IPv6 address, Confirm checkipv6available() returns False. 2. Run "ip addr add ::1/128 dev lo" to add back lo's IPv6 address. Confirm checkipv6available() returns True. 3. Start a web server taking the 8000 port. Confirm checkipv6available(8000) is still True.

File last commit:

r30895:c32454d6 default
r30984:15f9084a default
Show More
dictparams.c
141 lines | 4.4 KiB | text/x-c | CLexer
/**
* Copyright (c) 2016-present, Gregory Szorc
* All rights reserved.
*
* This software may be modified and distributed under the terms
* of the BSD license. See the LICENSE file for details.
*/
#include "python-zstandard.h"
PyDoc_STRVAR(DictParameters__doc__,
"DictParameters: low-level control over dictionary generation");
static PyObject* DictParameters_new(PyTypeObject* subtype, PyObject* args, PyObject* kwargs) {
DictParametersObject* self;
unsigned selectivityLevel;
int compressionLevel;
unsigned notificationLevel;
unsigned dictID;
if (!PyArg_ParseTuple(args, "IiII:DictParameters",
&selectivityLevel, &compressionLevel, &notificationLevel, &dictID)) {
return NULL;
}
self = (DictParametersObject*)subtype->tp_alloc(subtype, 1);
if (!self) {
return NULL;
}
self->selectivityLevel = selectivityLevel;
self->compressionLevel = compressionLevel;
self->notificationLevel = notificationLevel;
self->dictID = dictID;
return (PyObject*)self;
}
static void DictParameters_dealloc(PyObject* self) {
PyObject_Del(self);
}
static PyMemberDef DictParameters_members[] = {
{ "selectivity_level", T_UINT,
offsetof(DictParametersObject, selectivityLevel), READONLY,
"selectivity level" },
{ "compression_level", T_INT,
offsetof(DictParametersObject, compressionLevel), READONLY,
"compression level" },
{ "notification_level", T_UINT,
offsetof(DictParametersObject, notificationLevel), READONLY,
"notification level" },
{ "dict_id", T_UINT,
offsetof(DictParametersObject, dictID), READONLY,
"dictionary ID" },
{ NULL }
};
static Py_ssize_t DictParameters_length(PyObject* self) {
return 4;
}
static PyObject* DictParameters_item(PyObject* o, Py_ssize_t i) {
DictParametersObject* self = (DictParametersObject*)o;
switch (i) {
case 0:
return PyLong_FromLong(self->selectivityLevel);
case 1:
return PyLong_FromLong(self->compressionLevel);
case 2:
return PyLong_FromLong(self->notificationLevel);
case 3:
return PyLong_FromLong(self->dictID);
default:
PyErr_SetString(PyExc_IndexError, "index out of range");
return NULL;
}
}
static PySequenceMethods DictParameters_sq = {
DictParameters_length, /* sq_length */
0, /* sq_concat */
0, /* sq_repeat */
DictParameters_item, /* sq_item */
0, /* sq_ass_item */
0, /* sq_contains */
0, /* sq_inplace_concat */
0 /* sq_inplace_repeat */
};
PyTypeObject DictParametersType = {
PyVarObject_HEAD_INIT(NULL, 0)
"DictParameters", /* tp_name */
sizeof(DictParametersObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)DictParameters_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
&DictParameters_sq, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
DictParameters__doc__, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
0, /* tp_methods */
DictParameters_members, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
DictParameters_new, /* tp_new */
};
void dictparams_module_init(PyObject* mod) {
Py_TYPE(&DictParametersType) = &PyType_Type;
if (PyType_Ready(&DictParametersType) < 0) {
return;
}
Py_IncRef((PyObject*)&DictParametersType);
PyModule_AddObject(mod, "DictParameters", (PyObject*)&DictParametersType);
}