(root)/
Python-3.12.0/
Modules/
clinic/
_queuemodule.c.h
       1  /*[clinic input]
       2  preserve
       3  [clinic start generated code]*/
       4  
       5  #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
       6  #  include "pycore_gc.h"            // PyGC_Head
       7  #  include "pycore_runtime.h"       // _Py_ID()
       8  #endif
       9  
      10  
      11  PyDoc_STRVAR(simplequeue_new__doc__,
      12  "SimpleQueue()\n"
      13  "--\n"
      14  "\n"
      15  "Simple, unbounded, reentrant FIFO queue.");
      16  
      17  static PyObject *
      18  simplequeue_new_impl(PyTypeObject *type);
      19  
      20  static PyObject *
      21  simplequeue_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
      22  {
      23      PyObject *return_value = NULL;
      24      PyTypeObject *base_tp = simplequeue_get_state_by_type(type)->SimpleQueueType;
      25  
      26      if ((type == base_tp || type->tp_init == base_tp->tp_init) &&
      27          !_PyArg_NoPositional("SimpleQueue", args)) {
      28          goto exit;
      29      }
      30      if ((type == base_tp || type->tp_init == base_tp->tp_init) &&
      31          !_PyArg_NoKeywords("SimpleQueue", kwargs)) {
      32          goto exit;
      33      }
      34      return_value = simplequeue_new_impl(type);
      35  
      36  exit:
      37      return return_value;
      38  }
      39  
      40  PyDoc_STRVAR(_queue_SimpleQueue_put__doc__,
      41  "put($self, /, item, block=True, timeout=None)\n"
      42  "--\n"
      43  "\n"
      44  "Put the item on the queue.\n"
      45  "\n"
      46  "The optional \'block\' and \'timeout\' arguments are ignored, as this method\n"
      47  "never blocks.  They are provided for compatibility with the Queue class.");
      48  
      49  #define _QUEUE_SIMPLEQUEUE_PUT_METHODDEF    \
      50      {"put", _PyCFunction_CAST(_queue_SimpleQueue_put), METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_put__doc__},
      51  
      52  static PyObject *
      53  _queue_SimpleQueue_put_impl(simplequeueobject *self, PyObject *item,
      54                              int block, PyObject *timeout);
      55  
      56  static PyObject *
      57  _queue_SimpleQueue_put(simplequeueobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
      58  {
      59      PyObject *return_value = NULL;
      60      #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
      61  
      62      #define NUM_KEYWORDS 3
      63      static struct {
      64          PyGC_Head _this_is_not_used;
      65          PyObject_VAR_HEAD
      66          PyObject *ob_item[NUM_KEYWORDS];
      67      } _kwtuple = {
      68          .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
      69          .ob_item = { &_Py_ID(item), &_Py_ID(block), &_Py_ID(timeout), },
      70      };
      71      #undef NUM_KEYWORDS
      72      #define KWTUPLE (&_kwtuple.ob_base.ob_base)
      73  
      74      #else  // !Py_BUILD_CORE
      75      #  define KWTUPLE NULL
      76      #endif  // !Py_BUILD_CORE
      77  
      78      static const char * const _keywords[] = {"item", "block", "timeout", NULL};
      79      static _PyArg_Parser _parser = {
      80          .keywords = _keywords,
      81          .fname = "put",
      82          .kwtuple = KWTUPLE,
      83      };
      84      #undef KWTUPLE
      85      PyObject *argsbuf[3];
      86      Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
      87      PyObject *item;
      88      int block = 1;
      89      PyObject *timeout = Py_None;
      90  
      91      args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf);
      92      if (!args) {
      93          goto exit;
      94      }
      95      item = args[0];
      96      if (!noptargs) {
      97          goto skip_optional_pos;
      98      }
      99      if (args[1]) {
     100          block = PyObject_IsTrue(args[1]);
     101          if (block < 0) {
     102              goto exit;
     103          }
     104          if (!--noptargs) {
     105              goto skip_optional_pos;
     106          }
     107      }
     108      timeout = args[2];
     109  skip_optional_pos:
     110      return_value = _queue_SimpleQueue_put_impl(self, item, block, timeout);
     111  
     112  exit:
     113      return return_value;
     114  }
     115  
     116  PyDoc_STRVAR(_queue_SimpleQueue_put_nowait__doc__,
     117  "put_nowait($self, /, item)\n"
     118  "--\n"
     119  "\n"
     120  "Put an item into the queue without blocking.\n"
     121  "\n"
     122  "This is exactly equivalent to `put(item)` and is only provided\n"
     123  "for compatibility with the Queue class.");
     124  
     125  #define _QUEUE_SIMPLEQUEUE_PUT_NOWAIT_METHODDEF    \
     126      {"put_nowait", _PyCFunction_CAST(_queue_SimpleQueue_put_nowait), METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_put_nowait__doc__},
     127  
     128  static PyObject *
     129  _queue_SimpleQueue_put_nowait_impl(simplequeueobject *self, PyObject *item);
     130  
     131  static PyObject *
     132  _queue_SimpleQueue_put_nowait(simplequeueobject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     133  {
     134      PyObject *return_value = NULL;
     135      #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
     136  
     137      #define NUM_KEYWORDS 1
     138      static struct {
     139          PyGC_Head _this_is_not_used;
     140          PyObject_VAR_HEAD
     141          PyObject *ob_item[NUM_KEYWORDS];
     142      } _kwtuple = {
     143          .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
     144          .ob_item = { &_Py_ID(item), },
     145      };
     146      #undef NUM_KEYWORDS
     147      #define KWTUPLE (&_kwtuple.ob_base.ob_base)
     148  
     149      #else  // !Py_BUILD_CORE
     150      #  define KWTUPLE NULL
     151      #endif  // !Py_BUILD_CORE
     152  
     153      static const char * const _keywords[] = {"item", NULL};
     154      static _PyArg_Parser _parser = {
     155          .keywords = _keywords,
     156          .fname = "put_nowait",
     157          .kwtuple = KWTUPLE,
     158      };
     159      #undef KWTUPLE
     160      PyObject *argsbuf[1];
     161      PyObject *item;
     162  
     163      args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
     164      if (!args) {
     165          goto exit;
     166      }
     167      item = args[0];
     168      return_value = _queue_SimpleQueue_put_nowait_impl(self, item);
     169  
     170  exit:
     171      return return_value;
     172  }
     173  
     174  PyDoc_STRVAR(_queue_SimpleQueue_get__doc__,
     175  "get($self, /, block=True, timeout=None)\n"
     176  "--\n"
     177  "\n"
     178  "Remove and return an item from the queue.\n"
     179  "\n"
     180  "If optional args \'block\' is true and \'timeout\' is None (the default),\n"
     181  "block if necessary until an item is available. If \'timeout\' is\n"
     182  "a non-negative number, it blocks at most \'timeout\' seconds and raises\n"
     183  "the Empty exception if no item was available within that time.\n"
     184  "Otherwise (\'block\' is false), return an item if one is immediately\n"
     185  "available, else raise the Empty exception (\'timeout\' is ignored\n"
     186  "in that case).");
     187  
     188  #define _QUEUE_SIMPLEQUEUE_GET_METHODDEF    \
     189      {"get", _PyCFunction_CAST(_queue_SimpleQueue_get), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_get__doc__},
     190  
     191  static PyObject *
     192  _queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls,
     193                              int block, PyObject *timeout_obj);
     194  
     195  static PyObject *
     196  _queue_SimpleQueue_get(simplequeueobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     197  {
     198      PyObject *return_value = NULL;
     199      #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
     200  
     201      #define NUM_KEYWORDS 2
     202      static struct {
     203          PyGC_Head _this_is_not_used;
     204          PyObject_VAR_HEAD
     205          PyObject *ob_item[NUM_KEYWORDS];
     206      } _kwtuple = {
     207          .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
     208          .ob_item = { &_Py_ID(block), &_Py_ID(timeout), },
     209      };
     210      #undef NUM_KEYWORDS
     211      #define KWTUPLE (&_kwtuple.ob_base.ob_base)
     212  
     213      #else  // !Py_BUILD_CORE
     214      #  define KWTUPLE NULL
     215      #endif  // !Py_BUILD_CORE
     216  
     217      static const char * const _keywords[] = {"block", "timeout", NULL};
     218      static _PyArg_Parser _parser = {
     219          .keywords = _keywords,
     220          .fname = "get",
     221          .kwtuple = KWTUPLE,
     222      };
     223      #undef KWTUPLE
     224      PyObject *argsbuf[2];
     225      Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
     226      int block = 1;
     227      PyObject *timeout_obj = Py_None;
     228  
     229      args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 2, 0, argsbuf);
     230      if (!args) {
     231          goto exit;
     232      }
     233      if (!noptargs) {
     234          goto skip_optional_pos;
     235      }
     236      if (args[0]) {
     237          block = PyObject_IsTrue(args[0]);
     238          if (block < 0) {
     239              goto exit;
     240          }
     241          if (!--noptargs) {
     242              goto skip_optional_pos;
     243          }
     244      }
     245      timeout_obj = args[1];
     246  skip_optional_pos:
     247      return_value = _queue_SimpleQueue_get_impl(self, cls, block, timeout_obj);
     248  
     249  exit:
     250      return return_value;
     251  }
     252  
     253  PyDoc_STRVAR(_queue_SimpleQueue_get_nowait__doc__,
     254  "get_nowait($self, /)\n"
     255  "--\n"
     256  "\n"
     257  "Remove and return an item from the queue without blocking.\n"
     258  "\n"
     259  "Only get an item if one is immediately available. Otherwise\n"
     260  "raise the Empty exception.");
     261  
     262  #define _QUEUE_SIMPLEQUEUE_GET_NOWAIT_METHODDEF    \
     263      {"get_nowait", _PyCFunction_CAST(_queue_SimpleQueue_get_nowait), METH_METHOD|METH_FASTCALL|METH_KEYWORDS, _queue_SimpleQueue_get_nowait__doc__},
     264  
     265  static PyObject *
     266  _queue_SimpleQueue_get_nowait_impl(simplequeueobject *self,
     267                                     PyTypeObject *cls);
     268  
     269  static PyObject *
     270  _queue_SimpleQueue_get_nowait(simplequeueobject *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     271  {
     272      if (nargs) {
     273          PyErr_SetString(PyExc_TypeError, "get_nowait() takes no arguments");
     274          return NULL;
     275      }
     276      return _queue_SimpleQueue_get_nowait_impl(self, cls);
     277  }
     278  
     279  PyDoc_STRVAR(_queue_SimpleQueue_empty__doc__,
     280  "empty($self, /)\n"
     281  "--\n"
     282  "\n"
     283  "Return True if the queue is empty, False otherwise (not reliable!).");
     284  
     285  #define _QUEUE_SIMPLEQUEUE_EMPTY_METHODDEF    \
     286      {"empty", (PyCFunction)_queue_SimpleQueue_empty, METH_NOARGS, _queue_SimpleQueue_empty__doc__},
     287  
     288  static int
     289  _queue_SimpleQueue_empty_impl(simplequeueobject *self);
     290  
     291  static PyObject *
     292  _queue_SimpleQueue_empty(simplequeueobject *self, PyObject *Py_UNUSED(ignored))
     293  {
     294      PyObject *return_value = NULL;
     295      int _return_value;
     296  
     297      _return_value = _queue_SimpleQueue_empty_impl(self);
     298      if ((_return_value == -1) && PyErr_Occurred()) {
     299          goto exit;
     300      }
     301      return_value = PyBool_FromLong((long)_return_value);
     302  
     303  exit:
     304      return return_value;
     305  }
     306  
     307  PyDoc_STRVAR(_queue_SimpleQueue_qsize__doc__,
     308  "qsize($self, /)\n"
     309  "--\n"
     310  "\n"
     311  "Return the approximate size of the queue (not reliable!).");
     312  
     313  #define _QUEUE_SIMPLEQUEUE_QSIZE_METHODDEF    \
     314      {"qsize", (PyCFunction)_queue_SimpleQueue_qsize, METH_NOARGS, _queue_SimpleQueue_qsize__doc__},
     315  
     316  static Py_ssize_t
     317  _queue_SimpleQueue_qsize_impl(simplequeueobject *self);
     318  
     319  static PyObject *
     320  _queue_SimpleQueue_qsize(simplequeueobject *self, PyObject *Py_UNUSED(ignored))
     321  {
     322      PyObject *return_value = NULL;
     323      Py_ssize_t _return_value;
     324  
     325      _return_value = _queue_SimpleQueue_qsize_impl(self);
     326      if ((_return_value == -1) && PyErr_Occurred()) {
     327          goto exit;
     328      }
     329      return_value = PyLong_FromSsize_t(_return_value);
     330  
     331  exit:
     332      return return_value;
     333  }
     334  /*[clinic end generated code: output=9a72a8d1b5767f6a input=a9049054013a1b77]*/