Subversion Repositories HelenOS

Rev

Rev 2944 | Rev 2951 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2944 Rev 2945
Line 72... Line 72...
72
static futex_t unused_futex = FUTEX_INITIALIZER;
72
static futex_t unused_futex = FUTEX_INITIALIZER;
73
 
73
 
74
/** List of unused structures. */
74
/** List of unused structures. */
75
static LIST_INITIALIZE(unused_head);
75
static LIST_INITIALIZE(unused_head);
76
 
76
 
-
 
77
/** Futex protecting the up_hash and ui_hash.
-
 
78
 *
-
 
79
 * The locking strategy assumes that there will be at most one fibril for each
-
 
80
 * dev_handle.  Therefore it will be sufficient to hold the futex for shorter
-
 
81
 * times (i.e. only during hash table operations as opposed to holding it the
-
 
82
 * whole time between an unsuccessful find and the following insert). Should the
-
 
83
 * assumption break, the locking strategy for this futex will have to be
-
 
84
 * reconsidered.
-
 
85
 */
-
 
86
static futex_t used_futex = FUTEX_INITIALIZER;
-
 
87
 
77
/**
88
/**
78
 * Global hash table of all used fat_idx_t structures.
89
 * Global hash table of all used fat_idx_t structures.
79
 * The index structures are hashed by the dev_handle, parent node's first
90
 * The index structures are hashed by the dev_handle, parent node's first
80
 * cluster and index within the parent directory.
91
 * cluster and index within the parent directory.
81
 */
92
 */
Line 337... Line 348...
337
        [UPH_DH_KEY] = dev_handle,
348
        [UPH_DH_KEY] = dev_handle,
338
        [UPH_PFC_KEY] = pfc,
349
        [UPH_PFC_KEY] = pfc,
339
        [UPH_PDI_KEY] = pdi,
350
        [UPH_PDI_KEY] = pdi,
340
    };
351
    };
341
 
352
 
-
 
353
    futex_down(&used_futex);
342
    l = hash_table_find(&up_hash, pkey);
354
    l = hash_table_find(&up_hash, pkey);
-
 
355
    futex_up(&used_futex);
343
    if (l) {
356
    if (l) {
344
        fidx = hash_table_get_instance(l, fat_idx_t, uph_link);
357
        fidx = hash_table_get_instance(l, fat_idx_t, uph_link);
345
    } else {
358
    } else {
346
        fidx = (fat_idx_t *) malloc(sizeof(fat_idx_t));
359
        fidx = (fat_idx_t *) malloc(sizeof(fat_idx_t));
347
        if (!fidx) {
360
        if (!fidx) {
Line 362... Line 375...
362
        fidx->dev_handle = dev_handle;
375
        fidx->dev_handle = dev_handle;
363
        fidx->pfc = pfc;
376
        fidx->pfc = pfc;
364
        fidx->pdi = pdi;
377
        fidx->pdi = pdi;
365
        fidx->nodep = NULL;
378
        fidx->nodep = NULL;
366
 
379
 
-
 
380
        futex_down(&used_futex);
367
        hash_table_insert(&up_hash, pkey, &fidx->uph_link);
381
        hash_table_insert(&up_hash, pkey, &fidx->uph_link);
368
        hash_table_insert(&ui_hash, ikey, &fidx->uih_link);
382
        hash_table_insert(&ui_hash, ikey, &fidx->uih_link);
-
 
383
        futex_up(&used_futex);
369
    }
384
    }
370
 
385
 
371
    return fidx;
386
    return fidx;
372
}
387
}
373
 
388
 
Line 379... Line 394...
379
    unsigned long ikey[] = {
394
    unsigned long ikey[] = {
380
        [UIH_DH_KEY] = dev_handle,
395
        [UIH_DH_KEY] = dev_handle,
381
        [UIH_INDEX_KEY] = index,
396
        [UIH_INDEX_KEY] = index,
382
    };
397
    };
383
 
398
 
-
 
399
    futex_down(&used_futex);
384
    l = hash_table_find(&ui_hash, ikey);
400
    l = hash_table_find(&ui_hash, ikey);
-
 
401
    futex_up(&used_futex);
385
    if (l) {
402
    if (l) {
386
        fidx = hash_table_get_instance(l, fat_idx_t, uih_link);
403
        fidx = hash_table_get_instance(l, fat_idx_t, uih_link);
387
    }
404
    }
388
 
405
 
389
    return fidx;
406
    return fidx;