---
name: "ggiResourceRelease"
section: "3ggi"
platform: "linux"
package: "libggi2-dev"
version: "1:2.0.1-2"
release: "Debian 3.0 (Woody)"
platforms: ["linux"]
url: "https://new.carta.tech/ggiResourceAcquire/3ggi"
---

# ggiResourceRelease(3ggi)

Acquire and release a LibGGI resource

Part of [ggiResourceAcquire(3ggi)](/ggiResourceAcquire/3ggi.md).

## NAME

ggiResourceAcquire, ggiResourceRelease, ggiResourceMustAcquire - Acquire and release a LibGGI resource

## SYNOPSIS

**#include \<ggi/ggi.h\>**

**int ggiResourceAcquire(ggi\_resource\_t** *res***, uint32** *actype***);**

**int ggiResourceRelease(ggi\_resource\_t** *res***);**

**int ggiResourceMustAcquire(ggi\_resource\_t** *res***);** .SH "DESCRIPTION"

**ggiResourceAcquire** acquires (locks) a LibGGI resource, typically a DirectBuffer (see examples below). The *actype* indicates the desired access type for the operation. The following flags may be bitwise-or'ed together:

- **GGI\_ACTYPE\_READ**

  read access to the resource

- **GGI\_ACTYPE\_WRITE**

  write access to the resource

**ggiResourceRelease** releases (unlocks) an already-acquired resource.

**ggiResourceMustAcquire** determines whether or not the specified resource needs to be acquired before using.

## RETURN VALUE

**ggiResourceAcquire** and **ggiResourceRelease** return 0 on success, \<0 on failure.

**ggiResourceMustAcquire** is simply a macro that returns true if the resource must be explicitly acquired and released, or false if not. However, it is still safe to call **ggiResourceAcquire** or **ggiResourceRelease** even in the latter case -- it would be a no-op.

## EXAMPLES

### USING DIRECTBUFFERS

```
const ggi_directbuffer *dbuf;
/* Acquire DirectBuffer before we use it. */
if (ggiResourceAcquire(dbuf->resource, GGI_ACTYPE_WRITE) != 0) {
	fail("Error acquiring DirectBuffer\n");
}
/* Do framebuffer rendering here... */
/* Release DirectBuffer when done with it. */
ggiResourceRelease(dbuf->resource);

```
