* Local functions (prototypes)
*/
-static int HgfsKReqZCtor(void *mem, int size, void *arg, int flags);
-static void HgfsKReqZDtor(void *mem, int size, void *arg);
-static int HgfsKReqZInit(void *mem, int size, int flags);
-static void HgfsKReqZFini(void *mem, int size);
+ static int HgfsKReqZCtor(void *mem, int size, void *arg, int flags);
+ static void HgfsKReqZDtor(void *mem, int size, void *arg);
+ static int HgfsKReqZInit(void *mem, int size, int flags);
+ static void HgfsKReqZFini(void *mem, int size);
/*
* Global functions (definitions)
HgfsKReqObject *req = (HgfsKReqObject *)mem;
ASSERT(size == sizeof *req);
- /* Zero out the object. */
+ /*
+ * Zero out the object. (Do NOT pass UMA_ZEROINIT to uma_zcreate, as
+ * that will override this routine and zero everything -after- us.)
+ */
bzero(req, sizeof *req);
/*
/* Clear packet of request before allocating to clients. */
bzero(&req->__rpc_packet, sizeof req->__rpc_packet);
+ bcopy(HGFS_SYNC_REQREP_CLIENT_CMD, req->__rpc_packet._command,
+ HGFS_SYNC_REQREP_CLIENT_CMD_LEN);
return 0;
}
/* Initialize state & reference count. */
req->state = HGFS_REQ_ALLOCATED;
req->refcnt = 1;
+
+ ASSERT(!strncmp(req->__rpc_packet._command, HGFS_SYNC_REQREP_CLIENT_CMD, HGFS_SYNC_REQREP_CLIENT_CMD_LEN));
+
return 0;
}
#include "request.h"
#include "requestInt.h"
#include "os.h"
-#include "channel.h"
+
+#include "hgfsBd.h"
/*
* See requestInt.h.
*/
HgfsKReqWState hgfsKReqWorkerState;
-HgfsTransportChannel *gHgfsChannel;
/*
DblLnkLst_Links *currNode, *nextNode;
HgfsKReqWState *ws = (HgfsKReqWState *)arg;
HgfsKReqObject *req;
+ RpcOut *hgfsRpcOut = NULL;
+ char const *replyPacket;
int ret = 0;
ws->running = TRUE;
- gHgfsChannel = HgfsGetBdChannel();
-
for (;;) {
/*
* This loop spends most of its time sleeping until signalled by another
os_mutex_lock(hgfsKReqWorkItemLock);
while (!ws->exit && !DblLnkLst_IsLinked(&hgfsKReqWorkItemList)) {
- os_cv_wait(&hgfsKReqWorkItemCv, hgfsKReqWorkItemLock);
+ os_cv_wait(&hgfsKReqWorkItemCv, hgfsKReqWorkItemLock);
}
if (ws->exit) {
os_mutex_lock(req->stateLock);
switch (req->state) {
case HGFS_REQ_SUBMITTED:
- if (gHgfsChannel->status != HGFS_CHANNEL_CONNECTED) {
- if (!gHgfsChannel->ops.open(gHgfsChannel)) {
- req->state = HGFS_REQ_ERROR;
- os_cv_signal(&req->stateCv);
- os_mutex_unlock(req->stateLock);
- os_mutex_unlock(hgfsKReqWorkItemLock);
- goto done;
- }
+ if (!HgfsBd_OpenBackdoor(&hgfsRpcOut)) {
+ req->state = HGFS_REQ_ERROR;
+ os_cv_signal(&req->stateCv);
+ os_mutex_unlock(req->stateLock);
+ os_mutex_unlock(hgfsKReqWorkItemLock);
+ goto done;
}
break;
case HGFS_REQ_ABANDONED:
*/
os_mutex_unlock(hgfsKReqWorkItemLock);
- ret = gHgfsChannel->ops.send(gHgfsChannel, req);
+ ret = HgfsBd_Dispatch(hgfsRpcOut, req->payload, &req->payloadSize,
+ &replyPacket);
+
+ /*
+ * We have a response. (Maybe.) Re-lock the request, update its state,
+ * etc.
+ */
+
+ os_mutex_lock(req->stateLock);
+
+ if ((ret == 0) && (req->state == HGFS_REQ_SUBMITTED)) {
+ bcopy(replyPacket, req->payload, req->payloadSize);
+ req->state = HGFS_REQ_COMPLETED;
+ } else {
+ req->state = HGFS_REQ_ERROR;
+ }
+
+ os_cv_signal(&req->stateCv);
+ os_mutex_unlock(req->stateLock);
if (ret != 0) {
/*
* now. We do this because subsequent requests deserve a chance to
* reopen it.
*/
- gHgfsChannel->ops.close(gHgfsChannel);
+ HgfsBd_CloseBackdoor(&hgfsRpcOut);
}
done:
ws->running = FALSE;
- gHgfsChannel->ops.close(gHgfsChannel);
+ if (hgfsRpcOut != NULL ) {
+ HgfsBd_CloseBackdoor(&hgfsRpcOut);
+ }
+
os_thread_exit(0);
}