Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  call_once.h

  Sprache: C
 

#ifndef _LINUX_CALL_ONCE_H
#define _LINUX_CALL_ONCE_H

#include <linux/types.h>
#include <linux/mutex.h>

#define ONCE_NOT_STARTED 0
#define ONCE_RUNNING     1
#define ONCE_COMPLETED   2

struct once {
        atomic_t state;
        struct mutex lock;
};

static inline void __once_init(struct once *once, const char *name,
          struct lock_class_key *key)
{
        atomic_set(&once->state, ONCE_NOT_STARTED);
        __mutex_init(&once->lock, name, key);
}

#define once_init(once)       \
do {         \
 static struct lock_class_key __key;    \
 __once_init((once), #once, &__key);    \
while (0)

/*
 * call_once - Ensure a function has been called exactly once
 *
 * @once: Tracking struct
 * @cb: Function to be called
 *
 * If @once has never completed successfully before, call @cb and, if
 * it returns a zero or positive value, mark @once as completed.  Return
 * the value returned by @cb
 *
 * If @once has completed succesfully before, return 0.
 *
 * The call to @cb is implicitly surrounded by a mutex, though for
 * efficiency the * function avoids taking it after the first call.
 */

static inline int call_once(struct once *once, int (*cb)(struct once *))
{
 int r, state;

 /* Pairs with atomic_set_release() below.  */
 if (atomic_read_acquire(&once->state) == ONCE_COMPLETED)
  return 0;

 guard(mutex)(&once->lock);
 state = atomic_read(&once->state);
 if (unlikely(state != ONCE_NOT_STARTED))
  return WARN_ON_ONCE(state != ONCE_COMPLETED) ? -EINVAL : 0;

 atomic_set(&once->state, ONCE_RUNNING);
 r = cb(once);
 if (r < 0)
  atomic_set(&once->state, ONCE_NOT_STARTED);
 else
  atomic_set_release(&once->state, ONCE_COMPLETED);
 return r;
}

#endif /* _LINUX_CALL_ONCE_H */

Messung V0.5 in Prozent
C=94 H=93 G=93

¤ Dauer der Verarbeitung: 0.18 Sekunden  (vorverarbeitet am  2026-06-07) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik