// // Copyright 2021 Staysail Systems, Inc. // Copyright 2018 Capitar IT Group BV // // This software is supplied under the terms of the MIT License, a // copy of which should be located in the distribution where this // file was obtained (LICENSE.txt). A copy of the license may also be // found online at https://opensource.org/licenses/MIT. // #include #include #include "core/nng_impl.h" #include "nng/supplemental/util/platform.h" nng_time nng_clock(void) { (void) nni_init(); return (nni_clock()); } // Sleep for specified msecs. void nng_msleep(nng_duration dur) { (void) nni_init(); nni_msleep(dur); } // Create and start a thread. Note that on some platforms, this might // actually be a coroutine, with limitations about what system APIs // you can call. Therefore, these threads should only be used with the // I/O APIs provided by nng. The thread runs until completion. int nng_thread_create(nng_thread **thrp, void (*func)(void *), void *arg) { nni_thr *thr; int rv; (void) nni_init(); if ((thr = NNI_ALLOC_STRUCT(thr)) == NULL) { return (NNG_ENOMEM); } *thrp = (void *) thr; if ((rv = nni_thr_init(thr, func, arg)) != 0) { return (rv); } nni_thr_run(thr); return (0); } void nng_thread_set_name(nng_thread *thr, const char *name) { nni_thr_set_name((void *)thr, name); } // Destroy a thread (waiting for it to complete.) When this function // returns all resources for the thread are cleaned up. void nng_thread_destroy(nng_thread *thr) { nni_thr *t = (void *) thr; nni_thr_fini(t); NNI_FREE_STRUCT(t); } struct nng_mtx { nni_mtx m; }; int nng_mtx_alloc(nng_mtx **mpp) { nng_mtx *mp; (void) nni_init(); if ((mp = NNI_ALLOC_STRUCT(mp)) == NULL) { return (NNG_ENOMEM); } nni_mtx_init(&mp->m); *mpp = mp; return (0); } void nng_mtx_free(nng_mtx *mp) { if (mp != NULL) { nni_mtx_fini(&mp->m); NNI_FREE_STRUCT(mp); } } void nng_mtx_lock(nng_mtx *mp) { nni_mtx_lock(&mp->m); } void nng_mtx_unlock(nng_mtx *mp) { nni_mtx_unlock(&mp->m); } struct nng_cv { nni_cv c; }; int nng_cv_alloc(nng_cv **cvp, nng_mtx *mx) { nng_cv *cv; if ((cv = NNI_ALLOC_STRUCT(cv)) == NULL) { return (NNG_ENOMEM); } nni_cv_init(&cv->c, &mx->m); *cvp = cv; return (0); } void nng_cv_free(nng_cv *cv) { if (cv != NULL) { nni_cv_fini(&cv->c); NNI_FREE_STRUCT(cv); } } void nng_cv_wait(nng_cv *cv) { nni_cv_wait(&cv->c); } int nng_cv_until(nng_cv *cv, nng_time when) { return (nni_cv_until(&cv->c, (nni_time) when)); } void nng_cv_wake(nng_cv *cv) { nni_cv_wake(&cv->c); } void nng_cv_wake1(nng_cv *cv) { nni_cv_wake1(&cv->c); } uint32_t nng_random(void) { (void) nni_init(); return (nni_random()); }