Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (3)
......@@ -481,6 +481,86 @@ VLC_API int vlc_sem_timedwait(vlc_sem_t *sem, vlc_tick_t deadline) VLC_USED;
/** @} */
#ifndef __cplusplus
/**
* \defgroup latch Latches
*
* The latch is a downward counter used to synchronise threads.
*
* @{
*/
/**
* Latch.
*
* Storage space for a thread-safe latch.
*/
typedef struct
{
atomic_size_t value;
atomic_uint ready;
} vlc_latch_t;
/**
* Initializes a latch.
*
* @param value initial latch value (typically 1)
*/
VLC_API void vlc_latch_init(vlc_latch_t *, size_t value);
/**
* Decrements the value of a latch.
*
* This function atomically decrements the value of a latch by the given
* quantity. If the result is zero, then any thread waiting on the latch is
* woken up.
*
* \warning If the result is (arithmetically) strictly negative, the behaviour
* is undefined.
*
* \param n quantity to subtract from the latch value (typically 1)
*
* \note This function is not a cancellation point.
*/
VLC_API void vlc_latch_count_down(vlc_latch_t *, size_t n);
/**
* Decrements the value of a latch and waits on it.
*
* This function atomically decrements the value of a latch by the given
* quantity. Then, if the result of the subtraction is strictly positive,
* it waits until the value reaches zero.
*
* This function is equivalent to the succession of vlc_latch_count_down()
* then vlc_latch_wait(), and is only an optimisation to combine the two.
*
* \warning If the result is strictly negative, the behaviour is undefined.
*
* @param n number of times to decrement the value (typically 1)
*
* \note This function may be a cancellation point.
*/
VLC_API void vlc_latch_count_down_and_wait(vlc_latch_t *, size_t n);
/**
* Checks if a latch is ready.
*
* This function compares the value of a latch with zero.
*
* \retval false if the latch value is non-zero
* \retval true if the latch value equals zero
*/
VLC_API bool vlc_latch_is_ready(const vlc_latch_t *latch) VLC_USED;
/**
* Waits on a latch.
*
* This function waits until the value of the latch reaches zero.
*
* \note This function may be a point of cancellation.
*/
VLC_API void vlc_latch_wait(vlc_latch_t *);
/** @} */
/**
* One-time initialization.
*
......
......@@ -586,6 +586,12 @@ vlc_keystore_find
vlc_keystore_remove
vlc_keystore_store
vlc_keystore_release_entries
vlc_latch_init
vlc_latch_is_ready
vlc_latch_count_down
vlc_latch_count_down_and_wait
vlc_latch_is_ready
vlc_latch_wait
vlc_ml_instance_get
vlc_ml_get
vlc_ml_control
......
......@@ -402,6 +402,67 @@ int vlc_sem_trywait(vlc_sem_t *sem)
return 0;
}
enum { VLC_LATCH_READY, VLC_LATCH_CONTEND, VLC_LATCH_PENDING };
void vlc_latch_init(vlc_latch_t *latch, size_t value)
{
atomic_init(&latch->ready, value ? VLC_LATCH_PENDING : VLC_LATCH_READY);
atomic_init(&latch->value, value);
}
static bool vlc_latch_count_down_ready(vlc_latch_t *latch, size_t n)
{
size_t value;
value = atomic_fetch_sub_explicit(&latch->value, n, memory_order_acq_rel);
assert(value >= n);
if (value != n)
return false;
if (atomic_exchange_explicit(&latch->ready, VLC_LATCH_READY,
memory_order_release) == VLC_LATCH_CONTEND)
vlc_atomic_notify_all(&latch->ready);
return true;
}
void vlc_latch_count_down(vlc_latch_t *latch, size_t n)
{
(void) vlc_latch_count_down_ready(latch, n);
}
void vlc_latch_count_down_and_wait(vlc_latch_t *latch, size_t n)
{
if (!vlc_latch_count_down_ready(latch, n))
vlc_latch_wait(latch);
}
bool vlc_latch_is_ready(const vlc_latch_t *latch)
{
return atomic_load_explicit(&latch->ready,
memory_order_acquire) == VLC_LATCH_READY;
}
void vlc_latch_wait(vlc_latch_t *latch)
{
unsigned int expected = VLC_LATCH_PENDING;
if (!atomic_compare_exchange_strong_explicit(&latch->ready, &expected,
VLC_LATCH_CONTEND,
memory_order_acquire,
memory_order_acquire)) {
if (expected == VLC_LATCH_READY)
return;
assert(expected == VLC_LATCH_CONTEND);
}
do
vlc_atomic_wait(&latch->ready, VLC_LATCH_CONTEND);
while (!vlc_latch_is_ready(latch));
}
enum { VLC_ONCE_UNDONE, VLC_ONCE_DOING, VLC_ONCE_CONTEND, VLC_ONCE_DONE };
static_assert (VLC_ONCE_DONE == 3, "Check vlc_once in header file");
......
......@@ -284,6 +284,44 @@ static void test__cond_wait_timeout()
TEST_THREAD_JOIN_MAGIC(th);
}
/*
* Test latch synchronisation
*/
static void *thread_latch(void *data)
{
vlc_latch_t *l = data;
assert(!vlc_latch_is_ready(l));
vlc_latch_count_down(l, 1);
vlc_latch_wait(l);
assert(vlc_latch_is_ready(l));
return NULL;
}
static void test__latch(void)
{
vlc_latch_t l;
vlc_thread_t th;
vlc_latch_init(&l, 0);
assert(vlc_latch_is_ready(&l));
vlc_latch_wait(&l);
assert(vlc_latch_is_ready(&l));
vlc_latch_init(&l, 5);
assert(!vlc_latch_is_ready(&l));
vlc_latch_count_down(&l, 3);
assert(!vlc_latch_is_ready(&l));
vlc_latch_count_down_and_wait(&l, 2);
assert(vlc_latch_is_ready(&l));
vlc_latch_wait(&l);
assert(vlc_latch_is_ready(&l));
vlc_latch_init(&l, 2);
TEST_THREAD_CLONE(&th, thread_latch, &l);
vlc_latch_count_down_and_wait(&l, 1);
TEST_THREAD_JOIN(th, NULL);
}
/*
* Test cancelling vlc_tick_sleep
......@@ -330,6 +368,7 @@ int main(void)
test__cond_wait();
test__cond_wait_timeout();
test__cond_broadcast();
test__latch();
test__vlc_tick_sleep_cancelation();
test__vlc_tick_sleep();
......