GRUPO DE LLAMADAS DOSxxx (4)
(Gestión de memoria)


DosAllocMem

DosAllocMem reserva y asigna un bloque de memoria privada en el espacio de direcciones de la aplicación.

#define INCL_BASE
#include <os2.h>

PPVOID pBaseAddress;
ULONG ulObjectSize;
ULONG ulAllocationFlags;
APIRET rc; /* Codigo de error */

rc = DosAllocMem(pBaseAddress, ulObjectSize, ulAllocationFlags);

Parámetros

pBaseAddressUn puntero a una variable donde OS/2 devolverá un puntero a la dirección base del bloque de memoria asignado.
ulObjectSizeUn valor especificando el tamaño deseado (en bytes) del bloque de memoria. Este será redondeado por OS/2 al siguiente multiplo entero de páginas (de 4 kilobytes cada una).
ulAllocationFlagsUn conjunto de flags que describen los atributos del bloque de memoria, así como los modos de acceso.
Atributos de posición
  • Si el bit PAG_COMMIT (0x00000010) está activo, el bloque de memoria es anotado pero no se reserva físicamente el bloque hasta que se produzca un acceso de lectura o de escritura en él.
  • Si el bit OBJ_TILE (0x00000040) está activo, el bloque de memoria será situado en los primeros 512 megabytes del espacio virtual de direcciones, con selectores de 16 bits. Estos bloques pueden ser usados para intercambiar datos con rutinas de 16 bits escritas para OS/2 1.x.

Atributos de protección

  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error

0Sin error
8No hay suficiente memoria
87Parámetro no valido
95Interrupción


DosAllocSharedMem

DosAllocSharedMem reserva y asigna un bloque de memoria compartida, que puede ser leido por varios procesos distintos.

#define INCL_BASE
#include <os2.h>

PPVOID pBaseAddress;
PSZ pszName;
ULONG ulObjectSize;
ULONG ulFlags;
APIRET rc; /* Codigo de error */

rc = DosAllocSharedMem(pBaseAddress, pszName, ulObjectSize, ulFlags);

Parámetros

pBaseAddressUn puntero a una variable donde OS/2 devolverá un puntero a la dirección base del bloque de memoria asignado.
pszNameUn puntero opcional a una cadena asociada al bloque compartido. El nombre es una cadena ASCIIZ, en el formato de nombre de fichero de OS/2, en el directorio \SHAREMEM\; por ejemplo, \SHAREMEM\PUBLICO.DAT. Si no se indica ningún nombre (pszName=NULL), el bloque puede ser declarado giveable o getable para su compartición a traves de las funciones DosGetSharedMem o DosGiveSharedMem.
ulObjectSizeUn valor especificando el tamaño deseado (en bytes) del bloque de memoria. Este será redondeado por OS/2 al siguiente multiplo entero de páginas (de 4 kilobytes cada una).
ulAllocationFlagsUn conjunto de flags que describen los atributos del bloque de memoria, así como los modos de acceso.
Atributos de posición
  • Si el bit PAG_COMMIT (0x00000010) está activo, el bloque de memoria es anotado pero no se reserva físicamente el bloque hasta que se produzca un acceso de lectura o de escritura en él.
  • Si el bit OBJ_GIVEABLE (0x00000200) está activo, el acceso al bloque de memoria puede ser dado a otro proceso con la función DosGiveSharedMem.
  • Si el bit OBJ_GETTABLE (0x00000100) está activo, el bloque de memoria puede ser accedido por otro proceso que conozca la dirección base del bloque, a través de la función DosGetSharedMem.
  • Si el bit OBJ_TILE (0x00000040) está activo, el bloque de memoria será situado en los primeros 512 megabytes del espacio virtual de direcciones, con selectores de 16 bits. Estos bloques pueden ser usados para intercambiar datos con rutinas de 16 bits escritas para OS/2 1.x.

Atributos de protección

  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error

0Sin error
8No hay suficiente memoria
87Parámetro no valido
95Interrupción
123Nombre no válido
183Ya existe


DosFreeMem

DosFreeMem libera un bloque de memoria reservado por DosAllocMem o DosAllocSharedMem. En éste último caso, se decrementa el contador de accesos al bloque. Cuando éste ha llegado a cero, es que todos los procesos han liberado el bloque, momento en que la eliminación fisica se hace efectiva.

#define INCL_BASE
#include <os2.h>

PVOID pBaseAddress;
APIRET rc; /* Codigo de error */

rc = DosFreeMem(pBaseAddress);

Parámetros

pBaseAddressLa dirección base del bloque de memoria a liberar, obtenida con DosAllocMem o con DosAllocSharedMem.

Codigos de error

0Sin error
5Acceso denegado
95Interrupción
487Dirección no válida


DosGetNamedSharedMem

DosGetNamedSharedMem da acceso a un bloque de memoria compartido creado por otro proceso. Se usa sólo con bloques que tienen nombre.

#define INCL_BASE
#include <os2.h>

PPVOID pBaseAddress;
PSZ pszSharedMemName;
ULONG ulAttributeFlags;
APIRET rc; /* Codigo de error */

rc = DosGetNamedSharedMem(pBaseAddress, pszSharedMemName, ulAttributeFlags);

Parámetros

pBaseAddressPuntero a una dirección donde OS/2 almacenará un puntero al inicio del bloque de memoria compartido.
pszSharedMemNameUn puntero a una cadena ASCIIZ conteniendo el nombre del bloque de memoria que el otro proceso usó al crearlo. Debe incluir el nombre \SHAREMEM\ antes. Por ejemplo, \SHAREMEM\PUBLICO.DAT.
ulAllocationFlagsUn conjunto de flags que describen los modos de acceso al bloque de memoria.
Atributos de protección
  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error

0Sin error
2Fichero no encontrado
8No hay suficiente memoria
87Parámetro no valido
95Interrupción
123Nombre no válido
212Bloqueado


DosGetSharedMem

DosGetSharedMem da acceso a un bloque de memoria compartido creado por otro proceso. Es necesario conocer el puntero base de dicho bloque de memoria, el cual puede ser obtenido a través de sistemas de comunicación interproceso.

#define INCL_BASE
#include <os2.h>

PVOID pBaseAddress;
ULONG ulAttributeFlags;
APIRET rc; /* Codigo de error */

rc = DosGetSharedMem(pBaseAddress, ulAttributeFlags);

Parámetros

pBaseAddressPuntero al inicio del bloque de memoria compartido al que se quiere obtener acceso. Este puntero puede ser obtenido a través de los sistemas de comunicación interproceso.Además, dicho bloque debe ser gettable (esto es, haber sido creado con el atributo OBJ_GETTABLE).
ulAllocationFlagsUn conjunto de flags que describen los modos de acceso al bloque de memoria.
Atributos de protección
  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error

0Sin error
5Acceso denegado
8No hay suficiente memoria
87Parámetro no valido
95Interrupción
212Bloqueado


DosGiveSharedMem

DosGiveSharedMem da acceso a un bloque de memoria compartido del proceso actual a otro proceso. Es similar a DosGetSharedMem, y también es necesario que los procesos intercambien el puntero al inicio del bloque por medio de los sistemas de comunicación interproceso.

#define INCL_BASE
#include <os2.h>

PVOID pBaseAddress;
PID idProccessID;
ULONG ulAttributeFlags;
APIRET rc; /* Codigo de error */

rc = DosGiveSharedMem(pBaseAddress, idProccessID, ulAttributeFlags);

Parámetros

pBaseAddressPuntero al inicio del bloque de memoria compartido al que se quiere dar acceso a otro proceso, tal y como lo devuelve DosAllocSharedMem. Además, dicho bloque debe ser giveable (esto es, haber sido creado con el atributo OBJ_GIVEABLE).
idProcessIDEl identificador (PID) del proceso que recibirá acceso al bloque de memoria.
ulAllocationFlagsUn conjunto de flags que describen los modos de acceso al bloque de memoria.
Atributos de protección
  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error

0Sin error
5Acceso denegado
8No hay suficiente memoria
87Parámetro no valido
95Interrupción
212Bloqueado
303PID no válido
487Dirección no válida


DosSubAllocMem

DosSubAllocMem asigna un subbloque de memoria en un bloque previamente inicializado por DosSubSetMem.

#define INCL_BASE
#include <os2.h>

PVOID pOffset;
PPVOID pBlockOffset;
ULONG ulSize;
APIRET rc; /* Codigo de error */

rc = DosSubAllocMem(pOffset, pBlockOffset, ulSize);

Parámetros

pOffsetPuntero al bloque de memoria en donde se va a asignar el subbloque.
pBlockOffsetPuntero a una zona de memoria donde OS/2 devolverá un puntero al inicio del subbloque.
ulSizeTamaño en bytes del subbloque que se quiere crear. Este valor será redondeado al múltiplo superior de 8 más cercano. El tamaño máximo es el del bloque inicializado con DosSubSetMem menos 64 bytes.

Codigos de error

0Sin error
87Parámetro no válido
311No hay suficiente memoria libre
532DosSub corrupto


DosSubFreeMem

DosSubFreeMem libera un subbloque de memoria previamente asignado con DosSubAllocMem.

#define INCL_BASE
#include <os2.h>

PVOID pOffset;
PVOID pBlockOffset;
ULONG ulSize;
APIRET rc; /* Codigo de error */

rc = DosSubFreeMem(pOffset, pBlockOffset, ulSize);

Parámetros

pOffsetPuntero al bloque de memoria en donde se encuentra el subbloque a liberar.
pBlockOffsetEl puntero del subbloque a liberar. Tiene que ser un valor entregado por DosSubAllocMem.
ulSizeTamaño en bytes del subbloque a liberar. Este valor será redondeado al múltiplo superior de 8 más cercano. El tamaño máximo es el del bloque inicializado con DosSubSetMem menos 64 bytes.

Codigos de error

0Sin error
87Parámetro no válido
312Superposición no válida en el bloque
532DosSub corrupto


DosSubSetMem

DosSubSetMem inicializa un bloque de memoria para subasignación, o incrementa el tamaño de un bloque previamente inicializado.

#define INCL_BASE
#include <os2.h>

PVOID pOffset;
ULONG ulFlags;
ULONG ulSize;
APIRET rc; /* Codigo de error */

rc = DosSubSetMem(pOffset, ulFlags, ulSize);

Parámetros

pOffsetPuntero al bloque de memoria que se quiere usar para subasignación.
ulFlagsFlags que describen las características del bloque de memoria que será subasignado.
Bit 0 DOSSUB_INIT: Si este bit está a 1, el bloque de memoria será inicializado para subasignación. Si es cero, se supone que el bloque ya está inicializado y se quiere obtener acceso a un bloque de memoria compartido.
Bit 1 DOSSUB_GROW: Si este bit está a 1, la petición es para incrementar el tamaño de un bloque ya inicializado. Si es cero, no indica nada.
Bit 2 DOSSUB_SPARSE_OBJ: Este bit debe estar a cero.
Bit 3 DOSSUB_SERIALIZE: Este bit está a 1 si se quiere un acceso serializado a la memoria. En una petición de aumento de tamaño, este valor tiene que ser el mismo que se dio en la creación, o si no OS/2 devolverá un error.
ulSizeEl tamaño en bytes del subbloque que se reservará para subasignación. Si no es un multiplo de 8 bytes, se redondeará por debajo a un múltiplo.

Codigos de error

0Sin error
87Parámetro no válido
310No se puede reducir un segmento subasignado


DosSubUnsetMem

DosSubUnsetMem libera un bloque de memoria destinado a subasignación. Es necesario hacerlo antes de liberar el bloque físico con DosFreeMem.

#define INCL_BASE
#include <os2.h>

PVOID pOffset;
APIRET rc; /* Codigo de error */

rc = DosSubUnsetMem(pOffset);

Parámetros

pOffsetUn puntero al bloque de memoria que se quiere liberar.

Codigos de error

0Sin error
532DosSub corrupto

 Indice