Skip to content

Commit eb72e3b

Browse files
hreineckeigaw
authored andcommitted
python: support 'with' statement for objects
The python 'with' statement allows for correct resource tracking, where the allocated resource will be freed at the end of the statement. This is helpful for 'host', 'subsystem', and 'controller' objects which we might want to clean up (and clear out the internal tree). The nice thing here is that we can do an automatic controller disconnect, and don't have to worry about leaving stale connections or objects around. Signed-off-by: Hannes Reinecke <[email protected]>
1 parent 2c90d97 commit eb72e3b

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

libnvme/nvme.i

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,12 @@ struct nvme_ns {
496496
~nvme_root() {
497497
nvme_free_tree($self);
498498
}
499+
struct nvme_root* __enter__() {
500+
return $self;
501+
}
502+
struct nvme_root* __exit__(PyObject *type, PyObject *value, PyObject *traceback) {
503+
return $self;
504+
}
499505
void log_level(const char *level) {
500506
int log_level = DEFAULT_LOGLEVEL;
501507
if (!strcmp(level, "debug")) log_level = LOG_DEBUG;
@@ -559,6 +565,12 @@ struct nvme_ns {
559565
~nvme_host() {
560566
nvme_free_host($self);
561567
}
568+
struct nvme_host* __enter__() {
569+
return $self;
570+
}
571+
struct nvme_host* __exit__(PyObject *type, PyObject *value, PyObject *traceback) {
572+
return $self;
573+
}
562574
%feature("autodoc", SET_SYMNAME_DOCSTRING) set_symname;
563575
void set_symname(const char *hostsymname) {
564576
nvme_host_set_hostsymname($self, hostsymname);
@@ -599,6 +611,12 @@ struct nvme_ns {
599611
~nvme_subsystem() {
600612
nvme_free_subsystem($self);
601613
}
614+
struct nvme_subsystem* __enter__() {
615+
return $self;
616+
}
617+
struct nvme_subsystem* __exit__(PyObject *type, PyObject *value, PyObject *traceback) {
618+
return $self;
619+
}
602620
PyObject *__str__() {
603621
return PyUnicode_FromFormat("nvme.subsystem(%s,%s)", STR_OR_NONE($self->name), STR_OR_NONE($self->subsysnqn));
604622
}
@@ -664,6 +682,14 @@ struct nvme_ns {
664682
~nvme_ctrl() {
665683
nvme_free_ctrl($self);
666684
}
685+
struct nvme_ctrl* __enter__() {
686+
return $self;
687+
}
688+
struct nvme_ctrl* __exit__(PyObject *type, PyObject *value, PyObject *traceback) {
689+
if (nvme_ctrl_get_name($self))
690+
nvme_disconnect_ctrl($self);
691+
return $self;
692+
}
667693

668694
%pythoncode %{
669695
def discovery_ctrl_set(self, discovery: bool):
@@ -962,6 +988,12 @@ struct nvme_ns {
962988
~nvme_ns() {
963989
nvme_free_ns($self);
964990
}
991+
struct nvme_ns* __enter__() {
992+
return $self;
993+
}
994+
struct nvme_ns* __exit__(PyObject *type, PyObject *value, PyObject *traceback) {
995+
return $self;
996+
}
965997
PyObject *__str__() {
966998
return PyUnicode_FromFormat("nvme.ns(%u)", $self->nsid);
967999
}

0 commit comments

Comments
 (0)