- File:
-
- 1 edited
-
libcfa/src/concurrency/clib/cfathread.cfa (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/clib/cfathread.cfa
ra1538cd r45444c3 14 14 // 15 15 16 #include "fstream.hfa"17 #include "locks.hfa"18 16 #include "kernel.hfa" 19 17 #include "thread.hfa" 20 #include "time.hfa"21 18 22 #include "cfathread.h" 19 thread CRunner { 20 void (*themain)( CRunner * ); 21 }; 23 22 24 struct cfathread_object { 25 $thread self; 26 void * (*themain)( void * ); 27 void * arg; 28 void * ret; 29 }; 30 void main(cfathread_object & this); 31 void ^?{}(cfathread_object & mutex this); 32 33 static inline $thread * get_thread( cfathread_object & this ) { return &this.self; } 34 35 typedef ThreadCancelled(cfathread_object) cfathread_exception; 36 typedef ThreadCancelled_vtable(cfathread_object) cfathread_vtable; 37 38 void defaultResumptionHandler(ThreadCancelled(cfathread_object) & except) { 39 abort | "A thread was cancelled"; 23 static void ?{}( CRunner & this, void (*themain)( CRunner * ) ) { 24 this.themain = themain; 40 25 } 41 26 42 cfathread_vtable _cfathread_vtable_instance; 43 44 cfathread_vtable const & get_exception_vtable(cfathread_exception *) { 45 return _cfathread_vtable_instance; 46 } 47 48 static void ?{}( cfathread_object & this, cluster & cl, void *(*themain)( void * ), void * arg ) { 49 this.themain = themain; 50 this.arg = arg; 51 ((thread&)this){"C-thread", cl}; 52 __thrd_start(this, main); 53 } 54 55 void ^?{}(cfathread_object & mutex this) { 56 ^(this.self){}; 57 } 58 59 void main( cfathread_object & this ) { 60 __attribute__((unused)) void * const thrd_obj = (void*)&this; 61 __attribute__((unused)) void * const thrd_hdl = (void*)active_thread(); 62 /* paranoid */ verify( thrd_obj == thrd_hdl ); 63 64 this.ret = this.themain( this.arg ); 27 void main( CRunner & this ) { 28 this.themain( &this ); 65 29 } 66 30 … … 69 33 70 34 extern "C" { 71 int cfathread_cluster_create(cfathread_cluster_t * cl) __attribute__((nonnull(1))) { 72 *cl = new(); 73 return 0; 35 //-------------------- 36 // Basic thread management 37 CRunner * cfathread_create( void (*main)( CRunner * ) ) { 38 return new( main ); 74 39 } 75 40 76 cfathread_cluster_t cfathread_cluster_self(void) { 77 return active_cluster(); 78 } 79 80 int cfathread_cluster_add_worker(cfathread_cluster_t cl, pthread_t* tid, void (*init_routine) (void *), void * arg) { 81 // processor * proc = new("C-processor", *cl, init_routine, arg); 82 processor * proc = alloc(); 83 (*proc){ "C-processor", *cl, init_routine, arg }; 84 if(tid) *tid = proc->kernel_thread; 85 return 0; 86 } 87 88 int cfathread_cluster_pause (cfathread_cluster_t) { 89 abort | "Pausing clusters is not supported"; 90 exit(1); 91 } 92 93 int cfathread_cluster_resume(cfathread_cluster_t) { 94 abort | "Resuming clusters is not supported"; 95 exit(1); 96 } 97 98 //-------------------- 99 // Thread attributes 100 int cfathread_attr_init(cfathread_attr_t *attr) __attribute__((nonnull (1))) { 101 attr->cl = active_cluster(); 102 return 0; 103 } 104 105 //-------------------- 106 // Thread 107 int cfathread_create( cfathread_t * handle, cfathread_attr_t * attr, void *(*main)( void * ), void * arg ) __attribute__((nonnull (1))) { 108 cluster * cl = attr ? attr->cl : active_cluster(); 109 cfathread_t thrd = alloc(); 110 (*thrd){ *cl, main, arg }; 111 *handle = thrd; 112 return 0; 113 } 114 115 int cfathread_join( cfathread_t thrd, void ** retval ) { 116 void * ret = join( *thrd ).ret; 41 void cfathread_join( CRunner * thrd ) { 117 42 delete( thrd ); 118 if(retval) {119 *retval = ret;120 }121 return 0;122 }123 124 cfathread_t cfathread_self(void) {125 return (cfathread_t)active_thread();126 }127 128 int cfathread_usleep(useconds_t usecs) {129 sleep(usecs`us);130 return 0;131 }132 133 int cfathread_sleep(unsigned int secs) {134 sleep(secs`s);135 return 0;136 43 } 137 44 … … 140 47 } 141 48 142 void cfathread_unpark( cfathread_tthrd ) {49 void cfathread_unpark( CRunner * thrd ) { 143 50 unpark( *thrd ); 144 51 } … … 148 55 } 149 56 150 typedef struct cfathread_mutex * cfathread_mutex_t; 57 //-------------------- 58 // Basic kernel features 59 void cfathread_setproccnt( int ncnt ) { 60 assert( ncnt >= 1 ); 61 adelete( procs ); 151 62 152 //-------------------- 153 // Mutex 154 struct cfathread_mutex { 155 single_acquisition_lock impl; 156 }; 157 int cfathread_mutex_init(cfathread_mutex_t *restrict mut, const cfathread_mutexattr_t *restrict) __attribute__((nonnull (1))) { *mut = new(); return 0; } 158 int cfathread_mutex_destroy(cfathread_mutex_t *mut) __attribute__((nonnull (1))) { delete( *mut ); return 0; } 159 int cfathread_mutex_lock (cfathread_mutex_t *mut) __attribute__((nonnull (1))) { lock ( (*mut)->impl ); return 0; } 160 int cfathread_mutex_trylock(cfathread_mutex_t *mut) __attribute__((nonnull (1))) { try_lock( (*mut)->impl ); return 0; } 161 int cfathread_mutex_unlock (cfathread_mutex_t *mut) __attribute__((nonnull (1))) { unlock ( (*mut)->impl ); return 0; } 162 163 //-------------------- 164 // Condition 165 struct cfathread_condition { 166 condition_variable(single_acquisition_lock) impl; 167 }; 168 int cfathread_cond_init(cfathread_cond_t *restrict cond, const cfathread_condattr_t *restrict) __attribute__((nonnull (1))) { *cond = new(); return 0; } 169 int cfathread_cond_signal(cfathread_cond_t *cond) __attribute__((nonnull (1))) { notify_one( (*cond)->impl ); return 0; } 170 int cfathread_cond_wait(cfathread_cond_t *restrict cond, cfathread_mutex_t *restrict mut) __attribute__((nonnull (1,2))) { wait( (*cond)->impl, (*mut)->impl ); return 0; } 171 int cfathread_cond_timedwait(cfathread_cond_t *restrict cond, cfathread_mutex_t *restrict mut, const struct timespec *restrict abstime) __attribute__((nonnull (1,2,3))) { 172 Time t = { *abstime }; 173 if( wait( (*cond)->impl, (*mut)->impl, t ) ) { 174 return 0; 175 } 176 errno = ETIMEDOUT; 177 return ETIMEDOUT; 63 proc_cnt = ncnt - 1; 64 procs = anew(proc_cnt); 178 65 } 179 66 } 180 181 #include <iofwd.hfa>182 183 extern "C" {184 #include <unistd.h>185 #include <sys/types.h>186 #include <sys/socket.h>187 188 //--------------------189 // IO operations190 int cfathread_socket(int domain, int type, int protocol) {191 return socket(domain, type, protocol);192 }193 int cfathread_bind(int socket, const struct sockaddr *address, socklen_t address_len) {194 return bind(socket, address, address_len);195 }196 197 int cfathread_listen(int socket, int backlog) {198 return listen(socket, backlog);199 }200 201 int cfathread_accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len) {202 return cfa_accept4(socket, address, address_len, 0, CFA_IO_LAZY);203 }204 205 int cfathread_connect(int socket, const struct sockaddr *address, socklen_t address_len) {206 return cfa_connect(socket, address, address_len, CFA_IO_LAZY);207 }208 209 int cfathread_dup(int fildes) {210 return dup(fildes);211 }212 213 int cfathread_close(int fildes) {214 return cfa_close(fildes, CFA_IO_LAZY);215 }216 217 ssize_t cfathread_sendmsg(int socket, const struct msghdr *message, int flags) {218 return cfa_sendmsg(socket, message, flags, CFA_IO_LAZY);219 }220 221 ssize_t cfathread_write(int fildes, const void *buf, size_t nbyte) {222 return cfa_write(fildes, buf, nbyte, CFA_IO_LAZY);223 }224 225 ssize_t cfathread_recvfrom(int socket, void *restrict buffer, size_t length, int flags, struct sockaddr *restrict address, socklen_t *restrict address_len) {226 struct iovec iov;227 iov.iov_base = buffer;228 iov.iov_len = length;229 230 struct msghdr msg;231 msg.msg_name = address;232 msg.msg_namelen = address_len ? (socklen_t)*address_len : (socklen_t)0;233 msg.msg_iov = &iov;234 msg.msg_iovlen = 1;235 msg.msg_control = 0p;236 msg.msg_controllen = 0;237 238 ssize_t ret = cfa_recvmsg(socket, &msg, flags, CFA_IO_LAZY);239 240 if(address_len) *address_len = msg.msg_namelen;241 return ret;242 }243 244 ssize_t cfathread_read(int fildes, void *buf, size_t nbyte) {245 return cfa_read(fildes, buf, nbyte, CFA_IO_LAZY);246 }247 248 void cfathread_suspendFD(int) {249 abort | "Suspending File Descriptors is not supported";250 }251 252 void cfathread_resumeFD (int) {253 abort | "Resuming File Descriptors is not supported";254 }255 256 }
Note:
See TracChangeset
for help on using the changeset viewer.