Changes in / [a3eeef45:6eb794a] in mainline
- Location:
- uspace
- Files:
-
- 4 deleted
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/init/init.c
ra3eeef45 r6eb794a 57 57 #define DEVFS_MOUNT_POINT "/dev" 58 58 59 #define SCRATCH_FS_TYPE "tmpfs"60 #define SCRATCH_MOUNT_POINT "/scratch"59 #define TMPFS_FS_TYPE "tmpfs" 60 #define TMPFS_MOUNT_POINT "/tmp" 61 61 62 62 #define DATA_FS_TYPE "fat" … … 235 235 } 236 236 237 static bool mount_ scratch(void)238 { 239 int rc = mount( SCRATCH_FS_TYPE, SCRATCH_MOUNT_POINT, "", "", 0);240 return mount_report(" Scratch filesystem", SCRATCH_MOUNT_POINT,241 SCRATCH_FS_TYPE, NULL, rc);237 static bool mount_tmpfs(void) 238 { 239 int rc = mount(TMPFS_FS_TYPE, TMPFS_MOUNT_POINT, "", "", 0); 240 return mount_report("Temporary filesystem", TMPFS_MOUNT_POINT, 241 TMPFS_FS_TYPE, NULL, rc); 242 242 } 243 243 … … 271 271 } 272 272 273 mount_ scratch();273 mount_tmpfs(); 274 274 275 275 spawn("/srv/fhc"); -
uspace/app/tester/Makefile
ra3eeef45 r6eb794a 47 47 vfs/vfs1.c \ 48 48 ipc/ping_pong.c \ 49 ipc/register.c \50 ipc/connect.c \51 49 loop/loop1.c \ 52 50 mm/malloc1.c \ -
uspace/app/tester/tester.c
ra3eeef45 r6eb794a 60 60 #include "vfs/vfs1.def" 61 61 #include "ipc/ping_pong.def" 62 #include "ipc/register.def"63 #include "ipc/connect.def"64 62 #include "loop/loop1.def" 65 63 #include "mm/malloc1.def" -
uspace/app/tester/tester.h
ra3eeef45 r6eb794a 77 77 extern const char *test_vfs1(void); 78 78 extern const char *test_ping_pong(void); 79 extern const char *test_register(void);80 extern const char *test_connect(void);81 79 extern const char *test_loop1(void); 82 80 extern const char *test_malloc1(void); -
uspace/app/tester/vfs/vfs1.c
ra3eeef45 r6eb794a 40 40 #include "../tester.h" 41 41 42 #define FS_TYPE "tmpfs" 43 #define MOUNT_POINT "/tmp" 44 #define OPTIONS "" 45 #define FLAGS 0 46 47 #define TEST_DIRECTORY MOUNT_POINT "/testdir" 42 #define TEST_DIRECTORY "/tmp/testdir" 48 43 #define TEST_FILE TEST_DIRECTORY "/testfile" 49 44 #define TEST_FILE2 TEST_DIRECTORY "/nextfile" … … 75 70 const char *test_vfs1(void) 76 71 { 77 if (mkdir(MOUNT_POINT, 0) != 0) 72 int rc; 73 if ((rc = mkdir(TEST_DIRECTORY, 0)) != 0) { 74 TPRINTF("rc=%d\n", rc); 78 75 return "mkdir() failed"; 79 TPRINTF("Created directory %s\n", MOUNT_POINT);80 81 int rc = mount(FS_TYPE, MOUNT_POINT, "", OPTIONS, FLAGS);82 switch (rc) {83 case EOK:84 TPRINTF("Mounted %s on %s\n", FS_TYPE, MOUNT_POINT);85 break;86 case EBUSY:87 TPRINTF("(INFO) Filesystem already mounted on %s\n", MOUNT_POINT);88 break;89 default:90 TPRINTF("(ERR) IPC returned errno %d (is tmpfs loaded?)\n", rc);91 return "mount() failed";92 76 } 93 94 if (mkdir(TEST_DIRECTORY, 0) != 0)95 return "mkdir() failed";96 77 TPRINTF("Created directory %s\n", TEST_DIRECTORY); 97 78 -
uspace/drv/ns8250/ns8250.c
ra3eeef45 r6eb794a 342 342 printf(NAME ": failed to connect to the parent driver of the " 343 343 "device %s.\n", dev->name); 344 ret = EPARTY; /* FIXME: use another EC */344 ret = dev->parent_phone; 345 345 goto failed; 346 346 } 347 347 348 348 /* Get hw resources. */ 349 if (!get_hw_resources(dev->parent_phone, &hw_resources)) { 349 ret = get_hw_resources(dev->parent_phone, &hw_resources); 350 if (ret != EOK) { 350 351 printf(NAME ": failed to get hw resources for the device " 351 352 "%s.\n", dev->name); 352 ret = EPARTY; /* FIXME: use another EC */353 353 goto failed; 354 354 } … … 374 374 printf(NAME ": i/o range assigned to the device " 375 375 "%s is too small.\n", dev->name); 376 ret = E PARTY; /* FIXME: use another EC */376 ret = ELIMIT; 377 377 goto failed; 378 378 } … … 390 390 printf(NAME ": missing hw resource(s) for the device %s.\n", 391 391 dev->name); 392 ret = E PARTY; /* FIXME: use another EC */392 ret = ENOENT; 393 393 goto failed; 394 394 } -
uspace/drv/pciintel/pci.c
ra3eeef45 r6eb794a 452 452 static int pci_add_device(device_t *dev) 453 453 { 454 int rc; 455 454 456 printf(NAME ": pci_add_device\n"); 455 457 … … 466 468 "parent's driver.\n"); 467 469 delete_pci_bus_data(bus_data); 468 return EPARTY; /* FIXME: use another EC */470 return dev->parent_phone; 469 471 } 470 472 471 473 hw_resource_list_t hw_resources; 472 474 473 if (!get_hw_resources(dev->parent_phone, &hw_resources)) { 475 rc = get_hw_resources(dev->parent_phone, &hw_resources); 476 if (rc != EOK) { 474 477 printf(NAME ": pci_add_device failed to get hw resources for " 475 478 "the device.\n"); 476 479 delete_pci_bus_data(bus_data); 477 480 ipc_hangup(dev->parent_phone); 478 return EPARTY; /* FIXME: use another EC */481 return rc; 479 482 } 480 483 -
uspace/lib/c/generic/async_rel.c
ra3eeef45 r6eb794a 239 239 */ 240 240 retry: 241 rel_phone = ipc_connect_me_to(key_phone, 0, 0, 0);241 rel_phone = async_connect_me_to(key_phone, 0, 0, 0); 242 242 if (rel_phone >= 0) { 243 243 /* success, do nothing */ -
uspace/lib/c/generic/device/hw_res.c
ra3eeef45 r6eb794a 38 38 #include <malloc.h> 39 39 40 boolget_hw_resources(int dev_phone, hw_resource_list_t *hw_resources)40 int get_hw_resources(int dev_phone, hw_resource_list_t *hw_resources) 41 41 { 42 42 sysarg_t count = 0; 43 43 int rc = async_req_1_1(dev_phone, DEV_IFACE_ID(HW_RES_DEV_IFACE), GET_RESOURCE_LIST, &count); 44 44 hw_resources->count = count; 45 if (EOK != rc) { 46 return false; 47 } 45 if (rc != EOK) 46 return rc; 48 47 49 48 size_t size = count * sizeof(hw_resource_t); 50 49 hw_resources->resources = (hw_resource_t *)malloc(size); 51 if (NULL == hw_resources->resources) { 52 return false; 53 } 50 if (!hw_resources->resources) 51 return ENOMEM; 54 52 55 53 rc = async_data_read_start(dev_phone, hw_resources->resources, size); 56 if ( EOK != rc) {54 if (rc != EOK) { 57 55 free(hw_resources->resources); 58 56 hw_resources->resources = NULL; 59 return false;57 return rc; 60 58 } 61 59 62 return true;60 return EOK; 63 61 } 64 62 -
uspace/lib/c/generic/devmap.c
ra3eeef45 r6eb794a 279 279 280 280 if (flags & IPC_FLAG_BLOCKING) { 281 phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAP,281 phone = async_connect_me_to_blocking(PHONE_NS, SERVICE_DEVMAP, 282 282 DEVMAP_CONNECT_TO_DEVICE, handle); 283 283 } else { 284 phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAP,284 phone = async_connect_me_to(PHONE_NS, SERVICE_DEVMAP, 285 285 DEVMAP_CONNECT_TO_DEVICE, handle); 286 286 } -
uspace/lib/c/generic/fibril_synch.c
ra3eeef45 r6eb794a 139 139 static void _fibril_mutex_unlock_unsafe(fibril_mutex_t *fm) 140 140 { 141 assert(fm->counter <= 0);142 141 if (fm->counter++ < 0) { 143 142 link_t *tmp; … … 165 164 void fibril_mutex_unlock(fibril_mutex_t *fm) 166 165 { 166 assert(fibril_mutex_is_locked(fm)); 167 167 futex_down(&async_futex); 168 168 _fibril_mutex_unlock_unsafe(fm); 169 169 futex_up(&async_futex); 170 } 171 172 bool fibril_mutex_is_locked(fibril_mutex_t *fm) 173 { 174 bool locked = false; 175 176 futex_down(&async_futex); 177 if (fm->counter <= 0) 178 locked = true; 179 futex_up(&async_futex); 180 181 return locked; 170 182 } 171 183 … … 230 242 { 231 243 futex_down(&async_futex); 232 assert(frw->readers || (frw->writers == 1));233 244 if (frw->readers) { 234 245 if (--frw->readers) { … … 296 307 void fibril_rwlock_read_unlock(fibril_rwlock_t *frw) 297 308 { 309 assert(fibril_rwlock_is_read_locked(frw)); 298 310 _fibril_rwlock_common_unlock(frw); 299 311 } … … 301 313 void fibril_rwlock_write_unlock(fibril_rwlock_t *frw) 302 314 { 315 assert(fibril_rwlock_is_write_locked(frw)); 303 316 _fibril_rwlock_common_unlock(frw); 317 } 318 319 bool fibril_rwlock_is_read_locked(fibril_rwlock_t *frw) 320 { 321 bool locked = false; 322 323 futex_down(&async_futex); 324 if (frw->readers) 325 locked = true; 326 futex_up(&async_futex); 327 328 return locked; 329 } 330 331 bool fibril_rwlock_is_write_locked(fibril_rwlock_t *frw) 332 { 333 bool locked = false; 334 335 futex_down(&async_futex); 336 if (frw->writers) { 337 assert(frw->writers == 1); 338 locked = true; 339 } 340 futex_up(&async_futex); 341 342 return locked; 343 } 344 345 bool fibril_rwlock_is_locked(fibril_rwlock_t *frw) 346 { 347 return fibril_rwlock_is_read_locked(frw) || 348 fibril_rwlock_is_write_locked(frw); 304 349 } 305 350 … … 314 359 { 315 360 awaiter_t wdata; 361 362 assert(fibril_mutex_is_locked(fm)); 316 363 317 364 if (timeout < 0) -
uspace/lib/c/include/device/hw_res.h
ra3eeef45 r6eb794a 95 95 96 96 97 bool get_hw_resources(int dev_phone, hw_resource_list_t *hw_resources); 98 99 bool enable_interrupt(int dev_phone); 97 extern int get_hw_resources(int, hw_resource_list_t *); 98 extern bool enable_interrupt(int); 100 99 101 100 -
uspace/lib/c/include/fibril_synch.h
ra3eeef45 r6eb794a 105 105 extern bool fibril_mutex_trylock(fibril_mutex_t *); 106 106 extern void fibril_mutex_unlock(fibril_mutex_t *); 107 extern bool fibril_mutex_is_locked(fibril_mutex_t *); 107 108 108 109 extern void fibril_rwlock_initialize(fibril_rwlock_t *); … … 111 112 extern void fibril_rwlock_read_unlock(fibril_rwlock_t *); 112 113 extern void fibril_rwlock_write_unlock(fibril_rwlock_t *); 114 extern bool fibril_rwlock_is_read_locked(fibril_rwlock_t *); 115 extern bool fibril_rwlock_is_write_locked(fibril_rwlock_t *); 116 extern bool fibril_rwlock_is_locked(fibril_rwlock_t *); 113 117 114 118 extern void fibril_condvar_initialize(fibril_condvar_t *); -
uspace/lib/packet/generic/packet_server.c
ra3eeef45 r6eb794a 135 135 /** Creates a new packet of dimensions at least as given. 136 136 * 137 * Should be used only when the global data are locked.138 *139 137 * @param[in] length The total length of the packet, including the header, 140 138 * the addresses and the data of the packet. … … 153 151 packet_t *packet; 154 152 int rc; 153 154 assert(fibril_mutex_is_locked(&ps_globals.lock)); 155 155 156 156 // already locked … … 233 233 /** Release the packet and returns it to the appropriate free packet queue. 234 234 * 235 * Should be used only when the global data are locked.236 *237 235 * @param[in] packet The packet to be released. 238 236 * … … 242 240 int index; 243 241 int result; 242 243 assert(fibril_mutex_is_locked(&ps_globals.lock)); 244 244 245 245 for (index = 0; (index < FREE_QUEUES_COUNT - 1) && -
uspace/srv/devman/devman.c
ra3eeef45 r6eb794a 384 384 printf(NAME ": create_root_node\n"); 385 385 386 fibril_rwlock_write_lock(&tree->rwlock); 386 387 node = create_dev_node(); 387 388 if (node != NULL) { … … 393 394 tree->root_node = node; 394 395 } 396 fibril_rwlock_write_unlock(&tree->rwlock); 395 397 396 398 return node != NULL; … … 455 457 /** Start a driver 456 458 * 457 * The driver's mutex is assumed to be locked.458 *459 459 * @param drv The driver's structure. 460 460 * @return True if the driver's task is successfully spawned, false … … 465 465 int rc; 466 466 467 assert(fibril_mutex_is_locked(&drv->driver_mutex)); 468 467 469 printf(NAME ": start_driver '%s'\n", drv->name); 468 470 … … 859 861 /** Find the device node structure of the device witch has the specified handle. 860 862 * 861 * Device tree's rwlock should be held at least for reading.862 *863 863 * @param tree The device tree where we look for the device node. 864 864 * @param handle The handle of the device. … … 868 868 { 869 869 unsigned long key = handle; 870 link_t *link = hash_table_find(&tree->devman_devices, &key); 870 link_t *link; 871 872 assert(fibril_rwlock_is_locked(&tree->rwlock)); 873 874 link = hash_table_find(&tree->devman_devices, &key); 871 875 return hash_table_get_instance(link, node_t, devman_link); 872 876 } … … 924 928 /** Insert new device into device tree. 925 929 * 926 * The device tree's rwlock should be already held exclusively when calling this927 * function.928 *929 930 * @param tree The device tree. 930 931 * @param node The newly added device node. … … 941 942 assert(tree != NULL); 942 943 assert(dev_name != NULL); 944 assert(fibril_rwlock_is_write_locked(&tree->rwlock)); 943 945 944 946 node->name = dev_name; -
uspace/srv/devmap/devmap.c
ra3eeef45 r6eb794a 46 46 #include <str.h> 47 47 #include <ipc/devmap.h> 48 #include <assert.h> 48 49 49 50 #define NAME "devmap" … … 208 209 } 209 210 210 /** Find namespace with given name. 211 * 212 * The devices_list_mutex should be already held when 213 * calling this function. 214 * 215 */ 211 /** Find namespace with given name. */ 216 212 static devmap_namespace_t *devmap_namespace_find_name(const char *name) 217 213 { 218 214 link_t *item; 215 216 assert(fibril_mutex_is_locked(&devices_list_mutex)); 217 219 218 for (item = namespaces_list.next; item != &namespaces_list; item = item->next) { 220 219 devmap_namespace_t *namespace = … … 229 228 /** Find namespace with given handle. 230 229 * 231 * The devices_list_mutex should be already held when232 * calling this function.233 *234 230 * @todo: use hash table 235 231 * … … 238 234 { 239 235 link_t *item; 236 237 assert(fibril_mutex_is_locked(&devices_list_mutex)); 238 240 239 for (item = namespaces_list.next; item != &namespaces_list; item = item->next) { 241 240 devmap_namespace_t *namespace = … … 248 247 } 249 248 250 /** Find device with given name. 251 * 252 * The devices_list_mutex should be already held when 253 * calling this function. 254 * 255 */ 249 /** Find device with given name. */ 256 250 static devmap_device_t *devmap_device_find_name(const char *ns_name, 257 251 const char *name) 258 252 { 259 253 link_t *item; 254 255 assert(fibril_mutex_is_locked(&devices_list_mutex)); 256 260 257 for (item = devices_list.next; item != &devices_list; item = item->next) { 261 258 devmap_device_t *device = … … 271 268 /** Find device with given handle. 272 269 * 273 * The devices_list_mutex should be already held when274 * calling this function.275 *276 270 * @todo: use hash table 277 271 * … … 280 274 { 281 275 link_t *item; 276 277 assert(fibril_mutex_is_locked(&devices_list_mutex)); 278 282 279 for (item = devices_list.next; item != &devices_list; item = item->next) { 283 280 devmap_device_t *device = … … 290 287 } 291 288 292 /** Create a namespace (if not already present) 293 * 294 * The devices_list_mutex should be already held when 295 * calling this function. 296 * 297 */ 289 /** Create a namespace (if not already present). */ 298 290 static devmap_namespace_t *devmap_namespace_create(const char *ns_name) 299 291 { 300 devmap_namespace_t *namespace = devmap_namespace_find_name(ns_name); 292 devmap_namespace_t *namespace; 293 294 assert(fibril_mutex_is_locked(&devices_list_mutex)); 295 296 namespace = devmap_namespace_find_name(ns_name); 301 297 if (namespace != NULL) 302 298 return namespace; … … 323 319 } 324 320 325 /** Destroy a namespace (if it is no longer needed) 326 * 327 * The devices_list_mutex should be already held when 328 * calling this function. 329 * 330 */ 321 /** Destroy a namespace (if it is no longer needed). */ 331 322 static void devmap_namespace_destroy(devmap_namespace_t *namespace) 332 323 { 324 assert(fibril_mutex_is_locked(&devices_list_mutex)); 325 333 326 if (namespace->refcnt == 0) { 334 327 list_remove(&(namespace->namespaces)); … … 339 332 } 340 333 341 /** Increase namespace reference count by including device 342 * 343 * The devices_list_mutex should be already held when 344 * calling this function. 345 * 346 */ 334 /** Increase namespace reference count by including device. */ 347 335 static void devmap_namespace_addref(devmap_namespace_t *namespace, 348 336 devmap_device_t *device) 349 337 { 338 assert(fibril_mutex_is_locked(&devices_list_mutex)); 339 350 340 device->namespace = namespace; 351 341 namespace->refcnt++; 352 342 } 353 343 354 /** Decrease namespace reference count 355 * 356 * The devices_list_mutex should be already held when 357 * calling this function. 358 * 359 */ 344 /** Decrease namespace reference count. */ 360 345 static void devmap_namespace_delref(devmap_namespace_t *namespace) 361 346 { 347 assert(fibril_mutex_is_locked(&devices_list_mutex)); 348 362 349 namespace->refcnt--; 363 350 devmap_namespace_destroy(namespace); 364 351 } 365 352 366 /** Unregister device and free it 367 * 368 * The devices_list_mutex should be already held when 369 * calling this function. 370 * 371 */ 353 /** Unregister device and free it. */ 372 354 static void devmap_device_unregister_core(devmap_device_t *device) 373 355 { 356 assert(fibril_mutex_is_locked(&devices_list_mutex)); 357 374 358 devmap_namespace_delref(device->namespace); 375 359 list_remove(&(device->devices)); -
uspace/srv/fs/devfs/devfs_ops.c
ra3eeef45 r6eb794a 60 60 typedef struct { 61 61 devmap_handle_t handle; 62 int phone; 62 int phone; /**< When < 0, the structure is incomplete. */ 63 63 size_t refcount; 64 64 link_t link; 65 fibril_condvar_t cv; /**< Broadcast when completed. */ 65 66 } device_t; 66 67 … … 227 228 [DEVICES_KEY_HANDLE] = (unsigned long) node->handle 228 229 }; 229 230 link_t *lnk; 231 230 232 fibril_mutex_lock(&devices_mutex); 231 link_t *lnk = hash_table_find(&devices, key); 233 restart: 234 lnk = hash_table_find(&devices, key); 232 235 if (lnk == NULL) { 233 236 device_t *dev = (device_t *) malloc(sizeof(device_t)); … … 237 240 } 238 241 242 dev->handle = node->handle; 243 dev->phone = -1; /* mark as incomplete */ 244 dev->refcount = 1; 245 fibril_condvar_initialize(&dev->cv); 246 247 /* 248 * Insert the incomplete device structure so that other 249 * fibrils will not race with us when we drop the mutex 250 * below. 251 */ 252 hash_table_insert(&devices, key, &dev->link); 253 254 /* 255 * Drop the mutex to allow recursive devfs requests. 256 */ 257 fibril_mutex_unlock(&devices_mutex); 258 239 259 int phone = devmap_device_connect(node->handle, 0); 260 261 fibril_mutex_lock(&devices_mutex); 262 263 /* 264 * Notify possible waiters about this device structure 265 * being completed (or destroyed). 266 */ 267 fibril_condvar_broadcast(&dev->cv); 268 240 269 if (phone < 0) { 270 /* 271 * Connecting failed, need to remove the 272 * entry and free the device structure. 273 */ 274 hash_table_remove(&devices, key, DEVICES_KEYS); 241 275 fibril_mutex_unlock(&devices_mutex); 276 242 277 free(dev); 243 278 return ENOENT; 244 279 } 245 280 246 dev->handle = node->handle;281 /* Set the correct phone. */ 247 282 dev->phone = phone; 248 dev->refcount = 1;249 250 hash_table_insert(&devices, key, &dev->link);251 283 } else { 252 284 device_t *dev = hash_table_get_instance(lnk, device_t, link); 285 286 if (dev->phone < 0) { 287 /* 288 * Wait until the device structure is completed 289 * and start from the beginning as the device 290 * structure might have entirely disappeared 291 * while we were not holding the mutex in 292 * fibril_condvar_wait(). 293 */ 294 fibril_condvar_wait(&dev->cv, &devices_mutex); 295 goto restart; 296 } 297 253 298 dev->refcount++; 254 299 } … … 564 609 565 610 device_t *dev = hash_table_get_instance(lnk, device_t, link); 611 assert(dev->phone >= 0); 566 612 567 613 ipc_callid_t callid; … … 627 673 628 674 device_t *dev = hash_table_get_instance(lnk, device_t, link); 675 assert(dev->phone >= 0); 629 676 630 677 ipc_callid_t callid; … … 696 743 697 744 device_t *dev = hash_table_get_instance(lnk, device_t, link); 745 assert(dev->phone >= 0); 698 746 dev->refcount--; 699 747 … … 743 791 744 792 device_t *dev = hash_table_get_instance(lnk, device_t, link); 793 assert(dev->phone >= 0); 745 794 746 795 /* Make a request at the driver */ -
uspace/srv/net/tl/tcp/tcp.c
ra3eeef45 r6eb794a 2085 2085 if (!fibril) { 2086 2086 free(operation_timeout); 2087 return EPARTY; /* FIXME: use another EC */ 2088 } 2087 return ENOMEM; 2088 } 2089 2089 2090 // fibril_mutex_lock(&socket_data->operation.mutex); 2090 2091 /* Start the timeout fibril */ -
uspace/srv/vfs/vfs_lookup.c
ra3eeef45 r6eb794a 179 179 fibril_mutex_unlock(&plb_mutex); 180 180 181 if (( (int) rc < EOK) || (!result))181 if ((int) rc < EOK) 182 182 return (int) rc; 183 184 if (!result) 185 return EOK; 183 186 184 187 result->triplet.fs_handle = (fs_handle_t) rc;
Note:
See TracChangeset
for help on using the changeset viewer.