@@ -1117,6 +1117,47 @@ mmap_mmap_seek_impl(mmap_object *self, Py_ssize_t dist, int how)
11171117 return NULL ;
11181118}
11191119
1120+ /*[clinic input]
1121+ mmap.mmap.set_name
1122+
1123+ name: str
1124+ /
1125+
1126+ [clinic start generated code]*/
1127+
1128+ static PyObject *
1129+ mmap_mmap_set_name_impl (mmap_object * self , const char * name )
1130+ /*[clinic end generated code: output=1edaf4fd51277760 input=6c7dd91cad205f07]*/
1131+ {
1132+ #if defined(MAP_ANONYMOUS ) && defined(__linux__ )
1133+ const char * prefix = "cpython:mmap:" ;
1134+ if (strlen (name ) + strlen (prefix ) > 79 ) {
1135+ PyErr_SetString (PyExc_ValueError , "name is too long" );
1136+ return NULL ;
1137+ }
1138+ if (self -> flags & MAP_ANONYMOUS ) {
1139+ char buf [80 ];
1140+ sprintf (buf , "%s%s" , prefix , name );
1141+ if (_PyAnnotateMemoryMap (self -> data , self -> size , buf ) < 0 ) {
1142+ PyErr_SetFromErrno (PyExc_OSError );
1143+ return NULL ;
1144+ }
1145+ Py_RETURN_NONE ;
1146+ }
1147+ else {
1148+ /* cannot name non-anonymous mappings */
1149+ PyErr_SetString (PyExc_ValueError ,
1150+ "Cannot set annotation on non-anonymous mappings" );
1151+ return NULL ;
1152+ }
1153+ #else
1154+ /* naming not supported on this platform */
1155+ PyErr_SetString (PyExc_NotImplementedError ,
1156+ "Annotation of mmap is not supported on this platform" );
1157+ return NULL ;
1158+ #endif
1159+ }
1160+
11201161/*[clinic input]
11211162mmap.mmap.seekable
11221163
@@ -1397,6 +1438,7 @@ static struct PyMethodDef mmap_object_methods[] = {
13971438 MMAP_MMAP_RESIZE_METHODDEF
13981439 MMAP_MMAP_SEEK_METHODDEF
13991440 MMAP_MMAP_SEEKABLE_METHODDEF
1441+ MMAP_MMAP_SET_NAME_METHODDEF
14001442 MMAP_MMAP_SIZE_METHODDEF
14011443 MMAP_MMAP_TELL_METHODDEF
14021444 MMAP_MMAP_WRITE_METHODDEF
@@ -1952,7 +1994,11 @@ new_mmap_object(PyTypeObject *type, PyObject *args, PyObject *kwdict)
19521994 PyErr_SetFromErrno (PyExc_OSError );
19531995 return NULL ;
19541996 }
1955- _PyAnnotateMemoryMap (m_obj -> data , map_size , "cpython:mmap" );
1997+ #ifdef MAP_ANONYMOUS
1998+ if (m_obj -> flags & MAP_ANONYMOUS ) {
1999+ (void )_PyAnnotateMemoryMap (m_obj -> data , map_size , "cpython:mmap" );
2000+ }
2001+ #endif
19562002 m_obj -> access = (access_mode )access ;
19572003 return (PyObject * )m_obj ;
19582004}
0 commit comments