Subversion Repositories HelenOS

Rev

Rev 4537 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4537 Rev 4668
Line 176... Line 176...
176
/** Identifier of the incoming connection handled by the current fibril. */
176
/** Identifier of the incoming connection handled by the current fibril. */
177
fibril_local connection_t *FIBRIL_connection;
177
fibril_local connection_t *FIBRIL_connection;
178
 
178
 
179
static void default_client_connection(ipc_callid_t callid, ipc_call_t *call);
179
static void default_client_connection(ipc_callid_t callid, ipc_call_t *call);
180
static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call);
180
static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call);
181
static void default_pending(void);
-
 
182
 
181
 
183
/**
182
/**
184
 * Pointer to a fibril function that will be used to handle connections.
183
 * Pointer to a fibril function that will be used to handle connections.
185
 */
184
 */
186
static async_client_conn_t client_connection = default_client_connection;
185
static async_client_conn_t client_connection = default_client_connection;
Line 189... Line 188...
189
 * Pointer to a fibril function that will be used to handle interrupt
188
 * Pointer to a fibril function that will be used to handle interrupt
190
 * notifications.
189
 * notifications.
191
 */
190
 */
192
static async_client_conn_t interrupt_received = default_interrupt_received;
191
static async_client_conn_t interrupt_received = default_interrupt_received;
193
 
192
 
194
/**
-
 
195
 * Pointer to a fibril function that will be used to handle pending
-
 
196
 * operations.
-
 
197
 */
-
 
198
static async_pending_t pending = default_pending;
-
 
199
 
-
 
200
static hash_table_t conn_hash_table;
193
static hash_table_t conn_hash_table;
201
static LIST_INITIALIZE(timeout_list);
194
static LIST_INITIALIZE(timeout_list);
202
 
195
 
203
#define CONN_HASH_TABLE_CHAINS  32
196
#define CONN_HASH_TABLE_CHAINS  32
204
 
197
 
Line 379... Line 372...
379
   
372
   
380
    futex_up(&async_futex);
373
    futex_up(&async_futex);
381
    return true;
374
    return true;
382
}
375
}
383
 
376
 
384
/** Pending fibril.
-
 
385
 *
-
 
386
 * After each call the pending operations are executed in a separate
-
 
387
 * fibril. The function pending() is c.
-
 
388
 *
-
 
389
 * @param arg Unused.
-
 
390
 *
-
 
391
 * @return Always zero.
-
 
392
 *
-
 
393
 */
-
 
394
static int pending_fibril(void *arg)
-
 
395
{
-
 
396
    pending();
-
 
397
   
-
 
398
    return 0;
-
 
399
}
-
 
400
 
-
 
401
/** Process pending actions.
-
 
402
 *
-
 
403
 * A new fibril is created which would process the pending operations.
-
 
404
 *
-
 
405
 * @return False if an error occured.
-
 
406
 *         True if the execution was passed to the pending fibril.
-
 
407
 *
-
 
408
 */
-
 
409
static bool process_pending(void)
-
 
410
{
-
 
411
    futex_down(&async_futex);
-
 
412
   
-
 
413
    fid_t fid = fibril_create(pending_fibril, NULL);
-
 
414
    fibril_add_ready(fid);
-
 
415
   
-
 
416
    futex_up(&async_futex);
-
 
417
    return true;
-
 
418
}
-
 
419
 
-
 
420
/** Return new incoming message for the current (fibril-local) connection.
377
/** Return new incoming message for the current (fibril-local) connection.
421
 *
378
 *
422
 * @param call  Storage where the incoming call data will be stored.
379
 * @param call  Storage where the incoming call data will be stored.
423
 * @param usecs Timeout in microseconds. Zero denotes no timeout.
380
 * @param usecs Timeout in microseconds. Zero denotes no timeout.
424
 *
381
 *
Line 511... Line 468...
511
 */
468
 */
512
static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call)
469
static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call)
513
{
470
{
514
}
471
}
515
 
472
 
516
/** Default fibril function that gets called to handle pending operations.
-
 
517
 *
-
 
518
 * This function is defined as a weak symbol - to be redefined in user code.
-
 
519
 *
-
 
520
 */
-
 
521
static void default_pending(void)
-
 
522
{
-
 
523
}
-
 
524
 
-
 
525
/** Wrapper for client connection fibril.
473
/** Wrapper for client connection fibril.
526
 *
474
 *
527
 * When a new connection arrives, a fibril with this implementing function is
475
 * When a new connection arrives, a fibril with this implementing function is
528
 * created. It calls client_connection() and does the final cleanup.
476
 * created. It calls client_connection() and does the final cleanup.
529
 *
477
 *
Line 658... Line 606...
658
    /* Unknown call from unknown phone - hang it up */
606
    /* Unknown call from unknown phone - hang it up */
659
    ipc_answer_0(callid, EHANGUP);
607
    ipc_answer_0(callid, EHANGUP);
660
    return;
608
    return;
661
   
609
   
662
out:
610
out:
663
    process_pending();
611
    ;
664
}
612
}
665
 
613
 
666
/** Fire all timeouts that expired. */
614
/** Fire all timeouts that expired. */
667
static void handle_expired_timeouts(void)
615
static void handle_expired_timeouts(void)
668
{
616
{
Line 788... Line 736...
788
 
736
 
789
/** Initialize the async framework.
737
/** Initialize the async framework.
790
 *
738
 *
791
 * @return Zero on success or an error code.
739
 * @return Zero on success or an error code.
792
 */
740
 */
793
int _async_init(void)
741
int __async_init(void)
794
{
742
{
795
    if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_CHAINS, 1,
743
    if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_CHAINS, 1,
796
        &conn_hash_table_ops)) {
744
        &conn_hash_table_ops)) {
797
        printf("%s: cannot create hash table\n", "async");
745
        printf("%s: cannot create hash table\n", "async");
798
        return ENOMEM;
746
        return ENOMEM;
Line 1047... Line 995...
1047
void async_set_interrupt_received(async_client_conn_t intr)
995
void async_set_interrupt_received(async_client_conn_t intr)
1048
{
996
{
1049
    interrupt_received = intr;
997
    interrupt_received = intr;
1050
}
998
}
1051
 
999
 
1052
/** Setter for pending function pointer.
-
 
1053
 *
-
 
1054
 * @param pend Function that will implement a new pending
-
 
1055
 *             operations fibril.
-
 
1056
 */
-
 
1057
void async_set_pending(async_pending_t pend)
-
 
1058
{
-
 
1059
    pending = pend;
-
 
1060
}
-
 
1061
 
-
 
1062
/** Pseudo-synchronous message sending - fast version.
1000
/** Pseudo-synchronous message sending - fast version.
1063
 *
1001
 *
1064
 * Send message asynchronously and return only after the reply arrives.
1002
 * Send message asynchronously and return only after the reply arrives.
1065
 *
1003
 *
1066
 * This function can only transfer 4 register payload arguments. For
1004
 * This function can only transfer 4 register payload arguments. For