---
name: "ck_swlock"
section: "3"
platform: "linux"
package: "libck-dev"
version: "0.7.2-6"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/ck_swlock"
---

# ck\_swlock(3)

centralized copy-safe write-biased single-writer read-write locks

## NAME

**ck\_swlock\_init**, **ck\_swlock\_write\_latch**, **ck\_swlock\_write\_unlatch**, **ck\_swlock\_write\_lock**, **ck\_swlock\_write\_unlock**, **ck\_swlock\_write\_trylock**, **ck\_swlock\_write\_downgrade**, **ck\_swlock\_locked\_writer**, **ck\_swlock\_read\_lock**, **ck\_swlock\_read\_trylock**, **ck\_swlock\_read\_unlock**, **ck\_swlock\_locked\_reader** – centralized copy-safe write-biased single-writer read-write locks

## LIBRARY

Concurrency Kit (libck, -lck)

## SYNOPSIS

**#include \<ck\_swlock.h\>**

ck\_swlock\_t lock = CK\_SWLOCK\_INITIALIZER;

*void*\

**ck\_swlock\_init**(*ck\_swlock\_t \*lock*);

*void*\

**ck\_swlock\_write\_lock**(*ck\_swlock\_t \*lock*);

*void*\

**ck\_swlock\_write\_unlock**(*ck\_swlock\_t \*lock*);

*void*\

**ck\_swlatch\_write\_latch**(*ck\_swlatch\_t \*latch*);

*void*\

**ck\_swlatch\_write\_unlatch**(*ck\_swlatch\_t \*latch*);

*bool*\

**ck\_swlock\_write\_trylock**(*ck\_swlock\_t \*lock*);

*bool*\

**ck\_swlock\_write\_downgrade**(*ck\_swlock\_t \*lock*);

*bool*\

**ck\_swlock\_locked\_writer**(*ck\_swlock\_t \*lock*);

*void*\

**ck\_swlock\_read\_lock**(*ck\_swlock\_t \*lock*);

*bool*\

**ck\_swlock\_read\_trylock**(*ck\_swlock\_t \*lock*);

*void*\

**ck\_swlock\_read\_unlock**(*ck\_swlock\_t \*lock*);

*bool*\

**ck\_swlock\_locked\_reader**(*ck\_swlock\_t \*lock*);

## DESCRIPTION

This is a centralized write-biased single-writer reader-writer lock. It requires half the space that ck\_rwlock does and has a low latency fast path. The lock supports latch and unlatch operations that allow it to be used in a copy-safe manner (reader-bits may be over-written safely).

## EXAMPLE

```
#include <ck_swlock.h>
static ck_swlock_t lock = CK_SWLOCK_INITIALIZER;
static void
reader(void)
{
	for (;;) {
		ck_swlock_read_lock(&lock);
		/* Read-side critical section. */
		ck_swlock_read_unlock(&lock);
		if (ck_swlock_read_trylock(&lock) == true) {
			/* Read-side critical section. */
			ck_swlock_read_unlock(&lock);
		}
	}
	return;
}
static void
writer(void)
{
	ck_swlock_t contrived;
	for (;;) {
		ck_swlock_write_lock(&lock);
		/* Write-side critical section. */
		ck_swlock_write_unlock(&lock);
		if (ck_swlock_write_trylock(&lock) == true) {
			/* Write-side critical section. */
			ck_swlock_write_unlock(&lock);
		}
		ck_swlock_write_latch(&lock);
		/* Write-side critical section. */
		/* This is safe to do with-in a latch. */
		contrived = lock;
		lock = contrived;
		ck_swlock_write_unlatch(&lock);
	}
	return;
}
```

## SEE ALSO

[ck\_brlock(3)](/ck_brlock/3.md), [ck\_elide(3)](/ck_elide/3.md), [ck\_pflock(3)](/ck_pflock/3.md), [ck\_rwlock(3)](/ck_rwlock/3.md), [ck\_tflock(3)](/ck_tflock/3.md)

Additional information available at http://concurrencykit.org/
