void vthread_wait(vthread_t threads[], int nbthreads) { int ret = 0; int i; for (i = 0; i < nbthreads; i++) { vthread_join(threads[i], NULL); } }
int main(int argc, char **argv) { #define NR_VTHS 5 struct vthread *vths[NR_VTHS]; void *retvals[NR_VTHS]; /* Tests multiple threads at once */ for (long i = 0; i < NR_VTHS; i++) vths[i] = vthread_create(&vm, thread_entry, (void*)i); for (long i = 0; i < NR_VTHS; i++) { vthread_join(vths[i], &retvals[i]); assert(retvals[i] == (void*)i); } /* Tests reuse / GPC leakage */ for (long i = 0; i < NR_VTHS * 2; i++) { vths[0] = vthread_create(&vm, thread_entry, (void*)i); vthread_join(vths[0], &retvals[0]); assert(retvals[0] == (void*)i); } assert(vm.nr_gpcs == NR_VTHS); return 0; }